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. clearstatcache清除文件状态缓存

    当使用下列任何函数时stat(),lstat(),file_exists(),is_writable(),is_readable(),is_executable(),is_file(),is_dir( ...

  2. GRE阅读

    界面和托福差不多,就是反一反 GRE先读文章!因为出题顺序不一致.另外,不能跳读!!每一句都要读,即使不是观点. 考察能力: 1 三秒版本 边读边概括 解决前面的抗遗忘能力 2 句间关系 取同 取反 ...

  3. 深度视觉盛宴——CVPR 2016

    小编按: 计算机视觉和模式识别领域顶级会议CVPR 2016于六月末在拉斯维加斯举行.微软亚洲研究院在此次大会上共有多达15篇论文入选,这背后也少不了微软亚洲研究院的实习生的贡献.大会结束之后,小编第 ...

  4. TCP与三次握手

    TCP是在不可靠的网络层上提供可靠的传输服务.如何理解?假设你拥有一个快递公司,但是快递小哥不是很靠谱, 送货偶尔会出问题,所以你经常收到投诉电话,处理一些复杂的问题.比如有些快递压舱了,有些丢失了, ...

  5. iOS多线程之Thread

    多线程 • Thread 是苹果官方提供的,简单已用,可以直接操作线程对象.不过需要程序员自己管理线程的生命周期,主要是创建那部分 优缺点 面向对象,简单易用 直接操作线程对象 需要自己管理线程生命周 ...

  6. 如何在NLP领域第一次做成一件事

    作者简介 周明,微软亚洲研究院首席研究员.ACL候任主席(president).中国计算机学会中文信息技术专委会主任.中国中文信息学会常务理事.哈工大.天津大学.南开大学.山东大学等多所学校博士导师. ...

  7. 1——PHP常见的系统常量

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  8. TypeScript声明文件

    为什么需要声明? 声明的本质是告知编译器一个标识符的类型信息.同时,在使用第三方库时,我们需要引用它的声明文件,才能获得对应的代码补全.接口提示等功能. 声明在TypeScript中至关重要,只有通过 ...

  9. powershell加KeePass实现,加密服务器密码清单文件

    powershell加KeePass实现,加密服务器清单文件   powershell传教士翻译,改写. 2020-02-27   原文: https://www.altaro.com/msp-doj ...

  10. 如何看待Java是世界上最好的语言?

    Java出现二十多年以来,一直都是主流的开发语言,Java创建于 1995 年,在 20多年的发展历程中,Java 已经证明自己是用于自定义软件开发的顶级通用编程语言. Java 广泛应用于科学教育. ...