DOM – ResizeObserver
介绍
想监听一个 element 的 size changes 就可以使用 ResizeObserver 了.
在看这一篇之前, 建议先看看 DOM & BOM – IntersectionObserver, 它们的模式很像, 一起了解会比较容易.
效果

参考:
Youtube – Learn Resize Observer In 5 Minutes
场景
<body>
<button class="button">resize</button>
<div class="box">resize me</div>
</body>
CSS Style
.box {
margin-top: 3rem;
width: 100px;
height: 100px;
background-color: pink;
border: 2px solid red;
padding: 1rem;
}
new ResizeObserver()
const rs = new ResizeObserver((entries) => {
console.log("entry", entries[0]);
});
rs.observe(document.querySelector(".box"));
document.querySelector(".button").addEventListener("click", () => {
document.querySelector(".box").style.width = "400px";
});
调用, observe, unobserve 方式和 IntersectionObserver 是一样的.
new 实例 > observe > 当观察的元素 resize 就会触发回调. 不想观察了就 unobserve。
Callback Info
绿点是常用到的, 其它的就不介绍了

borderBoxSize, 它是 array 哦, 但我不知道什么时候会超过 1 个啦.
blockSize 就是 height, inlineSize 就是 width. 这个是 Logical Properties 的写法.
ContentBoxSize, 顾名思义它就是依据 box-sizing: content-box 的计算方式 (width 不包含 padding 和 border).
contentRect: 它的 width 和 height 是扣除了 padding, border 的, 至于 rect, 它并不是 boundingClientRect 哦, 具体是什么坐标我也没去研究, 以后有需求在来补上呗.

触发时机
ResizeObserver 会在 ui render 后触发,据说是在 layout 之后 paint 之前。
window.setTimeout(() => {
const h1 = document.querySelector('h1')!;
h1.classList.add('showing');
const io = new ResizeObserver(() => {
console.log('ResizeObserver', performance.now()); // 2, 1088.0999999940395
h1.classList.add('showed');
});
io.observe(h1);
requestAnimationFrame(() => {
console.log('first requestAnimationFrame', performance.now()); // 1, 1083.7999999970198
requestAnimationFrame(() => {
console.log('second requestAnimationFrame', performance.now()); // 3, 1094.0999999940395
});
});
}, 1000);
第一次 requestAnimationFrame 触发在 ui render 之前
第二次 requestAnimationFrame 触发在 ui render 之后
ResizeObserver 在第一次 rAF 和第二次 rAF 中间触发。(注:ResizeObserver 和 IntersectionObserver 一样,observe 后会触发第一次)
另外一点,改了又改回去是不会触发 ResizeObserver 的
const box = document.querySelector(".box");
const ro = new ResizeObserver(() => console.log("resize"));
ro.observe(box);
window.setTimeout(() => {
// 修改 dimension
box.style.width = '100px';
box.style.height = '100px';
// 读取 dimension,这里会导致游览器提前 reflow
console.log(box.offsetWidth); // 100
// 修改回去
box.style.width = 'auto';
box.style.height = 'auto';
}, 2000);
ResizeObserver 不会触发,即便中间有一个 reflow 也不会。
DOM – ResizeObserver的更多相关文章
- js实时监听dom尺寸变化
开发过程中总会遇到dom节点尺寸变化,去做一些相应的逻辑,第一想到的应该是用$(window).resize()去做,但是这个是监听浏览器窗口的所以这个时候要用 ResizeObserver Resi ...
- ResizeObserver - 元素resize监听API
Motivation 响应式网站/Web应用程序 根据视口大小调整内容展示方式.这通常通过CSS和media查询来完成.当CSS表现不好我们会使用Javascript. 比如document.addE ...
- ResizeObserver - 元素resize监听API ResizeObserver
Motivation 响应式网站/Web应用程序 根据视口大小调整内容展示方式.这通常通过CSS和media查询来完成.当CSS表现不好我们会使用Javascript. 比如document.addE ...
- 关于DOM的操作以及性能优化问题-重绘重排
写在前面: 大家都知道DOM的操作很昂贵. 然后贵在什么地方呢? 一.访问DOM元素 二.修改DOM引起的重绘重排 一.访问DOM 像书上的比喻:把DOM和JavaScript(这里指ECMScri ...
- 读书笔记:JavaScript DOM 编程艺术(第二版)
读完还是能学到很多的基础知识,这里记录下,方便回顾与及时查阅. 内容也有自己的一些补充. JavaScript DOM 编程艺术(第二版) 1.JavaScript简史 JavaScript由Nets ...
- 页面嵌入dom与被嵌入iframe的攻防
1.情景一:自己的页面被引入(嵌入)至别人的页面iframe中 if(window.self != window.top){ //url是自己页面的url window.top.location.hr ...
- 通俗易懂的来讲讲DOM
DOM是所有前端开发每天打交道的东西,但是随着jQuery等库的出现,大大简化了DOM操作,导致大家慢慢的“遗忘”了它的本来面貌.不过,要想深入学习前端知识,对DOM的了解是不可或缺的,所以本文力图系 ...
- HTML DOM 介绍
本篇主要介绍DOM内容.DOM 节点.节点属性以及获取HTML元素的方法. 目录 1. 介绍 DOM:介绍DOM,以及对DOM分类和功能的说明. 2. DOM 节点:介绍DOM节点分类和节点层次. 3 ...
- HTML DOM 对象
本篇主要介绍HTML DOM 对象:Document.Element.Attr.Event等4个对象. 目录 1. Document 对象:表示文档树的根节点,大部分属性和方法都是对元素进行操作. 2 ...
- 重撸js_2_基础dom操作
1.node 方法 返回 含义 nodeName String 获取节点名称 nodeType Number 获取节点类型 nodeValue String 节点的值(注意:文本也是节点) 2.inn ...
随机推荐
- Django+forms+html
在Django中,Form类通常通过继承django.forms.Form或django.forms.ModelForm来定义.当你定义一个表单类时,通常使用Form或ModelForm类,并使用各种 ...
- [oeasy]python049_帮助手册_pydoc_manual_document
帮助手册 回忆上次内容 上次了解了注释 注释是为了让程序更可读 注释不会影响程序运行速度 注释分为两种 单行的 以#开头 不能是字符串当中的# 多行的 三个" 三个' 多行注 ...
- oeasy教您玩转vim - 55 - # 参数替换
[Github地址] (https://github.com/overmind1980/oeasyvim) [Gitee地址] (overmind1980/oeasyvim) [蓝桥实验楼 邀请码 ...
- 数组的创建-数组-C
数组内存是连续的 数组是一个整体,它的内存是连续的:也就是说,数组元素之间是相互挨着的,彼此之间没有一点点缝隙.下图演示了int a[4];在内存中的存储情形: 「数组内存是连续的」这一点很重要,所以 ...
- c++17 using继承所有构造函数
//使用using继承所有的构造函数 #include "tmp.h" #include <iostream> using namespace std; struct ...
- JSR303统一校验使用
JSR303也称为bean validation,定义了一套bean验证规范.通过注解的方式关联属性与规则 使用方式 1.引入依赖 <dependency> <groupId> ...
- 火山引擎VeDI数据技术分享:两个步骤,为Parquet降本提效
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 作者:王恩策.徐庆 火山引擎 LAS 团队 火山引擎数智平台 VeDI 是火山引擎推出的新一代企业数据智能平台,基 ...
- 【ElasticSearch】02 查询操作
准备样本: Elasticsearch 提供了基于 JSON 提供完整的查询 DSL 来定义查询 查询条件还适用于删除操作 创建索引: # PUT http://127.0.0.1:9200/st ...
- Http、Https简介和Session、token的请求流程
Http Http (超文本输出协议) 是一种分布式.协作式和超媒体信息系统的应用层协议,它通常运行在TCP之上,因特网应用最广泛的便是Http协议,所有www都遵循这个标准.主要用于Web 浏览器与 ...
- 外形最漂亮的人形机器人——通用机器人Apollo,设计为可以在任何任务和环境中与人类进行协作
视频地址: https://www.bilibili.com/video/BV11F4m1M7ph/