程序员的知识教程库

网站首页 > 教程分享 正文

回流和重绘(回流和重绘的区别)

henian88 2025-04-09 16:18:20 教程分享 20 ℃ 0 评论


浏览器解析HTML的过程

1、构建 frame, 以建立DOM树。


2、回流(reflow) 引起Dom树结构变化,改变页面布局。


3、重绘(repaint) 不会引起Dom树变化及页面布局变化,只重新渲染页面样式回流与重绘两者之间的联系在于: 触发回流一定会触发重绘, 而触发重绘却不一定会触发回流


我们可以把页面理解为一个黑板,黑板上有一朵画好的小花。现在我们要把这朵从左边(left)移到了右边(right),那我们是不是要先确定好右边的具体位置,画好形状(回流),再画上它原有的颜色(重绘)。


但如果我们仅仅是想换给花朵换一个颜色,那么只需擦掉花朵上的颜色,再重新涂上自己期望的颜色(重绘)就可以了。


1、回流(Reflow)

当Render Tree中部分或全部元素的尺寸,结构或者某些属性发生改变时,浏览器重新渲染部分或全部文档的过程


导致回流发生的一些因素:


浏览器窗口大小发生改变


元素字体大小变化


增加或者移除样式表


内容变化,比如用户在 input 框中输入文字, CSS3 动画,文字数量或者图片大小改变等


激活 CSS 伪类,比如 :hover


操作class属性


添加或删除可见的DOM元素


计算offsetWidth和offsetHeight属性


设置 style 属性的值


页面首次渲染


元素尺寸或者位置发生改变


一些常用且会导致回流的属性和方法:


clientWidth,clientHeight,clientTop,clientLeft
offsetWidth,offsetHeight,offsetTop,offsetLeft scrollWidth,scrollHeight,scrollTop,scrollLeft,scrollIntoView()

2、重绘(Repaint)

而重绘则是视觉效果变化引起的重新绘制。比如 color 或者 background 发生了变化,那就该给触发重绘的元素化化妆,化成它想要的样子。

3、性能影响

回流比重绘的代价要更高


有时仅仅回流一个单一的元素,它的父元素以及任何跟随它的元素也会产生回流


现代浏览器会对频繁的回流或重绘操作进行优化:


浏览器会维护一个队列,把所有引起回流和重绘的操作放入到队列中,如果队列中的任务数量或者时间间隔达到一个阈值,浏览器会将队列清空,进行一次批处理,这样可以把多次回流和重绘变成一次

4、如何避免回流和重绘

CSS:

1、避免使用table布局。


2、尽可能在DOM树的最末端改变class。


3、避免设置多层内联样式。


4、将动画效果应用到position属性为absolute或fixed的元素上。


5、避免使用CSS表达式(例如:calc())。


JavaScript:

1、避免频繁操作样式,最好一次性重写style属性,或者将样式列表定义为class并一次性更改class属性。


2、避免频繁操作DOM,创建一个documentFragment,在它上面应用所有DOM操作,最后再把它添加到文档中。


3、也可以先为元素设置display: none,操作结束后再把它显示出来。因为在display属性为none的元素上进行的DOM操作不会引发回流和重绘。


4、避免频繁读取会引发回流/重绘的属性,如果确实需要多次使用,就用一个变量缓存起来。


5、对具有复杂动画的元素使用绝对定位,使它脱离文档流,否则会引起父元素及后续元素频繁回流。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表