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

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

一、回流

当渲染树中部分或者全部元素的尺寸、结构或者属性发生变化时,浏览器会重新渲染部分或者全部文档的过程就称为回流

下面这些操作会导致回流:

  • 页面的首次渲染
  • 浏览器的窗口大小发生变化
  • 元素的内容发生变化
  • 元素的尺寸或者位置发生变化
  • 元素的字体大小发生变化
  • 激活CSS伪类
  • 查询某些属性或者调用某些方法
  • 添加或者删除可见的DOM元素

在触发回流(重排)的时候,由于浏览器渲染页面是基于流式布局的,所以当触发回流时,会导致周围的DOM元素重新排列,它的影响范围有两种:

  • 全局范围:从根节点开始,对整个渲染树进行重新布局
  • 局部范围:对渲染树的某部分或者一个渲染对象进行重新布局

二、重绘

当页面中某些元素的样式发生变化,但是不会影响其在文档流中的位置时,浏览器就会对元素进行重新绘制,这个过程就是重绘

下面这些操作会导致回流:

  • color、background 相关属性:background-color、background-image 等
  • outline 相关属性:outline-color、outline-width 、text-decoration
  • border-radius、visibility、box-shadow

注意: 当触发回流时,一定会触发重绘,但是重绘不一定会引发回流。

三、 如何避免回流与重绘?

减少回流与重绘的措施:

  • 操作DOM时,尽量在低层级的DOM节点进行操作
  • 不要使用table布局, 一个小的改动可能会使整个table进行重新布局
  • 使用CSS的表达式
  • 不要频繁操作元素的样式,对于静态页面,可以修改类名,而不是样式。
  • 使用absolute或者fixed,使元素脱离文档流,这样他们发生变化就不会影响其他元素
  • 避免频繁操作DOM,可以创建一个文档片段documentFragment,在它上面应用所有DOM操作,最后再把它添加到文档中
  • 将元素先设置display: none,操作结束后再把它显示出来。因为在display属性为none的元素上进行的DOM操作不会引发回流和重绘。
  • 将DOM的多个读操作(或者写操作)放在一起,而不是读写操作穿插着写。这得益于浏览器的渲染队列机制

浏览器针对页面的回流与重绘,进行了自身的优化——渲染队列

浏览器会将所有的回流、重绘的操作放在一个队列中,当队列中的操作到了一定的数量或者到了一定的时间间隔,浏览器就会对队列进行批处理。这样就会让多次的回流、重绘变成一次回流重绘。

上面,将多个读操作(或者写操作)放在一起,就会等所有的读操作进入队列之后执行,这样,原本应该是触发多次回流,变成了只触发一次回流。


相关文章
|
2月前
|
缓存 前端开发 JavaScript
|
4天前
|
缓存 JavaScript 前端开发
< 性能提升 Get √ :如何理解 “ 回流 ” 与 “ 重绘 ” ?如何合理的减少其出现呢 ? >
`回流` 和 `重绘` 可以说是每一个web前端开发者经常听到的两个名词,虽然听的多,但是我们真的都理解它们的意思了嘛? 很显然都迷迷糊糊,当然在之前没有去了解的时候,小温也不例外! 之前是介于之前公司要分享,所以当时有做了解,所以这次打算和大伙分享一下! > 🧐 预先剧透一下: " **`回流`** " 和 “ **`重绘`** ” 是阻碍浏览器渲染 及 服务性能的关键因素中 比较重要的两点, 合理的规避它们,能够有效的提高项目的性能!
< 性能提升 Get √ :如何理解 “ 回流 ” 与 “ 重绘 ” ?如何合理的减少其出现呢 ? >
|
8月前
|
缓存 前端开发 JavaScript
高频面试之《重绘和回流》
高频面试之《重绘和回流》
36 0
|
3月前
|
缓存 前端开发 JavaScript
前端性能优化:提升页面加载速度
想要吸引用户并提高网站流量,页面加载速度是至关重要的。本文将介绍前端性能优化的基本原则和实践技巧,帮助您提高页面加载速度和用户体验。
|
3月前
|
缓存 JavaScript 前端开发
客户端渲染页面、DOM重绘和回流、避免DOM的回流
客户端渲染页面、DOM重绘和回流、避免DOM的回流
17 0
|
5月前
|
缓存 前端开发 JavaScript
重绘与重排(回流)
重绘与重排(回流)
35 0
|
8月前
|
缓存 JavaScript 前端开发
【怎么理解回流与重绘?以及触发场景】
【怎么理解回流与重绘?以及触发场景】
101 0
|
9月前
|
存储 缓存 JavaScript
如何优化 JavaScript 性能:减少重绘与回流
优化 JavaScript 性能是前端开发中非常重要的课题。在本篇博客文章中,我将重点介绍如何减少重绘(Repaint)与回流(Reflow),以提高 JavaScript 在浏览器中的执行效率。我们将深入探讨导致重绘和回流的原因,并提供一些优化技巧和代码示例来改进性能。
182 0
|
前端开发
|
JavaScript 前端开发
【前端工程师手册】学习回流和重绘(reflow和repaint)
【前端工程师手册】学习回流和重绘(reflow和repaint)