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. RHEL系统下安装atlassian-jira-5

    操作系统:RHEL 6.4 x86_64 Jira版本:atlassian-jira-5.2.11-x64.bin 安装路径:/opt/atlassian/jira/ 数据保存路径:/opt/atla ...

  2. 爬虫(一)爬取鱼c淘贴信息

    掏出了以前的小练习: 现在开始,每天复习下以前的爬虫练习,争取发现新的问题和可以优化的地方. # -*- coding:utf-8 -*- import requests import chardet ...

  3. 吐槽苹果开放接口のappleid登陆

    这里吐槽一下苹果的开发文档,一切源于前段时间,公司的产品app(某知名资讯app)要接入苹果登陆(ios13发布以来,apple就流氓要求新上线的app,如果有第三方登陆的话,必须要接入appleid ...

  4. python webp转jpg

    webp格式转jpg格式 从网页上保存下来的webp格式的图片用ps和一些看图软件打不开,所以需要进行下转换. 直接上py代码.代码用到了PIL库,如果电脑上没有还需要pip install Pill ...

  5. (原)人体姿态识别PyraNet

    转载请注明出处: https://www.cnblogs.com/darkknightzh/p/12424767.html 论文: Learning Feature Pyramids for Huma ...

  6. [续更]一起来撸一下Flex布局里面的那些属性

    Flex的全称是Flexible Box,意为弹性布局,用来为盒模型提供最大的灵活性. Flex包含的属性有很多,每个属性又包含了许多不同意义的属性值···然而在实际开发中,能被我们临幸的可能也只是那 ...

  7. 工作技术点小计14条 hybrid + animate 方向

    设置transition 动画的时候 , js直接设置duration 和 变化值不会起作用 , 需要先设置duration , 等一小会再设置变化值 安卓端 , 窗口不可见时 , window.in ...

  8. fsLayuiPlugin数据字典使用

    概述 数据字典主要解决下拉框数据填充和数据表格转义处理,一个数据字典可以多处使用. 1.多个页面下拉框使用同样的数据,改一个地方需要把所有页面都要修改 2.数据表格转义代替自己手动写templet解析 ...

  9. cordova+vue打包ios调用相机闪退解决

    cordova+vue项目打包android,打开相机正常使用,但是打包ios后,需要多几个配置,才能打开,否则当调用的时候会闪退,上配置图 需要在选中的文件里面添加 <key>NSCam ...

  10. HBuilder-X 关闭eslint-vue 插件语法检查

    HBuilder-X  在写vue项目的时候发现,代码在保存的时候回自动检查eslint语法,会报一大堆的红色警告! 这时候就很烦人,看着不爽,看了下eslint 配置里面介绍了关闭语法检查的配置-- ...