css 重绘与重排

我们要知道当浏览器下载完页面的所有资源后,就会开始解析源代码。
HTML 会被解析成 DOM Tree,Css 则会被渲染成 CSSOM Tree,最后它们会附加到一起,形成渲染树(Render Tree)。当渲染树构建完成时,就会开始绘制页面元素。
这时如果 DOM 发生更改或者元素的 css 几何属性发生变化,比如 width,height,position 定位等。那么就会引发一次浏览器的重排/重绘过程,也就是浏览器会重新计算元素的几何属性,并重新构造渲染树,这个过程叫做重排,完成重排后,要将重新构建的渲染树渲染到屏幕上,这个过程就是“重绘”。
而如果是 css 的非几何属性更改,则只会引起重绘。所以说重排一定会引起重绘,而重绘不一定会引起重排。

重排

既然重排的原理是根据因为几何属性发生了改变,那么我们就能够总结一下引起重排的操作:
1、页面首次渲染
2、添加或删除 Dom 的显示与隐藏
3、元素相对于文档的定位改变
4、元素的大小尺寸改变
5、添加行内 style 样式
6、浏览器窗口大小发生改变时

重绘

重绘相对来说就简单点了,比如颜色改变,背景图片改变,阴影改变等,只要不影响元素本身相对于浏览器文档的位置只会触发重绘。

性能优化

操作 DOM 的成本是非常高的,而且如果不小心改掉元素的几何属性,就会触发重排和重绘,这时就会影响用户体验。我们来看一个简单的例子:
var box = document.getElementById('box'); // 获取页面一个子元素
box.margin = "15px"; // 重排+重绘
box.border = "1px solid red"; // 又是一次重排+重绘
box.backgroundColor = "red"; // 没有尺寸变化,只重绘
box.fontSize = "16px"; // 重排+重绘
// 新的DOM节点 - 重排+重绘
document.body.appendChild(document.createTextNode('!!!!'));
只改当前页面中的子节点,可能影响不是很明显,如果修改的节点多了或者修改了页面的顶级节点属性,那么就会推动整个页面的变化,代码是十分昂贵的。
因此,从性能优化角度,我们可以从以下几个方面着手:
1) 浏览器本身的优化策略
浏览器会维护一个队列,将所有引起重排和重绘的操作都放在这个队列里,当操作达到一定的数量或者时间间隔时,浏览器会批量执行来优化重排过程。这样可以让多次的重排重绘,变成一次。但是有的特殊 style 属性会使这种优化失效,例如offsetTop,scrollTop,clientTop等属性,这些属性都是要实时返回给用户的几何属性或者布局属性,因此浏览器需要立即执行,触发重排返回正确的值。
2) 最小化重排和重绘
避免设置大量的 style 行内样式。修改单个 DOM 节点的多条语句合并成一个语句来执行。
DOM 元素的动画属性最好设置为 absolute 或者 fixed 定位。
3) css 动画和性能处理
减少 js 操作元素的样式,使用修改 class 类名方式修改样式。
开启动画的 GPU 加速,渲染计算交给 GPU 处理。
避免频繁计算样式,可以缓存变量,并且在变量中工作。
可以使用 querySelectorAll() 获取的静态集合替代 getElementByXX() 获取的动态集合。

小结

虽然篇幅不长,但是感谢你看完了这篇文章,最后我来总结一下几个点:
  • 重排一定会引起重绘,而重绘不一定会引起重排。
  • 会引起重排和重绘的条件
  • 怎样进行性能优化(减少 DOM 操作、高性能 API 的使用、开启硬件加速、减少 DOM 操作等)
  • 浏览器本身的优化策略

css 重排与重绘的更多相关文章

  1. CSS重排和重绘

    一.什么是重绘Repaint和重排 (回流 reflow) 重绘:当元素的一部分属性发生改变,如外观.背景.颜色等不会引起布局变化,只需要浏览器根据元素的新属性重新绘制 ,使元素呈现新的外观叫做重绘. ...

  2. 高性能JavaScript 重排与重绘

    先回顾下前文高性能JavaScript DOM编程,主要提了两点优化,一是尽量减少DOM的访问,而把运算放在ECMAScript这一端,二是尽量缓存局部变量,比如length等等,最后介绍了两个新的A ...

  3. 160826、浏览器渲染页面过程描述,DOM编程技巧以及重排和重绘

    一.浏览器渲染页过程描述   1.浏览器解析html源码,然后创建一个DOM树. 在DOM树中,每一个HTML标签都有一个对应的节点(元素节点),并且每一个文本也都有一个对应的节点(文本节点). DO ...

  4. 浏览器渲染页面过程描述,DOM编程技巧以及重排和重绘。

    一.浏览器渲染页过程描述 1.浏览器解析html源码,然后创建一个DOM树. 在DOM树中,每一个HTML标签都有一个对应的节点(元素节点),并且每一个文本也都有一个对应的节点(文本节点). DOM树 ...

  5. 高性能WEB开发:重排与重绘

    DOM编程可能最耗时的地方,重排和重绘. 1.什么是重排和重绘 浏览器下载完页面中的所有组件——HTML标记.JavaScript.CSS.图片之后会解析生成两个内部数据结构——DOM树和渲染树. D ...

  6. js 重排和重绘

    1.什么是重排和重绘 浏览器下载完页面中的所有组件--HTML标记.JavaScript.CSS.图片之后会解析生成两个内部数据结构--DOM树和渲染树. DOM树表示页面结构,渲染树表示DOM节点如 ...

  7. JS性能--DOM编程之重排与重绘

    浏览器下载完页面中的所有组件----HTML标记,Js,CSS,图片等之后会解析并生成两个内部数据结构: DOM树  -------- 表示页面结构 渲染树   -------- 表示DOM节点如何显 ...

  8. DOM的回流和重绘(重排、重绘)

    什么是DOM回流? 页面渲染时,我们对HTML结构简单的增删查改时,浏览器会对所有的dom进行重新排序,这就i是DOM回流,严重影响浏览器性能 DOM的回流和重绘: **DOM的回流**:当页面中元素 ...

  9. 优化CSS重排重绘与浏览器性能

    关于CSS重排和重绘的概念,最近看到不少这方面的文章,觉得挺有用,在制作中考虑浏览器的性能,减少重排能够节省浏览器对其子元素及父类元素的重新渲染:避免过分的重绘也能节省浏览器性能:优化动画,使用3D启 ...

随机推荐

  1. yum配置与使用

    yum的配置一般有两种方式,一种是直接配置/etc目录下的yum.conf文件,另外一种是在/etc/yum.repos.d目录下增加.repo文件. 一.yum的配置文件 [main] cached ...

  2. 图示JVM工作原理

    JDK,JRE,JVM的联系是啥? JVM Java Virtual Machine JDK Java Development Kit JRE Java Runtime Environment 看上图 ...

  3. Pycharm2019.2激活至2089年

    PyCharm作为日常开发常用工具,过段时间就需要再次激活是个问题,今早找到个方法很实用,亲测也是有效的.激活成功如下图: 具体步骤如下: 1. 下载破解补丁和激活码[小哈学Java公众号提供],使用 ...

  4. 从零认识 DOM (一): 对象及继承关系

    先上图为敬! 说明: 图中包括了大部分 DOM 接口及对象, 其中: 青色背景为接口, 蓝色背景为类, 灰色背景表示为 ECMAScript 中的对象 忽略了一部分对象, 包括: HTML/SVG 的 ...

  5. 今夜我懂了Lambda表达式_解析

    现在时间午夜十一点~ 此刻的我血脉喷张,异常兴奋:因为专注得学习了一把java,在深入集合的过程中发现好多套路配合Lambda表达式真的是搜椅子,so开了个分支,决定从"只认得", ...

  6. NLP(二十五)实现ALBERT+Bi-LSTM+CRF模型

      在文章NLP(二十四)利用ALBERT实现命名实体识别中,笔者介绍了ALBERT+Bi-LSTM模型在命名实体识别方面的应用.   在本文中,笔者将介绍如何实现ALBERT+Bi-LSTM+CRF ...

  7. 1构建个人博客--使用Hugo快速成型

    概述 人在武汉,病毒肆虐. 隔离久了,有点闷,闲余时间找点事情做. 建个博客吧, 内容不重要,写不写也不那么要紧,目前水平也写不出什么有深度的东西. 但是这个姿势一定要优美, 过程一定要折腾. OK, ...

  8. qtp10安装步骤(比较完整)

    在安装qtp之前,要提前安装软件(不知道是干嘛的,反正安装就完了),右键--管理员运行完成安装,如下图: 解压qtp镜像: 双击setup: 第一步,点击第一排 第二步, 注:安装QTP系统提示“ 计 ...

  9. js 随机产生100个0~1000之间的整数

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. appnium适应之配置

    一.session #获取包名和acctivename#这个工具在adk包里面aapt.exe dump badging E:\Wandoujia_851097_web_seo_baidu_binde ...