resize-observer-polyfill

638 阅读2分钟

ResizeObserver

浏览器提供的一个JavaScript Api,可以同时监视一个或多个dom元素,以便在元素的大小或形状发生变化时触发回调函数。

目前来看还是一个实验性的api,在兼容性方面较差,所以如果你对较低版本的浏览器需要兼容,则不用考虑使用该api。如果你要在ie上展示,则完全不用考虑,完全不兼容ie。

总的来说,这个api,目前并不是监听dom的最优选择

onresize

onresize 事件会在窗口或框架被调整大小时发生。

局限性很大,对于窗口或者框架大小未被调整,但是页面内容却发生变化的情况,无能为力。

例如:侧边栏的收缩和展开会导致内容展示区宽度的改变,此时内容区的dom就无法监听并做出对应的变化

matchMedia

同样是对窗口或框架被调整大小时发生,不同于onresize在于只在某些特殊的节点会触发。

如果不希望每次 window 大小变化时通知我们 ,而只希望屏幕在大于或小于某个特定的大小时通知我们即可。这种场景下使用 matchMedia 会比监听 window.resize 要性能更高。

例如:matchMedia('(max-width: 600px)')

resize-observer-polyfill

如果你想获得ResizeObserver的能力,但是又因为兼容性的问题,那么resize-observer-polyfill应该就是你的最佳选择。各大框架均在使用,本身是一个polyfill,可以在不兼容ResizeObserver的浏览器上使用。

在这提供一个案例:

import ResizeObserver from 'resize-observer-polyfill';

/**
 * 初始化监听对象
 */
const resizeOb = new ResizeObserver(function(entries) {
    for(let entry of entries) {
        const listeners = entry.target.__resizeListeners__;

        if(listeners) {
            (listeners || []).forEach(fn => {
                fn(entry);
            });
        } else {
            resizeOb.unobserve(listeners.target);
        }
    }
});

export default resizeOb;
let $el = this.$refs.projectSelect;
$el.__resizeListeners__ = [
    entry => {
        this.initPage(entry.target.querySelectorAll(className)[0],entry.target);
    }
];
resizeOb.observe($el);