• JS学习笔记:(二)回流和重绘


    在搞清楚回流和重绘的概念之前,我们要清除浏览器的渲染过程。

    • 解析生成DOM Tree(此时包含所有节点,包括display:none);
    • 根据CSS Object Module(CCSSOM)计算节点的几何属性(坐标和大小)(margin,pading,height,width等),生成Render Tree(不包含display: none的节点);这一过程叫回流或者布局;
    • 在Render Tree进一步渲染其它属性。如:color等。

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

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

      通过上诉我们知道:回流必定引发重绘,重绘不一定引发回流回流的代价比重绘高。

      1)搞清楚了回流和重绘的概念,我们很容易知道哪些属性的修改会引起回流:

    • DOM的添加和删除;
    • 页面的加载;
    • 元素尺寸改变——边距、填充、边框、宽度和高度;
    • 元素位置的改变;
    • 内容变化,比如用户在input框中输入文字;
    • 浏览器窗口尺寸改变——resize事件发生时;
    • 获取某些属性:offsetTop、offsetLeft、 offsetWidth、offsetHeight、scrollTop、scrollLeft、scrollWidth、scrollHeight、 clientTop、clientLeft、clientWidth、clientHeight。(浏览器为了返回最精确的值,需要flush队列,因为队列中可能会有影响到这些值的操作

      2)常见引起重绘的属性:

      3)如何减少回流、重绘:

    • 使用 transform 替代 top
    • 使用 visibility 替换 display: none ,因为前者只会引起重绘,后者会引发回流(改变了布局)
    • 不要把节点的属性值放在一个循环里当成循环里的变量。
    • 不要使用 table 布局,可能很小的一个小改动会造成整个 table 的重新布局
    • 动画实现的速度的选择,动画速度越快,回流次数越多,也可以选择使用 requestAnimationFrame
    • CSS 选择符从右往左匹配查找,避免节点层级过多
    • 将频繁重绘或者回流的节点设置为图层,图层能够阻止该节点的渲染行为影响别的节点。比如对于 video 标签来说,浏览器会自动将该节点变为图层。

      浏览器的回流优化机制:浏览器会维护1个队列,把所有会引起重排、重绘的操作放入这个队列,等队列中的操作到了一定的数量或者到了一定的时间间隔,浏览器就会flush队列,进行一个批处理。这样就会让多次的重排、重绘变成一次重排重绘。

      参考文章:

      前端开发这么多年,你真的了解浏览器页面渲染机制吗? | 技术头条

      浏览器重排和重绘

  • 相关阅读:
    菜单导航组件
    flask+nginx+uwsgi在服务器搭建项目
    安装Anaconda
    vscode上eslink包失效
    js滚动事件
    打字游戏
    js更高文档的样式
    js事件
    Dom对象更改文档结构.html
    js重点
  • 原文地址:https://www.cnblogs.com/charliePU/p/10749730.html
Copyright © 2020-2023  润新知