返回

云遮雾绕之后见蔚蓝——ResizeObserver 的使用

前端

利用 ResizeObserver 巧妙追踪元素尺寸变化

在构建交互式和响应式 web 应用时,监控元素尺寸的变化至关重要。传统上,我们依靠 window.resize 事件来跟踪窗口大小的变化。然而,对于需要监视特定元素尺寸的场景,引入了更有效且强大的解决方案——ResizeObserver

何为 ResizeObserver?

ResizeObserver 是一种全新的 Web API,专为监听元素尺寸的变化而设计。与只能监视窗口大小变化的 window.resize 事件不同,ResizeObserver 可监控任何可见元素的尺寸变化,为我们提供了细粒度的控制。

工作原理

ResizeObserver 巧妙地利用了 MutationObserver,这是另一个浏览器 API,用于监视 DOM 更改。当元素尺寸发生变化时,MutationObserver 会触发一个事件,而 ResizeObserver 敏锐地捕获该事件并执行指定的回调函数。

应用场景

ResizeObserver 在各种场景中大显身手,包括:

  • 响应式布局: 根据浏览器窗口大小调整元素布局。
  • 懒加载: 当元素进入视口时加载其内容。
  • 无限滚动: 当滚动条到达页面底部时加载更多内容。
  • 视差滚动: 在滚动条滚动时改变元素的位置或透明度。

使用限制

尽管 ResizeObserver 功能强大,但也有其局限性:

  • 只能监视元素尺寸的变化,无法跟踪其他类型的更改,例如内容更改。
  • 仅能监视可见元素,隐藏元素不在其管辖范围内。
  • 某些浏览器可能不支持 ResizeObserver,例如 Internet Explorer 11 和 Safari 10。

上手指南

使用 ResizeObserver 非常简单,只需遵循以下步骤:

  1. 创建 ResizeObserver 实例:
    const resizeObserver = new ResizeObserver(entries => { ... });
    
  2. 观察元素:
    resizeObserver.observe(document.querySelector('.element'));
    
  3. 处理尺寸变化事件:
    const entries => {
      const element = entry.target;
      const width = element.offsetWidth;
      const height = element.offsetHeight;
    
      console.log(`Element ${element} has a width of ${width} and a height of ${height}.`);
    }
    

示例

以下代码示例演示了如何使用 ResizeObserver 监视元素尺寸的变化:

const resizeObserver = new ResizeObserver(entries => {
  for (const entry of entries) {
    const element = entry.target;
    const width = element.offsetWidth;
    const height = element.offsetHeight;

    console.log(`Element ${element} has a width of ${width} and a height of ${height}.`);
  }
});

resizeObserver.observe(document.querySelector('.element'));

结论

ResizeObserver 是一个极具价值的 API,为 Web 开发人员提供了精确监视元素尺寸变化的强大工具。其高效、灵活性和易用性使其成为构建响应式、动态应用程序的理想选择。

常见问题解答

1. ResizeObserver 与 window.resize 事件有何不同?

ResizeObserver 可以监视任何元素的尺寸变化,而 window.resize 事件只能监视窗口大小的变化。

2. ResizeObserver 能否监视隐藏元素的尺寸变化?

否,ResizeObserver 只能监视可见元素的尺寸变化。

3. ResizeObserver 是否在所有浏览器中都可用?

大多数现代浏览器都支持 ResizeObserver,但较旧的浏览器(如 Internet Explorer 11 和 Safari 10)可能不支持。

4. ResizeObserver 的回调函数会被频繁触发吗?

是的,ResizeObserver 的回调函数在元素尺寸发生任何变化时都会被触发,即使变化很小。

5. 如何优化 ResizeObserver 性能?

避免在频繁变化的元素上使用 ResizeObserver,并使用节流技术来限制回调函数的触发频率。