场景是这样的,之前的共事做了一个侧边栏,监听屏幕宽度显示不同的状态。

第一种状况:屏幕宽度足够时,侧边栏齐全开展,

第二种状况:达到肯定宽度时,缩起一点,只留下侧边栏中图标的局部。

如果再变窄,就间接暗藏侧边栏。

按理说,这是十分“智能”的侧边栏了,然而他的实现形式让我当初很头疼。

先说下他怎么实现的,第一种状态下,给父级一个openSiderbar类,width写死

第二种状态下,给父级换hideSidebar类,width写死

第三种状态下,给父级减少mobile类,transform挪动,从视觉上看不到菜单。

当初说下问题:右侧是canvas画布,我也要去兼容屏幕宽度,然而基于当初的侧边栏实现形式,没法间接对侧边栏addEventListener resize


终于让我找到一个好办法了——MutationObserver

MutationObserver 接口提供了监督对 DOM 树所做更改的能力。它代替了旧的Mutation Events(DOM3 Events 标准)。

我只有给侧边栏app-wrapper绑定一个MutationObserver,判断如果批改的是类名属性,则触发resize办法。

具体代码如下:

// 这里没有应用addEventListener resize,是因为侧边栏的实现形式是依据类名transform挪动的。const targetNode = document.getElementsByClassName('app-wrapper')[0]// 观察器的配置(须要察看什么变动)// 还有其它可监听的属性,查阅:https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver/observeconst config = { attributes: true }// 当察看到变动时执行的回调函数const t = thisconst callback = function(mutationsList, observer) {        for (const mutation of mutationsList) {          if (mutation.type === 'attributes' && mutation.attributeName === 'class') {            // 提早是为了期待侧边栏动画之后再计算            setTimeout(() => {              t.onResize()            }, 250)          }        }}// 创立一个观察器实例并传入回调函数this.observer = new MutationObserver(callback)// 以上述配置开始察看指标节点this.observer.observe(targetNode, config)

PS:记得在beforeDestroy时this.observer.disconnect()