影响回流、重绘的 CSS 属性有哪些?

简介: 影响回流、重绘的 CSS 属性有哪些?

前言


目前,比较常见的浏览器内核(渲染引擎)有:WebKitBlinkGeckoTridentEdgeHTML,更多请看


  • WebKit 课代表是 Safari 浏览器
  • Blink 课代表是 Chrome 浏览器(Blink 起源自 WebKit 的一个分支)
  • Gecko 课代表是 Firefox 浏览器
  • Trident 课代表是 IE 浏览器。2015 年微软推出的 Edge 浏览器其内核是 EdgeHTML。从良之后于 2020 年推出基于 Chromium 的 Edge 浏览器,使用 Blink 引擎。

以下是两个主流浏览器内核 WebKit、Gecko 合成 DOM 的过程:

6.webp.jpg

WebKit

7.webp.jpg

Gecko

两者整体流程基本相似,在术语方面也有所不同,比如 WebKit 中的 Layout 过程,Gecko 称为 Reflow


提高网页性能的其中一个方式就是,减少回流(reflow)、重绘(repaint),分别对应 LayoutPainting 过程。


比如,React Hooks 中处理副作用时,某些场景下应选择 useLayoutEffect,而不是 useEffect 的原因正是为了减少回流重绘的过程。

「回流」也有称作「重排」的。


正文


什么是卡顿?


在很长一段时间里,显示器的刷新率多数为 60Hz,即使到现在仍然是占多数。

刷新率(RefreshRate),表示单位时间内能够绘制新图像的次数。举个例子,60Hz 的刷新率,表示显示器要在一秒内刷新 60 次图像,换句话说,一次图像的更新要在 16.67ms 内完成。这样才不会造成卡顿。如果超出这个时间,在视角上就会产生卡顿感。


60Hz 的刷新率是人类不会感觉到屏幕图像闪烁的数值,由科学家验证得出。

附一个来自网上的图:


11.webp.jpg

还是用 React 举例吧。我们知道 React 16 起采用了全新的 Fiber 架构,就是为了解决大型应用卡顿的问题。

我们知道,浏览器是多进程的,JavaScript 是单线程的。浏览器会为每个标签(Tab)分配一个进程,每个进程由 GUI 渲染线程、JS 线程、定时器线程、网络线程、事件线程多个线程组成。最重要的一点是:GUI 渲染线程与 JS 线程是互斥的。换句话说,某个时刻它只能执行其中一个线程,等待该线程执行完毕之后,才将执行权交由另一个线程。

那么为什么 React 15 在处理大型应用的时候会卡顿呢?

首先 React 15 架构,由协调器(Reconciler)和渲染器(Render)组成。而 React 16 在原来的基础上新增了调度器(Scheduler),用于调度任务的优先级。

在 React 15 的 Reconciler 中,组件的挂载(Mounting)、更新(Updating)会对应调用 mountComponentupdateComponent 方法,它们内部会执行递归操作,以更新子组件。但是递归执行的缺点是「无法中断」。假设 JS 线程执行递归耗时超过了 16.67ms,由于互斥期间 GUI 线程并不能执行任何的操作,等递归完并生成新的虚拟 DOM 之后,触发 DOM 等更新,此时由 GUI 线程进行处理,可能包括回流、重绘的过程,然后才完成一次页面的更新。由于无法满足刷新率的要求,就会产生卡顿感。

因此,解决卡顿的思路就是:在每一帧的时间内,预留一些时间给 JS 线程,当预留的时间不够用时,React 中断当前任务,将线程控制权交换给浏览器,使其有时间渲染页面,等下一帧到来的时候,继续被中断的工作。

在 React 16 新增的 Scheduler 可以使得浏览器有剩余时间的时候通知 React,而且提供了多种调度优先级,使得更高优先级的任务优先进入 Reconciler 阶段。 而 Reconciler 则是利用了 Fiber 这种架构实现了「可中断的异步更新」(请注意,这里的异步并不是由 setTimeout 实现的,由于精度问题,setTimeout 实际上最低延迟时间是 4ms,在这寸土寸金的一帧时间才 16.67ms,显然是不合理的)。

因此,React 就是采用了这种思路来解决大型应用卡顿问题的。

题外话扯完了,回到本文的主题...


影响页面渲染性能的有什么?


再附上一张源自网上的图:


8.webp.jpg


这几个关键点:

  • JavaScript - 使用 JavaScript 脚本来触发 DOM 的更新。
  • Style - 匹配各种选择器,并计算出哪些元素应用哪些 CSS 样式的过程。
  • Layout - 前面知道一个元素应用哪些规则之后,浏览器开始计算它要占用的空间大小以及在屏幕的位置。一个元素在空间上的变化,会同时影响其他元素的重排。
  • Paint - 绘制是填充的像素的过程,比如文本、颜色、图像、边框和阴影等。
  • Composite - 合成过程处理元素绘制到哪一层,可能是在某个元素的上层或下层。与层叠上下文有关。

  1. 如果修改了某个元素的 Layout 属性,那么浏览器会检查其他所有元素,然后“自动重排”,任何受影响的部分都需要重新绘制,然后才进行合成。
  2. 如果仅修改了「paint only」属性,比如背景图片,文字颜色、背景等,它不会影响页面布局,所以会跳过 Layout 阶段,然后执行重绘。
  3. 如果修改了一个既不影响 Layout,也无需 Paint 的属性,那么浏览器只执行 Composite 合成过程。这个开销是最小的,可以看下这篇文章


CSS Triggers


哪些 CSS 属性影响 Layout,哪些影响 Paint 呢?

可以看这个网站 CSS Triggers

9.webp.jpg


其中 Change from default 表示从未设置(即 CSS 默认值)到设置为其他值,Subsequent updates 表示属性修改。


References


目录
相关文章
|
12天前
|
前端开发 JavaScript 算法
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
transition过渡属性 早期在Web中要实现动画效果,都是依赖于JavaScript或Flash来完成。 但在CSS3中新增加了一个新的模块transition,它可以通过一些简单的CSS事件来触发元素的外观变化, 让效果显得更加细腻。简单点说,就是通过鼠标经过、获得焦点,被点击或对元素任何改变中触发, 并平滑地以动画效果改变CSS的属性值。 在CSS中创建简单的过渡效果可以从以下几个步骤来实现: 在默认样式中声明元素的初始状态样式; 声明过渡元素最终状态样式,比如悬浮状态; 在默认样式中通过添加
93 1
|
12天前
|
前端开发 JavaScript 算法
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
transform变形 css3在原来的基础上新增了变形和动画相关属性,通过这些属性可以实现以前需要大段JavaScript才能实现的 功能。 CSS3的变形功能可以对HTML组件执行位移、旋转、缩放、倾斜4种几何变换,这样的变换可以控制HTML组件 呈现出丰富的外观。 借助于位移、旋转、缩放、倾斜这4种几何变换,CSS3提供了transition动画。 transition动画比较简单,只要指定HTML组件的哪些CSS属性需要使用动画效果来执行变化,并指定动画时间,就可保证动画播放。 比transitio
45 1
|
12天前
|
前端开发 算法 Java
(CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
(CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
48 1
|
12天前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
position定位(核心) 我们讲盒模型的时候,提到了3个属性可以用来控制页面排版。 三大属性:position属性,display属性,float属性。 position 属性控制页面上元素间的位置关系。 display 属性控制页面元素是否显示或者是堆叠还是并排显示。 float 属性提供控制方法。 通过float这种控制方法,可以实现多栏布局,导航菜单等等。 position属性是干嘛用的?怎么用?有哪些属性值? position属性控制页面上元素间的位置关系,也就是排版。 怎么用?要知道怎么用
105 1
|
12天前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
继承 我们的CSS中很多的属性也是可以继承的,其中相当一部分是跟文字的相关的,比如说颜色、字体、字号。 当然还有一部分是不能继承的。 例如边框、内外边距。 层叠 层叠是CSS的核心机制。 层叠的工作机制: 当元素的同一个样式属性有多种样式值的时候,CSS就是靠层叠机制来决定最终应用哪种样式。 层叠规则: 层叠规则一:找到应用给每个元素和属性的声明。 说明:浏览器在加载每个页面时,都会据此查找到每条CSS规则, 并标识出所有受到影响的HTML元素。
35 1
|
前端开发
css的渐变属性linear-gradient
css的渐变属性linear-gradient
|
前端开发
CSS属性:盒子模型
CSS属性:盒子模型
107 0
|
前端开发
CSS属性
CSS属性
104 0
|
11月前
|
前端开发
CSS 浮动属性讲解和使用
本文介绍了CSS中的浮动(float)属性,包括其基本功能、属性选项及其在网页布局中的应用。浮动使元素脱离文档流,向左或右排列,周围元素随之调整。文章还详细讲解了清除浮动的方法,如使用clear属性、设置父元素高度、利用overflow属性、伪元素等,以解决因浮动导致的布局问题。最后,强调了浮动在创建复杂布局时的作用,并预告后续内容。
287 2
|
11月前
|
前端开发
CSS transition过渡属性详解
本文介绍了CSS中`transition`属性的作用、用法及实例。`transition`用于在元素属性变化时添加平滑过渡动画,通过设置`transition-property`、`transition-duration`、`transition-timing-function`和`transition-delay`等属性值,可以精细控制过渡效果。文末提供了HTML示例代码,展示了如何使用`transition`实现鼠标悬停时背景颜色的平滑变化。
490 1

热门文章

最新文章

  • 1
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
  • 3
    (CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式