js ResizeObserver API

时间:2024-11-19 08:06:19

一、ResizeObserver 是什么

ResizeObserver 是一个浏览器提供的 JavaScript API,用于监测一个元素的大小变化。它可以帮助开发者在元素的宽度或高度发生改变时执行某些操作,比如调整布局、重新渲染内容等。

二、Resize Observer和监听resize的区别及其优缺点

在 JavaScript 中,Resize Observer 和监听窗口的 resize 事件是用来处理元素大小变化的两种不同的方法。下面是它们的区别以及各自的优缺点:

Resize Observer
优点

  • 高效:只会在目标元素大小变化时触发回调,而不是每次窗口大小变化时都触发。
  • 精确:可以监测多个元素的变化,而不必依赖于全局的窗口大小事件。
  • 异步处理:可以在变更后立即获取新的尺寸,不会阻塞浏览器的渲染流程。

缺点

  • 浏览器支持:虽然现代浏览器都支持,但老旧的浏览器可能不兼容。
  • 复杂性:对于简单的场景使用起来可能显得有些复杂。

resize
优点

  • 简单易用:代码实现简单,适合基础的窗口变化监听。
  • 广泛兼容:支持所有主流浏览器,因为这是一个较早的 API。

缺点

  • 性能问题:当窗口调整大小时,可能会频繁触发,因为即使没有实际内容变化,事件也会被触发。
  • 不够精确:无法监测单个元素的大小变化,只能检测窗口的大小。
  • 处理延迟:可能需要使用节流(throttling)或防抖(debouncing)技术来提高性能,增加了实现复杂性。

总结
使用场景:如果你需要监测特定元素的大小变化,Resize Observer 是更好的选择。如果只是需要监测窗口大小变化,使用 resize 事件更为简单。
选择依据:基于项目需求和浏览器兼容性来决定使用哪种方法。对于性能要求高和需要精确控制的情况,Resize Observer 更合适;而对于基础的窗口调整监控,监听 resize 事件可能就足够了。
希望这些信息能帮助你理解 Resize Observer 和窗口 resize 事件的区别及各自的优缺点!

三、使用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
      #elem {
        width: 400px;
        height: 400px;
        background-color: green;
        resize: both;
        overflow: auto;
      }
    </style>
</head>
<body>
  <div id="elem">
    resize auto
  </div>

  <button onClick="handleToggleClick()">监听/取消监听</button>

  <script>
    /**
     * @type { ResizeObserver | null }
     */
    let observer = null;
    let isToggle = false;
    let elemDom = document.getElementById('elem');

    function observeElem() {
      observer = new ResizeObserver((entries) => {
        for (let entry of entries) {
          console.log(entry);
        }
      })
      if (observer !== null) observer.observe(elemDom); // 监听
    }

    function rmObserve() {
      if (observer) {
        observer.unobserve(elemDom); // 取消监听
      }
    }

    function handleToggleClick() {
      isToggle = !isToggle;
      if (isToggle) {
        return observeElem();
      }

      return rmObserve();
    }
  </script>
</body>
</html>

在这里插入图片描述