CSS 谈谈你对重排和重绘的理解

news2024/11/26 16:56:37

一、前言

   当我们给我们的DOM结构改变或者给DOM结构设置样式时,会触发回流和重绘,但不同的样式改变,是否触发重排和重绘是不确定的。我们有必要深度理解重排和重绘,通过减少重排可以提高性能。

了解浏览器的解析渲染机制:

(1).解析HTML,生成DOM树,解析CSS,生成CSSOM树

(2).将DOM树和CSSOM树结合,生成渲染树(Render Tree)

(3).Layout(回流):根据生成的渲染树,进行回流(Layout),得到节点的几何信息(位置,大小)

(4).Painting(重绘):根据渲染树以及回流得到的几何信息,得到节点的绝对像素

(5).Display:将像素发送给GPU,展示在页面上

 二、重排(回流)

        当DOM的改变影响元素的几何信息(大小,位置),浏览器重新计算元素的几何信息(位置),将其正确的显示在浏览器上,这个过程就叫重排,也叫重绘。

什么情况下会触发重排?

(1).添加或删除可见的DOM元素(display:none;display:block)

(2).元素的尺寸发生变化 (宽度width和高度height,外边框margin,内边框padding)

(3).元素的内容发生变化 也会导致元素的几何信息发生变化

(4).元素的位置 (通过定位调整元素的位置)

(5).页面一开始渲染的时候

(6).浏览器的窗口尺寸变化

除此之外,当我们获取一些特定的值时,也会触发浏览器进行回流,如下:

offsetTop、offsetLeft、 offsetWidth、offsetHeight、scrollTop、scrollLeft、scrollWidth、scrollHeight、clientTop、clientLeft、clientWidth、clientHeight, 除此还包括getComputedStyle方法,原理是一样的

三、重绘

元素的外观被改变时,但是不影响元素的排列分布,浏览器将其重新绘制的过程,就叫重绘,如一些css样式,color, 背景色,以及文本方向的修改,阴影的修改

四、如何减少重排?

(1).如果想设定元素的样式,通过改变元素的 class 类名 (尽可能在 DOM 树的最里层)
(2).避免设置多项内联样式
(3).应用元素的动画,使用 position 属性的 fixed 值或 absolute 值(如前文示例所提)
(4).避免使用 table 布局,table 中每个元素的大小以及内容的改动,都会导致整个 table 的重新计算
(5).对于那些复杂的动画,对其设置 position: fixed/absolute,尽可能地使元素脱离文档流,从而减少对其他元素的影响
(6).使用css3硬件加速,可以让transform、opacity、filters这些动画不会引起回流重绘
(7).避免使用 CSS 的 JavaScript 表达式

示例1:当我们要对元素的样式进行改变时,可以先将元素利用 display:none 将元素隐藏,减少浏览器重排的次数,减少额外的性能消耗

        <div></div>
        <script>
            const div = document.querySelector('div');
            // 先将元素隐藏
            div.style.display = 'none';
            div.style.width = '100px';
            div.style.height = '100px';
            div.style.border = '10px solid red';
            div.style.background = 'red';
            // 样式设置完毕
            div.style.display = 'block';
        </script>

示例2.当我们动态插入多个节点时,每一次插入节点都会触发一次浏览器的回流,如果我们使用DocumentFragment虚拟节点,就可以减少浏览器的回流次数,总而保证浏览器的性能

        <div></div>
        <script>
            const div = document.querySelector('div');
            const fruits = ['Apple', 'Orange', 'Banana', 'Melon'];
            // 创建了虚拟DOM节点
            const fragment = document.createDocumentFragment();

            fruits.forEach((fruit) => {
                const li = document.createElement('li');
                li.innerHTML = fruit;
                fragment.appendChild(li);
            });
            // 一次性将节点插入到 DOM div的后面
            div.appendChild(fragment);
        </script>

运行结果

 新增的DOM结果已经添加到div后面

示例3:通过类名合并样式 也可以减少重排的次数.

未合并样式之前,通过js 依次对样式进行操作,每操作一次,就有可能进行一次回流或者重绘

        <div></div>
        <script>
            const div = document.querySelector('div');
            // 先将元素隐藏
            div.style.width = '100px';
            div.style.height = '100px';
            div.style.border = '10px solid red';
            div.style.background = 'red';
            // 样式设置完毕
        </script>

当我们合并样式,通过操作类名 来设置样式。只进行一次重排和重绘就达到了效果

        <style>
            .active {
                width: 100px;
                height: 100px;
                background: red;
                border: 10px solid red;
            }
        </style>

        <div></div>

        <script>
            const div = document.querySelector('div');
            div.style.background;
        </script>

五、重排和重绘的区别

     重排是一种更加耗费性能的操作,因为它需要对元素的几何属性、布局信息和文本流进行重新计算;而重绘则是一种相对较少耗费性能的操作,因为它只需要重新绘制元素的样式即可。因此,尽量避免在页面中频繁进行重排操作,可以通过对多个DOM操作进行批量处理,减少重排的次数,从而提升页面的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/629582.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++中的数组理解与应用

数组的数据结构 数组是最基本的数据结构&#xff0c;关于数组的面试题也屡见不鲜&#xff0c;本文罗列了一些常见的面试题&#xff0c;仅供参考。目前有以下18道题目。 数组求和 求数组的最大值和最小值 求数组的最大值和次大值 求数组中出现次数超过一半的元素 求数组中元…

详解c++---二叉搜索树的讲解和模拟实现

目录标题 二分查找的优缺点搜索二叉树的规则搜索二叉树的特性二叉搜索树的性能分析准备工作二叉搜索树的插入函数二叉搜索树的打印函数二叉搜索树的查找函数二叉搜索树的删除函数拷贝构造函数赋值重载析构函数递归版本的find函数递归版本的插入递归的删除方法搜索树的应用模型 …

burpsuite+xray实现联动测试(手动分析和自动化测试同时进行)

目的&#xff1a;安全测试过程中手动分析测试与xray自动化扫描测试结合&#xff0c;这样可以从多层保障安全测试的分析&#xff0c;针对平台业务接口量大的安全测试是十分有用的&#xff0c;可以实现双向测试同时开始。 xray简介 xray 是一款功能强大的安全评估工具&#xff…

MySQL数据库基础 05

第五章 排序与分页 1. 排序数据1.1 排序规则1.2 单列排序1.3 多列排序 2. 分页2.1 背景2.2 实现规则2.3 拓展 1. 排序数据 1.1 排序规则 使用 ORDER BY 子句排序 ASC&#xff08;ascend&#xff09;: 升序DESC&#xff08;descend&#xff09;:降序 ORDER BY 子句在SELECT语句…

chatgpt赋能python:Python如何避免代码重复

Python如何避免代码重复 作为一名有10年Python编程经验的工程师&#xff0c;我深知代码重复会降低程序的可维护性&#xff0c;使代码变得混乱和难以扩展。因此&#xff0c;我想在这篇文章中介绍一些技术和最佳实践来避免Python代码重复。 为什么要避免重复代码&#xff1f; …

idea插件开发-Library

库是模块所依赖的已编译代码&#xff08;例如 JAR 文件&#xff09;的存档。IntelliJ 平台支持三种类型的库&#xff1a;1、Module Library&#xff1a;库类只在本模块可见&#xff0c;库信息记录在模块.iml文件中。2、Project Library&#xff1a;库类在项目中可见&#xff0c…

Scrapy框架 增量式、分布式爬虫

文章目录 Scrapy框架1.增量爬虫2.分布式爬虫 Scrapy框架 1.增量爬虫 实现思路 利用redis集合数据类型 1.获取到url后进行判断 是否重复&#xff1f;&#xff1f;&#xff1f; 2.第一次爬取到数据&#xff0c;爬取完成写入该记录... &#xff08;两个点: 必须要没有爬过的数据…

chatgpt赋能python:Python实现计算器:从入门到实现

Python实现计算器&#xff1a;从入门到实现 计算器是计算机科学中最基础并且实用的东西之一。Python作为一种高级编程语言&#xff0c;它可以用于编写一个功能完整的计算器。在本文中&#xff0c;我们将介绍Python如何实现一个简单的、交互式的计算器&#xff0c;通过使用基本…

【MySQL 数据库】7、SQL 优化

目录 一、插入数据优化(1) insert 语句① 批量插入数据② 手动控制事务③ 主键顺序插入&#xff0c;性能要高于乱序插入 (2) load 大批量插入数据【☆❀ 二、主键优化(1) 数据组织形式(2) 页分裂(3) 页合并(4) 主键设计原则 三、orber by 优化四、group by 优化五、limit 优化&…

chatgpt赋能python:Python怎么五个一行输出?

Python怎么五个一行输出&#xff1f; 在Python中&#xff0c;实现五个一行输出并不难&#xff0c;只需要使用循环语句即可。下面&#xff0c;我们将介绍如何使用Python实现五个一行输出。 实现方法 首先&#xff0c;我们需要定义一个包含一定数量元素的列表或字符串。然后&a…

chatgpt赋能python:Python中如何生成随机浮点数?

Python中如何生成随机浮点数&#xff1f; 随机数在计算机编程中常常使用&#xff0c;而在Python中&#xff0c;我们可以使用内置的random模块来产生随机数。不同于整数随机数&#xff0c;如果想要产生浮点数的随机数&#xff0c;我们就需要进行一些额外的操作。 产生浮点数类…

Baumer工业相机堡盟工业相机如何使用BGAPISDK控制相机数据流的开启和关闭(C++)

Baumer工业相机堡盟工业相机如何使用BGAPISDK控制相机数据流的开启和关闭&#xff08;C&#xff09; Baumer工业相机Baumer工业相机BGAPI SDK的技术背景Baumer工业相机使用BGAPISDK控制相机数据流的方式1.引用合适的类文件2.使用BGAPISDK控制相机数据流的方式2.使用BGAPISDK控制…

Pascal Voc 2007 2012

1、简介 PASCAL 全称&#xff1a;Pattern Analysis, Statical Modeling and Computational Learning PASCAL VOC&#xff08;The PASCAL Visual Object Classes &#xff09;是一个经典的计算机视觉数据集&#xff0c;由牛津大学、马里兰大学和微软剑桥研究院的研究人员创建的…

HiveSQL初级题目

文章目录 Hive SQL题库(初级)第一章 环境准备1.1 建表语句1.2 数据准备1.3 插入数据 第二章 简单查询2.1 查找特定条件2.1.1 查询姓名中带“冰”的学生名单2.1.2 查询姓“王”老师的个数2.1.3 检索课程编号为“04”且分数小于60的学生的课程信息&#xff0c;结果按分数降序排列…

chatgpt赋能python:Python如何保存文件到文件夹?

Python如何保存文件到文件夹&#xff1f; Python是一种高级编程语言&#xff0c;广泛应用于数据科学、网络编程、自动化任务等领域。其中&#xff0c;保存文件到文件夹是Python编程中的重要功能。本文将介绍Python如何保存文件到文件夹的方法&#xff0c;包括如何创建文件夹和…

动态网站JSP技术

文章目录 零、本节学习目标一、JSP概述&#xff08;一&#xff09;什么是JSP1、JSP的概念2、JSP的特征&#xff08;二&#xff09;编写第一个JSP1、创建Web项目2、修改Artifact名称&#xff0c;重新部署项目3、创建欢迎JSP页面4、启动服务器&#xff0c;查看结果 二、JSP基本语…

chatgpt赋能python:Python怎么产生方波?

Python怎么产生方波&#xff1f; 随着科技的发展&#xff0c;数字信号处理在各个领域都有广泛的应用&#xff0c;产生方波是其中一个基础的信号处理技术。在Python中&#xff0c;可以通过一些简单的代码来产生方波信号。本文将介绍如何使用Python产生方波。 什么是方波信号&a…

牛客小白赛复盘] 牛客小白月赛74

[牛客小白赛复盘] 牛客小白月赛74 总结A 简单的整除1. 题目描述2. 思路分析3. 代码实现 B 整数划分1. 题目描述2. 思路分析3. 代码实现 C 传送阵1. 题目描述2. 思路分析3. 代码实现 D 修改后的和1. 题目描述2. 思路分析3. 代码实现 E 幼稚园的树21. 题目描述2. 思路分析3. 代码…

一分钟学一个 Linux 命令 - tar

前言 大家好&#xff0c;我是 god23bin。今天给大家带来的是 Linux 命令系列&#xff0c;每天只需一分钟&#xff0c;记住一个 Linux 命令不成问题。今天&#xff0c;我们要介绍的是一个常用且强大的命令&#xff1a;tar。 什么是 tar 命令&#xff1f; tar 是 tape archive…

C语言经典题目(三)

C站的小伙伴们&#xff0c;大家好呀&#xff01;&#x1f60a;&#x1f60a;✨✨这一篇是C语言之经典题目篇&#xff0c;除程序设计&#xff0c;还有一些不错的程序分析&#xff0c;快来和我一起进入C语言的世界吧&#xff01;✨✨✨ &#x1f495;C语言其他刷题篇在这里哦&…