关于页面 reflow 和 repaint

什么是 reflow 和 repaint

浏览器为了重新渲染部分或整个页面,重新计算页面元素位置和几何结构(geometries)的进程叫做 reflow

当确定了元素位置、大小以及其他属性,例如颜色、字体大小等都确定下来后,浏览器于是便把这些元素都按照各自的特性绘制了一遍,于是页面的内容出现了,这个过程称之为 repaint

当修改一个元素的外观(例如 outline、visibility、background color 等)但并不影响到元素的布局时,就会发生 repaint。

repaint 是昂贵的,因为浏览器会确认在DOM树中所有其他元素的 visibility 属性。

reflow 更昂贵,因为某个节点reflow时会触发其子节点,甚至包括祖先节点(根据浏览器)和文件中位于该节点以下的其他节点 reflow。由于 reflow 是一种浏览器中的用户拦截(user-blocking)操作,所以了解如何减少 reflow 次数,及不同的文档属性(DOM 层级(DOM depth),CSS 效率,不用类型的 style 变化)对 reflow 次数的影响对开发者来说非常必要。

引发 reflow 的一些因素:

  1. 调整窗口大小(Resizing the window)

  2. 改变字体大小(Changing the font)

  3. 增加或者移除样式表(Adding or removing a stylesheet)

  4. 内容变化,比如用户在input框中输入文字(Content changes, such as a user typing text in an input box)

  5. 激活 CSS 伪类,比如 :hover (IE 中为兄弟结点伪类的激活)(Activation of CSS pseudo classes such as :hover (in IE the activation of the pseudo class of a sibling))

  6. 操作 class 属性(Manipulating the class attribute)

  7. 脚本操作 DOM(A script manipulating the DOM)

  8. 计算 offsetWidth 和 offsetHeight 属性(Calculating offsetWidth and offsetHeight)

  9. 设置 style 属性的值 (Setting a property of the style attribute)

  10. 未指定图片宽高,载入时会使页面reflow

对于减少 reflow 优化性能的建议:

  1. 如果想设定元素的样式,通过改变元素的 class 名 (尽可能在 DOM 树的最里层)(Change classes on the element you wish to style (as low in the dom tree as possible))

    • 因为元素reflow时,会使所有子孙元素都reflow。

  2. 避免设置多项内联样式(Avoid setting multiple inline styles)

    • 就像往页面添加元素时,把所有html代码组装成字符串后一次性添加至dom中一样,最好是把所有要修改的样式放在一个类名中,而不是把样式依次添加到元素的内联样式里,因为每次修改内联样式都会触发 reflow。

  3. 应用动画的元素,使用 position 属性的 fixed 值或 absolute 值(Apply animations to elements that are position fixed or absolute)

    • 元素脱离正常文档流以后reflow 就不会对文档流内的元素造成影响

  4. 权衡平滑和速度(Trade smoothness for speed)

    • 给元素添加动画时,以3个像素为移动单位可能比每次移动1个像素看起来更加平滑,因为每次移动都会触发reflow,过于频繁的reflow会占用更多CPU资源,可能导致动画看起来是卡顿的。

  5. 避免使用 table 布局或者将其 table-layout 设置为 fixed(Avoid tables for layout or set table-layout fixed)

    • 在table中,后面添加的元素对其前面元素的布局会产生影响,例如:最后一个单元格的内容过多,使得整列宽度增加。而且对于table的一点点修改都可能造成 table 内所有元素的 reflow。将 table-layout 设置为 fixed 时水平布局仅取决于表格宽度、列宽度、表格边框宽度、单元格间距,而与单元格的内容无关。浏览器在接收到第一行后就可以显示表格,而不用等整个表格加载完并调整好才展示。固定布局算法比较快,但是不太灵活,而自动算法比较慢,不过更能反映传统的 HTML 表。

  6. 避免使用CSS表达式 (仅 IE 浏览器)(Avoid expressions in the CSS (IE only))

    • 因为每次触发 reflow 都会重新计算表达式

这里介绍一款强大的性能分析工具 dynaTrace,借助该功能能够清晰的得到页面中的资源消耗情况。

参考: http://www.stubbornella.org/content/2009/03/27/reflows-repaints-css-performance-making-your-javascript-slow/

posted on 2014-05-22 11:41 AiQFeng 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/AustinAn/p/3745292.html

关于页面 reflow 和 repaint相关推荐

  1. 浏览器渲染页面原理,reflow、repaint及其优化

    浏览器的主要组件包括: 1.      用户界面 - 包括地址栏.前进/后退按钮.书签菜单等.除了浏览器主窗口显示的你请求的页面外,其他显示的各个部分都属于用户界面. 2.      浏览器引擎 - ...

  2. [css] 会引起Reflow和Repaint的操作有哪些?

    [css] 会引起Reflow和Repaint的操作有哪些? 页面布局和几何信息(比如:增加删除dom,改变元素位置或者尺寸等)发生改变时,会触发Reflow. 给dom节点添加样式,会触发Repai ...

  3. 简述reflow和repaint

    一般,在页面开发时,不可避免地会发生repaint和reflow,除非是静态页面.从字面上理解repaint,它表示"重绘",而reflow则是"回流".他们的 ...

  4. reflow和repaint

    简要:整个在浏览器的渲染过程中(页面初始化,用户行为改变界面样式,动画改变界面样式等)reflow(回流)和repaint(重绘) 会大大影响web性能,尤其是手机页面.因此我们在页面设计的时候要尽量 ...

  5. reflow与repaint

    重流和重绘 重流就是页面的布局发生了彻彻底底的改变,元素位置或者宽高发生了变化,整个页面需要重新布局,这个时候就需要reflow. 重绘可能就是只绘一小部分,而不会绘制全部整个页面. Repaint- ...

  6. reflow和repaint理解总结

    repaint就是重绘,reflow就是回流 严重性: 在性能优先的前提下,reflow的性能消耗要比repaint的大. 体现: repaint是某个dom元素进行重绘,reflow是整个页面进行重 ...

  7. 【图解】reflow和repaint

    一.reflow和repaint的定义 reflow(回流):只要增删DOM节点或修改元素的形状.大小,就会触发reflow. repaint(重绘):只要元素样式属性(除形状.大小)发生改变了,就会 ...

  8. reflow 和 repaint

    浏览器解析基本流程 浏览器解析的基本流程 reflow和repaint reflow,浏览器根据各种样式来计算并根据计算结果将元素放到确定的地方. repaint: relfow完成之后,浏览器把这些 ...

  9. 前端性能之回流与重绘(reflow repaint)

    写在金三银四之际. 因为种种原因想要谋求新的发展,不得已翻起了尘封已久的高程书:写起了各种经典CSS布局:回顾起记忆略显模糊的几个项目.感慨着太多太多的知识点自己都不够深入甚至缺乏认识,却又不能急功近 ...

  10. Rendering: repaint, reflow/relayout, restyle的学习笔记

    http://www.zhuoqun.net/html/y2009/1430.html Rendering tree是DOM tree的可见部分 页面渲染的过程: 1. 解析HTML代码并生成一个 D ...

最新文章

  1. 每日命令:(13)more
  2. 皮一皮:论脑回路的新奇指数...
  3. python view函数_Python爬虫实例(二)——爬取新馆疫情每日新增人数
  4. 全球及中国自主运输机器人行业十四五创新模式与运行战略规划报告2022版
  5. HDU(1572),最短路,DFS
  6. bzoj#2125. 最短路
  7. 前端学习(2757):text基本使用
  8. 【JAVA】Java中goto语句的简介与使用(java 如何跳出内嵌多层循环的方法)
  9. 1.jenkins持续集成-jenkins安装
  10. 举例说明html语言的结构,第2章、HTML语言的基本结构.doc
  11. 分享:从功能增强说起
  12. TableLayout与MigLayout
  13. jQuery的几种简单实用效果
  14. 基于tensorflow的iris数据集分类示例
  15. Oligo 7 引物设计 安装
  16. 怎样更改itunes备份位置_什么是iTunes备份文件?
  17. 关于硬件批量贴片焊接流程
  18. 【有奖倒计时】带你走进AI应用创新大赛十强背后的故事!
  19. 文件管理大师android,文件管理大师
  20. 300秒就完成第一超算1万年的计算量,量子霸权真时代要来了吗

热门文章

  1. Eclipse安装插件支持jQuery智能提示
  2. android recyclerview item自适应高度_web前端学习:高度自适应知识点
  3. android camera 拍照流程图
  4. L3-013 非常弹的球 (30 分)
  5. 水下清淤机器人_国产第五代箱涵清淤机器人真机亮相上海城市管网展恒通环境展位...
  6. 【差分算法入门】例题讲解(代码逐句分析)
  7. python支持向量机库_为支持向量机库LIBSVM使用python绑定的示例
  8. 【2012百度之星/初赛上】小小度刷礼品
  9. 计算机网络(第七版)谢希仁编著 前五章部分课后答案详解
  10. linux bootloader启动流程,技术|Linux 的启动流程详解