原文地址:https://blog.csdn.net/u013100656/article/details/79888106

浏览器拿到HTML之后的渲染过程:
  1. 生成dom树;
  2. 生成render树;
  3. 执行reflow(在render树的基础上计算页面真实显示dom的位置);
  4. 执行repaint(为真实显示的dom绘制不影响dom位置的样式,如设置dom的color等)。
reflow:

当页面发生的某些变化影响了布局,需要倒回去重新渲染,该过程称为reflow(重排/回流)。reflow几乎是无法避免的。现在界面上流行的一些效果,比如树状目录的折叠、展开(实质上是元素的显示与隐藏)等,都将引起浏览器的reflow。只要这些变化引起了页面上某些元素的占位面积、定位方式、边距等属性的变化,都会引起它内部、周围甚至整个页面的重新渲染。通常我们无法预估浏览器到底会reflow哪一部分的代码,它们彼此相互影响。

repaint:

如果页面的变化只是改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性,将只会引起浏览器repaint(重绘)。

简而言之,如果页面的变化会导致dom的位置发生变化,则会触发reflow,如果不会导致dom的位置发生变化,则会触发repaint。如果触发了reflow则一定会触发repaint,而触发repaint则不一定会触发reflow。另外,reflow的成本比repaint高很多,dom树里每个结点的reflow都可能触发其子结点、祖先结点、兄弟结点的reflow。reflow过于频繁是导致页面性能下降的关键因素之一(也是页面性能优化的主要方向)。


要降低触发reflow的频率,首先要明确哪些情况会触发reflow,以下是会触发reflow的几种动作:

  1. 改变窗囗大小;
  2. 改变文字大小;
  3. 添加/删除样式表;
  4. 内容的改变,如用户在输入框中输入信息;
  5. 激活伪类,如:hover;
  6. 操作class属性;
  7. 脚本操作dom;
  8. 获取dom的offsetWidth和offsetHeight;
  9. 设置style属性。

reflow的优化:

  1. 尽可能限制reflow的影响范围,修改dom层级较低的结点。不要通过父级元素影响子元素样式。最好直接加在子元素上。改变子元素样式尽可能不要影响父元素和兄弟元素的尺寸;
  2. 不要一条一条的修改dom的样式,最好通过设置class的方式。 避免重复触发reflow和repaint;
  3. 经常reflow的元素,比如动画,position设为fixed或absolute,使其脱离文档流,不影响其它元素的布局;
  4. 权衡速度的平滑。比如实现一个动画,以1px为单位移动这样最平滑,但reflow就会过于频繁,CPU很快就会被完全占用。如果以3个像素为单位移动就会好很多;
  5. 不要用tables布局。tables中某个元素一旦触发reflow就会导致table里所有的其它元素reflow。在适合用table的场合,可以设置table-layout为auto或fixed,这样可以让table一行一行的渲染,这种做法也是为了限制reflow的影响范围;
  6. 避免使用css expression(每次都会重新计算);
  7. 减少不必要的dom层级(DOM depth)。改变dom树中的一级会导致所有层级的改变,上至根部,下至被改变节点的子节点。这导致大量时间耗费在执行reflow上面;
  8. 避免不必要的复杂的css选择器,尤其是后代选择器(descendant selectors),因为为了匹配选择器将耗费更多的cpu;
  9. 尽量不要频繁的增加、修改、删除元素,可以先把dom节点抽离到内存中进行复杂的操作然后再display到页面上。(display:none的节点不会被加入render树,而visibility:hidden会;display:none会触发reflow,而visibility:hidden只会触发repaint,因为layout没有变化)。

reflow(重排/回流)、repaint(重绘)及其优化相关推荐

  1. javascript --- [读书笔记] 回流与重绘 前端优化小结

    1. 浏览器渲染原理 请说出: 从用户在浏览器地址输入网址,到看整个页面,中间都发生了哪些事情? HTTP请求阶段 HTTP响应阶段 浏览器渲染阶段 1.1 可能用到的知识 1.1.1 进程 Proc ...

  2. repaint(重绘)和reflow(回流)

    文章目录 前言 reflow(回流) repaint(重绘) 总结 前言 repaint(重绘)和reflow(回流),其实是老生常谈的事情,一直从没正式写过总结,晚上偶然想起,不如简单写一下. 首先 ...

  3. android 重绘如何能不闪一下屏幕_回流和重绘

    浏览器的渲染过程 本文先从浏览器的渲染过程来从头到尾的讲解一下回流重绘,如果大家想直接看如何减少回流和重绘,优化性能,可以跳到后面.(这个渲染过程来自MDN) 从上面这个图上,我们可以看到,浏览器渲染 ...

  4. 解剖课-回流与重绘篇

    浏览器的渲染过程 一. 首先我们要知道什么是HTML? HTML:是文本也是一个字符串,它很多的根标签比如:html,head,body,都是手写的字符串些字符串最后都会转换为DOM树 二.DOM树如 ...

  5. 浏览器的回流与重绘 (Reflow Repaint)

    参考<极客学院--浏览器工作原理与实践> 渲染流程大致可总结为如下: 1. 渲染进程将 HTML 内容转换为能够读懂的 DOM 树结构. 2. 渲染进程将 CSS 样式表转化为浏览器可以理 ...

  6. reflow(回流)和repaint(重绘)

    文章目录 目录 前言 一.什么是reflow和repaint ? 二.reflow(回流)和repaint(重绘) 1.reflow(回流) 2.repaint(重绘) 3.尽量减少reflow 总结 ...

  7. 回流和重绘的介绍以及优化方法

    文章目录 一.浏览器的渲染机制 1.生成渲染树的过程 二.回流和重绘 1.回流(reflow) 2.重绘(repaint) 3.何时发生回流.重绘 三.减少回流和重绘 1.浏览器的优化机制 2.使用浏 ...

  8. 前端性能优化—回流与重绘

    前端性能优化-回流与重绘 一.回流 当渲染树中部分或者全部元素的尺寸.结构或者属性发生变化时,浏览器会重新渲染部分或者全部文档的过程就称为回流. 下面这些操作会导致回流: 页面的首次渲染 浏览器的窗口 ...

  9. 性能优化之回流_重绘

    回流与重绘 当render树中的元素发生尺寸.布局.隐藏等变化时就需要重新构建.当页面布局和几何属性发生变化时就需要回流. 当render树中的一些元素更新属性,而属性只是影响外观风格时,不会影响布局 ...

  10. 页面渲染之回流与重绘讲解

    文章目录 浏览器的渲染过程 生成渲染树(Render Tree) 回流(Layout或Reflow) 重绘(Painting) 何时发生回流重绘 浏览器的优化机制 减少回流和重绘 合并样式的修改 批量 ...

最新文章

  1. 亿级流量系统架构之如何设计承载百亿流量的高性能架构【石杉的架构笔记】...
  2. Android中AIDL的使用详解
  3. cart2pol函数
  4. 上传到docker hub_docker 创建image上传到 docker hub并下载
  5. MapReduce的优点
  6. hdu 4090(搜索+可行性剪枝)
  7. eureka之EurekaInstanceConfig接口的作用
  8. 如何写_如何写博士论文?博士生如何写期刊论文?
  9. 【渝粤教育】国家开放大学2018年春季 3780-22T燃气设备操作与维护 参考试题
  10. metasploit 中文系统安装失败问题
  11. c语言指针的地址存放,c语言 - *指针 和 地址
  12. Scrapy_LinkExtractor
  13. php js特效代码如何用,phpstorm编写代码增加代码爆炸效果
  14. jsp网上零食销售网站系统
  15. linux下性能测试分析命令,Linux性能测试分析命令_top
  16. vivo手机光环助手下载游戏怎么打不开_“点亮夜色,点亮你”——全新5G自拍手机,vivo S6系列正式发布...
  17. java毕业设计蜗牛兼职网mybatis+源码+调试部署+系统+数据库+lw
  18. 第46讲 Android Camera2 API AWB自动白平衡
  19. Go开发之如何破解安装GoLand编译器?
  20. 《图解番茄工作法》读后感

热门文章

  1. UDP网络通信的收,发包
  2. 计算机网络课程设计--基于TCP协议网上聊天程序--python实现带图形界面--socket--多线程
  3. Java课程设计之 购物车管理系统
  4. 计算机视觉竞赛技巧总结(三):OCR篇
  5. PA9题解报告——重名剔除(Deduplicate)
  6. 使用ffmpeg搭建HLS直播系统
  7. 如何在机器学习的工作中获得成功?这是福布斯榜单CEO的八个建议
  8. 【TensorFlow_Fold】深度探究 Blocks for Input
  9. 入坑C语言(基础篇)
  10. 新手骑友,如何利用山地车变速器,实现不同路况下的速度转换?