使用ResizeObserver监听dom的width、height

370 阅读1分钟

前言

最近在项目中遇到过这个一个问题,需要监听某个dom的width 或者 height变化,单这个dom的width height发生改变时候。某个dom的样式可能需要改变。

  • 这个问题刚好可以使用 ResizeObserver 来实现完成

使用ResizeObserver

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>ResizeObserver Example</title>
  <style>
    #resizeMe {
      width: 200px;
      height: 150px;
      background-color: lightblue;
      resize: both;
      overflow: auto;
    }
    #changeStyle {
      width: 100px;
      height: 100px;
      background-color: lightcoral;
    }
  </style>
</head>
<body>
  <div id="resizeMe">Resize me</div>
  <div id="changeStyle">Change my style</div>

  <script>
    // 获取 DOM 元素
    const resizeMe = document.getElementById('resizeMe');
    const changeStyle = document.getElementById('changeStyle');

    // 创建 ResizeObserver 实例
    const resizeObserver = new ResizeObserver(entries => {
      for (let entry of entries) {
        const { width, height } = entry.contentRect;
        console.log(`Size: ${width}px x ${height}px`);

        // 根据 resizeMe 的尺寸改变 changeStyle 的样式
        changeStyle.style.width = `${width / 2}px`;
        changeStyle.style.height = `${height / 2}px`;
      }
    });

    // 观察 resizeMe 元素
    resizeObserver.observe(resizeMe);
  </script>
</body>
</html>

浏览器兼容性

ResizeObserver 是一个现代的 Web API,支持情况如下

  • Chrome: 64+
  • Edge: 79+
  • Firefox: 69+
  • Safari: 13.1+
  • Opera: 51+

对于不支持 ResizeObserver 的浏览器,可以考虑使用 MutationObserver 或者第三方库(如 resize-observer-polyfill)作为替代方案

使用 resize-observer-polyfill

如果需要兼容较旧的浏览器,可以使用 resize-observer-polyfill

npm install resize-observer-polyfill
import ResizeObserver from 'resize-observer-polyfill';
// 剩下的代码和上面示例中的相同