repaint(重绘) ,repaint发生更改时,元素的外观被改变,且在没有改变布局的情况下发生,如改变outline, visibility, opacity(opacity替代visibility可以减少repaint,进而优化性能),z-index, background, color,box-shadow,transform3d不会影响到dom结构渲染
既不引起回流也不引起重绘的属性:transform, cursor, perspective, windows
https://csstriggers.com/opacity
reflow(回流,重排),与repaint区别就是他会影响到dom的结构渲染,同时他会触发repaint,他会改变他本身与所有父辈元素(祖先),这种开销是非常昂贵的,导致性能下降是必然的,页面元素越多效果越明显。

什么会引起回流?

  1. 页面渲染初始化
  2. DOM结构改变,比如删除了某个节点
  3. render树变化,比如减少了padding
  4. 窗口resize
  5. 改变字体
  6. 内容变化,比如用户在input框中输入文字
  7. 增加或者移除样式表(Adding or removing a stylesheet)
  8. 激活 CSS 伪类,比如 :hover (IE 中为兄弟结点伪类的激活)
  9. 操作 class 属性(Manipulating the class attribute)
  10. 最复杂的一种:获取某些属性,引发回流。

  很多浏览器会对回流做优化,会等到数量足够时做一次批处理回流(flush队列)。但当获取一些属性时,浏览器为了获得正确的值也会触发回流,这样使得浏览器优化无效,包括:

  1. offset(Top/Left/Width/Height)

  2. scroll(Top/Left/Width/Height)

  3. cilent(Top/Left/Width/Height)

  4. width,height

  5. 调用了getComputedStyle()或者IE的currentStyle

  6. 修改字体

重绘不会带来重新布局,并不一定伴随回流。回流是更明显的一种改变,渲染树需要重新计算;回流的危害在于重新对DOM树进行渲染,那么,脱离文档流(position:absolute,fixed;float:left,right)之后,进行的任何操作,都不会造成回流了。如果没有对页面进行优化(存在大量回流),那么页面因为回流所花费的时间,导致用户体验感大打折扣;只要修改DOM或修改了元素的形状或大小,就会触发Reflow,单纯修改元素的颜色只需Repaint一下(调用操作系统Native GUI的API绘制)。

回流一定伴随着重绘,重绘却可以单独出现。所以一般会有一些优化方案,如:

  • 减少逐项更改样式,最好一次性更改style,或者将样式定义为class并一次性更新

  • 避免循环操作dom,创建一个documentFragment或div,在它上面应用所有DOM操作,最后再把它添加到window.document

  • 避免多次读取offset等属性。无法避免则将它们缓存到变量

  • 将复杂的元素绝对定位或固定定位,使得它脱离文档流,否则回流代价会很高

减少回流的几点建议:

1. 减少不必要的DOM深度。因为无论你改变DOM节点树上任何一个层级都会影响节点树的每个层级——从根结点一直到修改的子节点。不必要的节点深度将导致执行回流时花费更多的时间。
2. 精简css,去除没有用处的css
3.

如果你想让复杂的表现发生改变,例如动画效果,使用position-absolute或position-fixed来实现它,也即是让其脱离文档流,不影响父级;

现代浏览器也可以使用CSS3
transition实现动画效果,比改变像素值来的高性能。
4. 避免不必要的复杂的css选择符,尤其是使用子选择器,或消耗更多的CPU去做选择器匹配。

5. 页面的元素适当定高,例如如果div内容可能有高度差异的动态内容载入; 页面刷新载入的时候,应避免页面元素的晃动、位移等,这些都是额外的重绘,会让你的CPU和风扇兴奋的

6. 图片:如果你的<img>不设定尺寸、同时外部容器没有定死高宽,则图片在首次载入时候,占据空间会从0到完全出现,左右上下都可能位移,发生大规模的重绘。


  • 构建dom树的过程即根据html代码自上而下进行构建,当遇到script文件加载/执行会阻塞后面dom树的构建(javascript可能会改变dom树),而遇到css文件,不会阻塞dom树构建,会阻塞render树的构建。
  • 当浏览器遇到需要加载资源的标签时(img、video等),不会等待资源加载完成,而是继续向后渲染。(当资源加载完毕时,浏览器会重新渲染这部分)

添加 3D 动画硬件加速的方法

.item {
transform: translateZ(0); /* 或者 will-change: transform; */
}

3d加速参考:https://www.cnblogs.com/rubylouvre/p/3471490.html

关于repaint和reflow的笔记的更多相关文章

  1. javascript性能优化-repaint和reflow

    repaint(重绘) ,repaint发生更改时,元素的外观被改变,且在没有改变布局的情况下发生,如改变outline,visibility,background color,不会影响到dom结构渲 ...

  2. css的repaint和reflow

    css的repaint和reflow 浏览器为了重新渲染部分或整个页面,重新计算页面元素位置和几何结构(geometries)的进程叫做 reflow. 由于 reflow 是一种浏览器中的用户拦截( ...

  3. 探讨css中repaint和reflow

    (个人blog迁移文章.) 前言: 页面设计中,不可避免的需要浏览器进行repaint和reflow.那到底什么是repaint和reflow呢.下面谈谈自己对repaint和reflow的理解,以及 ...

  4. [ JS 进阶 ] Repaint 、Reflow 的基本认识和优化

    你是不是经常听师兄或一些前端前辈说不能用CSS通配符 *,CSS选择器层叠不能超过三层,CSS尽量使用类选择器,书写HTML少使用table,结构要尽量简单-DOM树要小....等这些忠告,以前我就大 ...

  5. repaint和reflow的相关知识

    一个页面由两部分组成: DOM:描述该页面的结构 render渲染:描述 DOM 节点 (nodes) 在页面上如何呈现 repaint重绘: 当 DOM 元素的属性发生变化 (如 color) 时, ...

  6. 【转】javascript性能优化-repaint和reflow

    repaint(重绘) ,repaint发生更改时,元素的外观被改变,且在没有改变布局的情况下发生,如改变outline,visibility,background color,不会影响到dom结构渲 ...

  7. 【翻译】浏览器渲染Rendering那些事:repaint、reflow/relayout、restyle

    原文链接:http://www.phpied.com/rendering-repaint-reflowrelayout-restyle/ 有没有被标题中的5个“R”吓到?今天,我们来讨论一下浏览器的渲 ...

  8. 前端性能优化-减少http请求,dns预解析,减少repaint和reflow

    前端性能优化方法: 一 . 减少http请求 (1)通过合并图片,减少请求,俗称css sprites(css精灵)css sprites (2)lazyload懒加载,在需要的时候再加载 1.定义: ...

  9. 前段性能----repaint和reflow

    在前面小节,我们对网页渲染过程做了介绍,其中最后两步就是layout与paint,当渲染对象被创建并添加到树中,它们并没有位置和大小,计算这些值的过程称为layout或reflow.绘制阶段,遍历渲染 ...

随机推荐

  1. MyBatis框架入门之(二)

    在本篇文章中,没有对细节进行处理的很好,有很多晓得细节的遗漏,本文只是一个简单的快速的入门 MyBatis的快速入门 导入MyBatis框架jar包 配置文件 SqlSessionFactoryBui ...

  2. c++ STL中的set和multiset

    1.结构 set和multiset会根据特定的排序原则将元素排序.两者不同之处在于,multisets允许元素重复,而set不允许重复. set中的元素可以是任意类型的,但是由于需要排序,所以元素必须 ...

  3. 一种基于 Numpy 的 TF-IDF 实现报告

    一种基于 Numpy 的 TF-IDF 实现报告 摘要 本文使用了一种 state-of-the-art 的矩阵表示方法来计算每个词在每篇文章上的 TF-IDF 权重(特征).本文还将介绍基于 TF- ...

  4. python识别图片生成字符模式

    此python文件来自D7哥, 放在这里备份. 用法 python3 PIL\&argparse.py 1.jpg -o test.txt --width 300 --height 300 p ...

  5. 20145208 蔡野 《网络对抗》Exp5 MSF基础应用

    20145208 蔡野 <网络对抗>Exp5 MSF基础应用 链接地址 主动攻击:利用ms08_067_netapi进行攻击 对浏览器攻击:MS10-002 对客户端攻击:adobe_to ...

  6. 尚硅谷面试第一季-10SpringMVC的工作流程

    目录结构: 关键代码: web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xml ...

  7. topcoder srm 425 div1

    problem1 link 暴力搜索即可. problem2 link 可以将每次所有的piece的位置看作一个状态,由于$C_{25}^{5}=53130$,所以最多有这么多状态.这里可以加一些优化 ...

  8. Python3 tkinter基础 Canvas create_rectangle 画矩形

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  9. route 工具

    route工具 route工具主要用来查看或修改内核路由表 查看内核路由表 route [-nee] 参数说明: -n:不要使用协议或主机名称,直接使用 IP 或 port number:-ee:使用 ...

  10. wqCms6.0在IIS6的Getshell

    2017-02-15发布 一.漏洞利用点 漏洞文件:admin_UploadDataHandler.ashx 自定义构造上传点 二.hack it 三.POC <html> <bod ...