当前位置: 首页 > news >正文

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

前言

最近在研究virtual dom,接着就研究回顾起回流(reflow)与重绘(repaint)了。

回流与重绘,好像大家都很熟悉的样子,但是要具体来说说,又说不出什么来。下面我是我稍做的整理:

浏览器渲染流程

在理解这两个概念之前,我们先来看看浏览器渲染的工作流程。这里以webkit渲染引擎为例

clipboard.png

  1. 浏览器请求到html文档后,将html解析成dom Tree
  2. css被解析成css style rules
  3. 解析完成后,将结合dom Tree和style rules构造render tree
  4. 浏览器计算render tree中每个渲染对象的位置和大小,即布局(layout)
  5. 最后进行绘制(painting)

回流与重绘

回流(reflow)

当元素的规模尺寸、布局、隐藏等改变,而导致render tree的一部分(或全部)重新构建,即称为回流。每个页面至少进过一次回流,就在页面第一次加载的时候。在回流的时候,浏览器会使渲染树中受到影响的部分失效,并重新构造这部分渲染树,完成回流后,浏览器会重新绘制受影响的部分到屏幕中,该过程成为重绘。

重绘(repaint)

当render tree中的一些元素需要更新属性,这些属性只影响元素的外观,风格,而不会影响元素尺寸、布局、隐藏的,比如background-color,就叫重绘。

注意:回流必将引起重绘,而重绘不一定会引起回流。

回流的发生

  1. 可见元素尺寸的改变,如width、height、margin、padding等属性改变引起尺寸的变化
  2. window resize事件的触发
  3. 元素display属性的改变
  4. 元素位置的改变
  5. 等等

性能优化

回流与重绘非常影响web性能,因为每一次html和css的重新解析然后再构建成render tree,都需要经过大量的计算,这个过程是很耗时间耗性能的。如何减少呢?建议

  1. 页面元素适当定高,如img的夹在在文档流中占据的空间从0到完全加载,会产生频繁的重绘
  2. 减少dom的深度,可以减少解析器耗时
  3. 尽量简化css
  4. 复杂的动画,可以使其元素脱离文档流,使用position:absolute或者position:fixed,以减少对父元素的影响

当然,这里列举的并不是全部的方法,若你有更好的建议,也希望一起分享出来

参考文档

https://kb.cnblogs.com/page/1...
https://www.html5rocks.com/zh...

相关文章:

  • 新手搭建网站的主要流程
  • python爬虫笔记-day1
  • 简便安装mysql数据库的方法
  • Scrum立会报告+燃尽图(十一月二十五日总第三十三次):展示博客
  • Android 性能优化的方面方面都在这儿
  • 通过几道题目学习二叉搜索树
  • 设计模式 开闭原则
  • 一个真正有能力的人
  • Mybatis-plus之RowBounds实现分页查询
  • clover无缘无故隐藏书签栏原因
  • Vue 路由切换时页面内容没有重新加载
  • 303. Range Sum Query - Immutable
  • 从“被动挖光缆”到“主动剪网线”,蚂蚁金服异地多活的微服务体系
  • 冲刺第四天 11.28 WED
  • Spark 用户自定义函数 Java 示例
  • 【Amaple教程】5. 插件
  • Apache的基本使用
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • canvas绘制圆角头像
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • CSS实用技巧
  • css属性的继承、初识值、计算值、当前值、应用值
  • ES10 特性的完整指南
  • Iterator 和 for...of 循环
  • JavaScript 奇技淫巧
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • nodejs实现webservice问题总结
  • Shadow DOM 内部构造及如何构建独立组件
  • Vue官网教程学习过程中值得记录的一些事情
  • 安装python包到指定虚拟环境
  • 解析 Webpack中import、require、按需加载的执行过程
  • 坑!为什么View.startAnimation不起作用?
  • 前端学习笔记之观察者模式
  • 如何使用 JavaScript 解析 URL
  • 推荐一个React的管理后台框架
  • 小程序开发中的那些坑
  • 小试R空间处理新库sf
  • 学习笔记:对象,原型和继承(1)
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 一道面试题引发的“血案”
  • 自制字幕遮挡器
  • (¥1011)-(一千零一拾一元整)输出
  • (27)4.8 习题课
  • (7)STL算法之交换赋值
  • (70min)字节暑假实习二面(已挂)
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (三)Honghu Cloud云架构一定时调度平台
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (原創) 物件導向與老子思想 (OO)
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .form文件_一篇文章学会文件上传
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET DataGridView数据绑定说明