resize-observer-polyfill源码分析
1、ResizeObserver类实现 2、ResizeObservation类实现 3、ResizeObserverSPI 类 4、ResizeObserverEntry类 5、ResizeObserverController类 ### resize-observer-polyfill源码分析 #### 1. ResizeObserver 类实现 `ResizeObserver` 类是 `resize-observer-polyfill` 的核心部分之一,它的主要职责是提供一个接口,让开发者能够通过该接口注册一个回调函数,用于监控 HTML 元素或 SVG 元素的尺寸变化。 - **构造函数**: - `constructor(callback)`:构造函数接受一个回调函数作为参数,并负责创建一个 `ResizeObserverSPI` 实例,这个实例将真正地处理元素大小的变化。回调函数会在元素大小发生变化时被调用。 - 在构造函数内部,首先检查浏览器是否支持 `WeakMap`,如果支持则使用 `WeakMap` 来存储观察者实例,否则使用 `Map`。这是因为 `WeakMap` 可以自动释放不再使用的资源,避免内存泄漏问题。 - **公共方法**: - `observe(element[, options])`:用于开始观察指定的 `Element` 或 `SVGElement` 的尺寸变化。可以接受一个可选的配置参数,用于指定以哪种盒子模型(如 `content-box`、`border-box` 或 `device-pixel-content-box`)来观察变动,默认值为 `content-box`。 - `unobserve(element)`:用于停止观察指定的 `Element` 或 `SVGElement` 的尺寸变化。 - `disconnect()`:用于取消并结束目标对象上所有对 `Element` 或 `SVGElement` 的观察。 #### 2. ResizeObservation 类实现 `ResizeObservation` 类负责处理每个被观察元素的具体变化情况,包括尺寸的变化等信息。 - **构造函数**: - `ResizeObservation(targetNode, callback, controller)`:构造函数接受三个参数:`targetNode`(要观察的元素)、`callback`(回调函数)以及 `controller`(控制器实例)。这些参数在创建 `ResizeObservation` 实例时会被用到。 - **成员函数**: - `getContentRect()`:返回元素的当前尺寸信息,这些信息将被用来构建 `ResizeObserverEntry` 对象。 - `getHTMLElementContentRect()`:针对 `HTMLElement` 的具体实现。 - `getSVGContentRect()`:针对 `SVGElement` 的具体实现。 - `getPaddings()`:获取元素的内边距。 - `getBordersSize()`:获取元素的边框大小。 - `createRectInit()`:根据元素的尺寸和其他属性构建一个 `DOMRectInit` 对象,以便用于创建 `ResizeObserverEntry`。 #### 3. ResizeObserverSPI 类 `ResizeObserverSPI` 类实现了具体的观察逻辑,它与 `ResizeObserverController` 一起工作,处理元素大小的变化。 - **构造函数**: - `ResizeObserverSPI(callback, controller, self)`:构造函数接受三个参数:`callback`(回调函数)、`controller`(控制器实例)以及 `self`(`ResizeObserver` 实例本身)。 - **成员函数**: - `observe(targetNode, boxOptions)`:实现观察逻辑。 - `unobserve(targetNode)`:停止观察指定的元素。 - `disconnect()`:取消所有观察。 #### 4. ResizeObserverEntry 类 `ResizeObserverEntry` 类负责封装每个被观察元素的尺寸变化信息。 - **构造函数**: - `ResizeObserverEntry(target, contentRect)`:构造函数接受两个参数:`target`(被观察的元素)和 `contentRect`(元素的新尺寸)。 - **成员函数**: - `createReadOnlyRect()`:创建一个只读的尺寸对象。 - `defineConfigurable()`:定义某些属性为可配置的。 #### 5. ResizeObserverController 类 `ResizeObserverController` 类是整个观察系统的控制器,负责协调各个 `ResizeObserver` 实例的工作。 - **构造函数**: - `ResizeObserverController()`:构造函数初始化内部数据结构,例如用于存储观察者的列表。 - **成员函数**: - `getInstance()`:静态方法,返回一个单例的控制器实例。 - `updateObservers_()`:更新所有观察者的状态,通常在元素尺寸变化时被调用。 - `connect_()`:连接到其他系统,如 `MutationObserver`,以监听布局的变化。 - `onTransitionEnd_()`:监听元素大小变化的回调函数。 `resize-observer-polyfill` 是一个强大的工具库,用于监测网页中元素的尺寸变化。通过这些类的协同工作,我们可以轻松地在 JavaScript 中实现复杂的布局调整逻辑,确保页面在各种设备和分辨率下都能呈现出良好的视觉效果。