经典面试题:什么是回流和重绘?如何优化?

浏览器渲染一个页面有两条线程:一条是渲染js脚本,一条是渲染css脚本。但是两条线程是互斥的。

回流:当render tree的一部分或者全部元素因改变了自身的宽高,布局,显示或隐藏,或元素内部的文字结构发生变化,导致需要重新构建页面的时候,回流就产生了。

重绘:当一个元素自身的宽高,布局,及显示或隐藏没有改变,而只是改变了元素的外观风格的时候,就产生了重绘。

结论:回流必定触发重绘,而重绘不一定出发回流。

如何避免回流:1、不使用能够触发回流的属性;2、建立一个图层,让回流在图层里面进行,限制回流和重绘的范围,减少浏览器的运算工作量。

Css是怎么“划分图层”的:在页面加载完dom之后,浏览器会根据自身制定的一些特殊css 属性对页面进行划分为一个个图层。例如position: absolute|fixed 。

图层的优点:当一个元素在自己的图层内发生变化时,他的回流和重绘只会在图层内发生变化,减少了浏览器的计算量。

图层内部做了什么
1、对图层里面的节点做回流和重布局运算,计算出他们的样式
2、生成图形和位置
3、将每个节点绘制填充在图层位图中
4、将涂层作为纹理发送到GPU
5、将所有的图层合并,显示在浏览器的页面上

总结:滥用图层会让页面进行了太多的合并运算而导致页面卡顿。所以图层的用途应该让那些经常要进行位置结构,布局变换的元素去使用。例如轮播图。

有哪些可替换的属性可以优化回流与重绘呢,一共有一下9点:
1:用transform 代替 top,left ,margin-top, margin-left... 这些位移属性
2:用opacity 代替 visibility,但是要同时有translate3d 或 translateZ 这些可以创建的图层的属性存在才可以阻止回流
但是第二点经过我的实验,发现如果不加 transform: translateZ(0) 配合opacity的话还是会产生回流的,而只用visibility 就只会产生重绘不会回流
而  opacity 加上 transform: translateZ/3d  这个属性之后便不会发生回流和重绘了
3:不要使用 js 代码对dom 元素设置多条样式,选择用一个 className 代替之。
4:如果确实需要用 js 对 dom 设置多条样式那么可以将这个dom 先隐藏,然后再对其设置
5:不要在循环内获取dom 的样式例如:offsetWidth, offsetHeight, clientWidth, clientHeight... 这些。浏览器有一个回流的缓冲机制,即多个回流会保存在一个栈里面,当这个栈满了浏览器便会一次性触发所有样式的更改且刷新这个栈。但是如果你多次获取这些元素的实际样式,浏览器为了给你一个准确的答案便会不停刷新这个缓冲栈,导致页面回流增加。
所以为了避免这个问题,应该用一个变量保存在循环体外。
6:不要使用table 布局,因为table 的每一个行甚至每一个单元格的样式更新都会导致整个table 重新布局
7:动画的速度按照业务按需决定
8:对于频繁变化的元素应该为其加一个 transform 属性,对于视频使用video 标签
9:必要时可以开启 GPU 加速,但是不能滥用

原文地址:https://www.cnblogs.com/chenyanlong/p/10551080.html

时间: 2024-11-05 14:51:30

经典面试题:什么是回流和重绘?如何优化?的相关文章

详解回流和重绘及优化

回流和重绘可以说是每一个web开发者都经常听到的两个词语,看了一些博客和书籍,整理了一些内容并且结合自己的体会,写了这篇文章,希望可以帮助到大家. 1. 浏览器的渲染过程 1.1 渲染过程 本文先从浏览器的渲染过程来从头到尾的讲解一下回流重绘,如果大家想直接看如何减少回流和重绘,可以跳到后面.(这个渲染过程来自MDN) 从上面这个图上,我们可以看到,浏览器渲染过程如下: 解析HTML,生成DOM树,解析CSS,生成CSSOM树 将DOM树和CSSOM树结合,生成渲染树(Render Tree)

浏览器的回流和重绘及其优化方式

推荐了解的知识:基本的HTML,基本的JavaScript,以及一些css工作原理方面的知识 浏览器的渲染原理 css的加载和解析不会阻塞html文档的解析 css的解析会阻塞js的执行,必须等到CSSOM生成后才能执行js js的执行会阻塞html文档的解析 html一边解析一边显示 css必须完全解析完毕才能进入生成渲染树环节???????浏览器向服务器请求到了HTML文档后便开始解析,产物是DOM Tree(文档对象模型),如果有css,会根据css生成CSSOM(CSS对象模型),然后再

【开发必看】你真的了解回流和重绘吗?

本文由云+社区发表 回流和重绘可以说是每一个web开发者都经常听到的两个词语,可是可能有很多人不是很清楚这两步具体做了什么事情.最近有空对其进行了一些研究,看了一些博客和书籍,整理了一些内容并且结合一些例子,写了这篇文章,希望可以帮助到大家. 浏览器的渲染过程 本文先从浏览器的渲染过程来从头到尾的讲解一下回流重绘,如果大家想直接看如何减少回流和重绘,优化性能,可以跳到后面.(这个渲染过程来自MDN) 浏览器渲染过程 添加描述 从上面这个图上,我们可以看到,浏览器渲染过程如下: 解析HTML,生成

前端必备的浏览器知识(渲染过程、回流和重绘等)

常用哪几种浏览器测试?有哪些浏览器内核(Rendering Engine)? (Q1)浏览器:Chrome,IE,FireFox,Safari,Opera. (Q2)对应内核:Webkit,Trident,Gecko,Webkit,Presto.(国内的浏览器,除了傲游是直接基于Webkit开发的,其他基本都是基于谷歌在webkit上开发的Chromium,当然谷歌自己也是用的Chromium.另外值得的一提的是手机的系统(安卓.苹果)默认浏览器都是基于webkit内核的) 如何理解浏览器内核?

回流与重绘

强制重绘 ele.setAttribute( 'style' , ele.getAttribute('style' )); 1.当render tree (渲染树)中的部分或全部因为元素的规模尺寸,布局,隐藏等改变而需要重新构建时,称之为 回流 每个页面至少回流一次,就是在页面第一次加载的时候. 也就是将受修改影响的部分重新“流一遍”,回流完成后,浏览器重新绘制受影响的部分到屏幕中,该过程称之为  重绘 2.当渲染树中的一些元素需要更新属性,而这些属性只是影响外观风格,而不影响布局的,该元素重绘

减少页面回流与重绘(Reflow & Repaint)

如果你的HTML变得很大很复杂,那么影响你JavaScript性能的可能并不是JavaScript代码的复杂度,而是页面的回流和重绘. 回流(Reflow)是指布局引擎为frame计算图形的过程. frame是一个矩形,拥有宽高和相对父容器的偏移.frame用来显示盒模型(content model), 但一个content model可能会显示为多个frame,比如换行的文本每行都会显示为一个frame. 关于CSS盒模型的介绍请参考:CSS 盒模型及其呈现方式 重绘(Repaint)发生在元

你真的了解回流和重绘吗

回流和重绘可以说是每一个web开发者都经常听到的两个词语,我也不例外,可是一直不是很清楚这两步具体做了什么事情.最近由于部门内部要做分享,所以对其进行了一些研究,看了一些博客和书籍,整理了一些内容并且结合自己的体会,写了这篇文章,希望可以帮助到大家. 浏览器的渲染过程 本文先从浏览器的渲染过程来从头到尾的讲解一下回流重绘,如果大家想直接看如何减少回流和重绘,可以跳到后面.(这个渲染过程来自MDN) 从上面这个图上,我们可以看到,浏览器渲染过程如下: 解析HTML,生成DOM树,解析CSS,生成C

[转] 你真的了解回流和重绘吗

浏览器的渲染过程 本文先从浏览器的渲染过程来从头到尾的讲解一下回流重绘,如果大家想直接看如何减少回流和重绘,可以跳到后面.(这个渲染过程来自MDN) 从上面这个图上,我们可以看到,浏览器渲染过程如下: 解析HTML,生成DOM树,解析CSS,生成CSSOM树 将DOM树和CSSOM树结合,生成渲染树(Render Tree) Layout(回流):根据生成的渲染树,进行回流(Layout),得到节点的几何信息(位置,大小) Painting(重绘):根据渲染树以及回流得到的几何信息,得到节点的绝

什么是回流与重绘

首先要知道HTML的渲染过程. 解析HTML并构建DOM树和CSSOM树,浏览器对HTML标记转换成文档对象模型,CSS标记则转换成CSS对象模型(CSSOM),DOM 树包含了所有的 html 标签,包括不展示的 head 节点和 display:none 的节点,而 CSSOM 树则会去掉浏览器不能识别的样式. 接着就是构建render 树.将 DOM 树和 CSSOM 树合并为 render 树,在这个过程中,需要计算每一个呈现对象的可视化属性,会去掉不展示在页面上的节点(如 displa