美文网首页
你真的了解回流和重绘吗

你真的了解回流和重绘吗

作者: AAA前端 | 来源:发表于2019-04-17 17:43 被阅读0次

    渲染的流程基本上是这样(如下图黄色的四个步骤):

    1. 计算 CSS 样式

    2. 构建 Render Tree

    3. Layout – 定位坐标和大小

    4. 正式开画

    image

    注意:上图流程中有很多连接线,这表示了 Javascript 动态修改了 DOM 属性或是 CSS 属性会导致重新 Layout,但有些改变不会重新 Layout,就是上图中那些指到天上的箭头,比如修改后的 CSS rule 没有被匹配到元素。

    这里重要要说两个概念,一个是 Reflow,另一个是 Repaint

    重绘:当我们对 DOM 的修改导致了样式的变化、却并未影响其几何属性(比如修改了颜色或背景色)时,浏览器不需重新计算元素的几何属性、直接为该元素绘制新的样式(跳过了上图所示的回流环节)。

    回流:当我们对 DOM 的修改引发了 DOM 几何尺寸的变化(比如修改元素的宽、高或隐藏元素等)时,浏览器需要重新计算元素的几何属性(其他元素的几何属性和位置也会因此受到影响),然后再将计算的结果绘制出来,这个过程就是回流(也叫重排)

    我们知道,当网页生成的时候,至少会渲染一次。在用户访问的过程中,还会不断重新渲染。重新渲染会重复回流 + 重绘或者只有重绘。

    回流必定会发生重绘,重绘不一定会引发回流。重绘和回流会在我们设置节点样式时频繁出现,同时也会很大程度上影响性能。回流所需的成本比重绘高的多,改变父节点里的子节点很可能会导致父节点的一系列回流。

    1)常见引起回流属性和方法

    任何会改变元素几何信息 (元素的位置和尺寸大小) 的操作,都会触发回流

    • 添加或者删除可见的 DOM 元素;

    • 元素尺寸改变——边距、填充、边框、宽度和高度;

    • 内容变化,比如用户在 input 框中输入文字;

    • 浏览器窗口尺寸改变——resize 事件发生时;

    • 计算 offsetWidth 和 offsetHeight 属性;

    • 设置 style 属性的值。

    2)常见引起重绘属性和方法

    image

    3)如何减少回流、重绘

    • 使用 transform 替代 top;

    • 使用 visibility 替换 display: none ,因为前者只会引起重绘,后者会引发回流(改变了布局);

    • 不要把节点的属性值放在一个循环里当成循环里的变量。

    for(let i = 0; i < 1000; i++) {
        // 获取 offsetTop 会导致回流,因为需要去获取正确的值
        console.log(document.querySelector('.test').style.offsetTop)
    }
    
    • 不要使用 table 布局,可能很小的一个小改动会造成整个 table 的重新布局;

    • 动画实现的速度的选择,动画速度越快,回流次数越多,也可以选择使用 requestAnimationFrame;

    • CSS 选择符从右往左匹配查找,避免节点层级过多;

    • 将频繁重绘或者回流的节点设置为图层,图层能够阻止该节点的渲染行为影响别的节点。比如对于 video 标签来说,浏览器会自动将该节点变为图层。

    性能优化策略

    • 基于上面介绍的浏览器渲染原理,DOM 和 CSSOM 结构构建顺序,初始化可以对页面渲染做些优化,提升页面性能。

    • JS 优化: <script> 标签加上 defer 属性 和 async 属性 用于在不阻塞页面文档解析的前提下,控制脚本的下载和执行。

    • defer 属性: 用于开启新的线程下载脚本文件,并使脚本在文档解析完成后执行。

    • async 属性: HTML5 新增属性,用于异步下载脚本文件,下载完毕立即解释执行代码。

    • CSS 优化: <link> 标签的 rel 属性 中的属性值设置为 preload 能够让你在你的 HTML 页面中可以指明哪些资源是在页面加载完成后即刻需要的,最优的配置加载顺序,提高渲染性能。

    来源:https://www.infoq.cn/article/DltDuLToZIk_ZRqfb4jG

    相关文章

      网友评论

          本文标题:你真的了解回流和重绘吗

          本文链接:https://www.haomeiwen.com/subject/pyznwqtx.html