浏览器的重绘repaints与重排reflows深入分析

浏览器的重绘Repaints与重排Reflows深入分析

在浏览器中,每当改变了页面的布局、样式或者层级关系等,都会触发重排和重绘。重排和重绘是网站性能优化中非常重要的一个方面,因为它们会导致浏览器重新构建所有的元素并进行渲染,浪费了大量的时间和资源。因此,理解重排和重绘的原因和机制,对于优化网站性能非常重要。

何时触发重排和重绘

重排和重绘是在浏览器中进行的,不同浏览器的实现机制略有不同,但它们都有一些通用的触发条件。以下是触发重排和重绘的条件:

重排(reflow)

以下操作可能会触发重排:

  • 改变窗口大小
  • 添加、删除、修改DOM元素
  • 改变元素的位置、大小、内容或样式
  • 修改样式表
  • 修改CSS伪类,如:hover等
  • 滚动页面

重绘(repaint)

以下操作可能会触发重绘:

  • 改变元素的背景色
  • 改变元素的文字颜色
  • 改变元素的文字阴影
  • 改变元素的边框颜色、样式和宽度
  • 改变元素的透明度
  • 改变元素的图像等非背景图片

如何避免重排和重绘

因为重排和重绘会导致浪费大量的时间和资源,因此避免重排和重绘是优化网站性能的一个重要方面。以下是避免重排和重绘的一些具体做法:

  • 避免频繁操作DOM和样式
  • 在改变多个样式时,应仅对DOM进行一次修改
  • 缓存DOM的尺寸和位置,避免重复计算
  • 使用className替代style属性
  • 批量修改元素的样式,可以考虑使用cssText属性或classList属性
  • 将频繁变化的元素单独分离出来,放在独立图层中

示例

假设我们有以下的HTML结构:

<div>
  <span class="highlight">Hello</span>
  <span class="highlight">World</span>
</div>

我们想要将两个span元素的字体大小都设置为20px,首先我们可以这样写CSS:

.highlight {
  font-size: 20px;
}

这种写法虽然在功能上没有问题,但是却有一些潜在的性能问题。因为每个span元素在设置font-size的时候,都会导致浏览器重新计算整个布局,从而进行重排和重绘。因此,如果两个span元素非常多,这将会是非常低效的。

那么如何解决这个问题呢?一种简单的做法是将样式改写成下面这样:

.highlight {
  font-size: 20px;
}

div {
  font-size: 20px;
}

这样只需要将父元素的字体大小设置为20px即可。由于span元素继承了父元素的字体大小,因此不再需要单独设置每个span元素的字体大小,从而避免了重排和重绘的问题。

另外一个例子是,当需要对一个DOM元素进行一系列操作时,我们可以将这些操作合并为一个代码块,从而避免多次重排和重绘。例如:

let div = document.querySelector('div');

div.style.width = '100px';
div.style.height = '50px';
div.style.border = '1px solid black';

这里我们需要给一个div元素设置宽度、高度和边框样式。如果直接对这个元素进行多次修改,会导致多次重排和重绘。因此,我们可以将多次修改合并为一个代码块,如下所示:

let div = document.querySelector('div');

div.style.cssText = 'width: 100px; height: 50px; border: 1px solid black;';

使用cssText属性可以一次性修改多个样式,从而避免重排和重绘的问题。

结论

重排和重绘是影响网站性能的一个重要因素,因此需要我们在项目中引起足够的重视。在项目中,我们可以通过避免频繁操作DOM和样式、合并多次修改等方法来避免重排和重绘问题。同时,我们也需要对这些问题进行定位和分析,从而了解到底哪些代码会导致重排和重绘,以便我们更好地对性能进行优化。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浏览器的重绘repaints与重排reflows深入分析 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 前端面试必备之CSS3的新特性

    我来讲解一下。 前端面试必备之CSS3的新特性 1. CSS3的属性选择器 在CSS3中,新增了一些属性选择器,让选择元素更加灵活方便。下面介绍两种常用的属性选择器: 1.1 属性存在选择器 语法:[attribute] 这个选择器可以匹配指定属性的元素。例如: input[type] 这段代码选择所有具有”type”属性的input元素。如果我们想匹配所有…

    css 2023年6月9日
    00
  • css样式层叠规则详解

    当多个 CSS 规则同时作用于同一个 HTML 元素时,就会涉及到 CSS 样式的层叠。而当出现了冲突时,就需要根据层叠规则来确定哪个样式会被最终应用到元素上。以下是 CSS 样式层叠规则的详解。 1. 权重 Specificity 当一个元素被多个 CSS 规则选择到时,就需要根据 Specificity 权重来决定哪一条样式会被优先应用。CSS 的 Sp…

    css 2023年6月10日
    00
  • JS控制弹出悬浮窗口(一览画面)的实例代码

    这里给您详细讲解一下 JS 控制弹出悬浮窗口的实例代码的攻略。下面是具体步骤: 1. 给HTML添加悬浮窗口基本元素 首先,在 HTML 文档中添加弹出悬浮窗口的基本元素,包括触发弹出的按钮和整个弹出窗口的框架结构。代码示例如下: <button id="open-popup">点击打开弹出窗口</button> …

    css 2023年6月10日
    00
  • CSS3使用transition实现的鼠标悬停淡入淡出

    下面我将详细讲解“CSS3使用transition实现的鼠标悬停淡入淡出”的完整攻略,希望能对你有所帮助。 什么是transition? 在介绍“CSS3使用transition实现的鼠标悬停淡入淡出”之前,我们需要先了解一下transition是什么。 transition是CSS3中的一种动画形式,用于实现属性变化时的平滑过渡。通过定义起点、终点和时间的…

    css 2023年6月10日
    00
  • p​h​p​c​m​s​栏目调用详解

    PHPcms栏目调用详解 如果想要在 PHPcms 网站中调用某个栏目下的文章或子栏目信息,可以使用如下代码: {php} $catid = 1;//需要调用的栏目ID $categorys = getcache(‘category_content_1′,’commons’); $catid = intval($catid); $data = array()…

    css 2023年6月9日
    00
  • CSS中的before和:after伪元素使用详解

    当我们使用CSS样式对一个元素进行美化时,经常会遇到一些局限性,如无法插入一些特殊的内容或装饰。这时,我们可以使用CSS中的伪元素::before(伪元素的起始位置)和:after(伪元素的结束位置)。 一、 before(伪元素的起始位置) 1.1 使用方法 在CSS中使用 :before 伪类来插入一个元素。例如: p:before { content:…

    css 2023年6月9日
    00
  • css3实现顶部社会化分享按钮示例

    本文主要讲解如何使用CSS3实现顶部社会化分享按钮,并提供两条示例说明。下面是操作步骤: 一、准备工作 首先,在html文件中加入如下代码: <head> <link rel="stylesheet" href="css/style.css"> </head> <body&gt…

    css 2023年6月10日
    00
  • 微信小程序购物商城系统开发系列-目录结构介绍

    下面是详细讲解“微信小程序购物商城系统开发系列-目录结构介绍”的完整攻略。 目录结构介绍 在开发微信小程序购物商城系统时,了解和掌握项目的目录结构是非常重要的。本文将会对目录结构做一个详细的介绍。 项目目录结构 ├── cloudfunctions // 云开发云函数存放目录 │ ├── db // 数据库操作函数 │ ├── login // 登录功能函数…

    css 2023年6月9日
    00
合作推广
合作推广
分享本页
返回顶部