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 ...
随机推荐
- css3 动画插件Animate.css
官网:https://animate.style/ GitHub:https://github.com/daneden/animate.css
- Java 中的一些知识点
Java 中的一些知识点 Java 中的知识点 与C++相关 toString方法 super 与C++相关[了解的不是很多] 在Java程序中:一个方法以 ; 结尾,并且修饰符列表中有 native ...
- 英伟达又向开源迈了一步「GitHub 热点速览」
大家是否还记得 2012 年,Linux 之父 Linus Torvalds 在一次活动中"愤怒"地表达了对英伟达闭源 Linux GPU 驱动的不满?这个场景曾是热门表情包,程序 ...
- SpringTask
SpringTask是spring提供的一个任务调度工具,按照约定的时间自动执行代码逻辑 定时任务框架,即定时自动执行某段代码 应用场景:信用卡每月还款提醒,火车售票系统处理未支付订单 cron表达式 ...
- RPA京麦咚咚批量发送消息
京麦咚咚发送消息,首先我们需要确定给谁发,发送什么内容 给谁发:可以传入京东用户名.京东订单号.咚咚将通过此条件进行搜索进入会话框 发送什么内容:批量发送信息给不同的用户,比如给不同的订单用户发送其相 ...
- 初看vue3源码
因为工作的原因又回到了vue的领域,需要加深对vue和vue生态的了解 也许平时比较多人手机看别人解析怎么看vue源码的,自己动手看vue源码的还是比较少,这次我想自己动手看看 首先 吧代码获取到本地 ...
- 06 定时器和PWM(1)
前言 前面介绍了一下外部中断,这一节主要介绍一下内部定时器和PWM,这两个知识还是比较重要的. 一.定时器 1.什么是定时器 定时器其实和计数器一样,我们通过设置一个值,当计数器运行一个计数寄存器向上 ...
- 【JS】03 BOM 浏览器对象模型
BOM :Broswer Object Model 浏览器对象模型 核心对象是window对象,window对象又可以操作以下的常见对象: - frames[] 窗口对象数组? 浏览器可以打开多个窗口 ...
- 【JDBC】Extra02 SqlServer-JDBC
官网驱动获取地址: https://www.microsoft.com/zh-cn/download/details.aspx Maven仓库获取: https://mvnrepository.com ...
- OSS简单文件上传和本地存储上传
网站的文件上传方法 本地存储上传 // 本地存储方式 MultipartFile接受文件 @PostMapping("/save") public Result save(Stri ...