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

【开发问题记录】回流(Reflow) 和 重绘(Repaint)

文章目录

  • 0. 浏览器控制台关键渲染步骤名词解释
  • 1. 回流(Reflow)
    • 1.1 触发回流的操作
    • 1.2 引起回流的属性
    • 1.3 演示
  • 2. 重绘(Repaint)
    • 2.1 触发重绘的操作
    • 2.2 演示
  • 3. 两者的关系
  • 4. 实际操作
    • 4.1 在点击事件里面修改宽和高,会触发几次回流

在这里插入图片描述
在这里插入图片描述
从上面这个图上,我们可以看到,浏览器渲染过程如下:

  1. 解析HTML,生成DOM树,解析CSS,生成CSSOM树
  2. 将DOM树和CSSOM树结合,生成渲染树(Render Tree)
  3. Layout(回流):根据生成的渲染树,进行回流(Layout),得到节点的几何信息(位置,大小)
  4. Painting(重绘):根据渲染树以及回流得到的几何信息,得到节点的绝对像素
  5. Display:将像素发送给GPU,展示在页面上。这一步其实还有很多内容,比如会在GPU将多个合成层合并为同一个层,并展示在页面中

在这里插入图片描述

0. 浏览器控制台关键渲染步骤名词解释

步骤是否直接影响用户所见说明
样式计算 (Recalculate Style)❌ 间接影响确定CSS规则,但不直接绘制
布局 (Layout/Reflow)❌ 间接影响计算元素位置,不直接可见
绘制 (Paint)❌ 间接影响生成绘制指令,未上屏
分层 (Layer)❌ 间接影响优化绘制结构,不可见
合成 (Composite)✅ 直接影响将各图层合并为最终画面
显示 (Display)✅ 直接影响将像素输出到屏幕

1. 回流(Reflow)

回流也称为布局(Layout),是指浏览器计算网页中元素的位置几何信息的过程。当页面布局或元素的几何属性发生变化时,浏览器需要重新计算元素的位置和大小,这个过程称为回流

1.1 触发回流的操作

  1. 添加或删除可见的DOM元素
  2. 页面初始渲染(无可避免,这个是开销最大的一次)
  3. 浏览器窗口大小改变(resize事件)
  4. 内容变化(如文本改变或图片大小改变)
  5. 激活CSS伪类(如:hover)
  6. 计算offsetWidth、offsetHeight等布局属性(需要返回最新的布局信息,因此浏览器不得不触发回流重绘来返回正确的值)
  7. 元素尺寸或位置发生改变(边距、宽高、边框等)

1.2 引起回流的属性

在这里插入图片描述

1.3 演示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    #app {
      width: 200px;
      height: 200px;
      background-color: red;
    }
  </style>
</head>

<body>
  <div id="app"></div>
  <button>改变</button>
  <script>
    let btnEl = document.querySelector('button');
    function fn() {
      let appEl = document.querySelector('#app');
      appEl.style.width = '300px';
    }
    // 为了方便看,第二个参数,用一个变量传递
    btnEl.addEventListener('click', fn)
  </script>
</body>

</html>

在这里插入图片描述

可以看到,修改这个宽度,会触发回流,触发 layout 布局 操作,这里的layout 就是指回流

2. 重绘(Repaint)

重绘是指当元素的外观样式(如颜色、背景、边框等)发生变化,但不影响布局时,浏览器只需要重新绘制受影响的部分,而不需要重新计算布局

2.1 触发重绘的操作

  • 改变元素的颜色、背景色、透明度等视觉样式
  • 改变元素的边框样式
  • 改变文本样式(如字体、字号、颜色等)
  • 显示/隐藏元素(不改变布局的情况下)

2.2 演示

在这里插入图片描述

可以看到这个地方,就是重绘执行的效果,

3. 两者的关系

  • 回流必定会引起重绘:因为元素位置变化后,需要重新绘制
  • 重绘不一定引起回流:如果只是样式变化不影响布局,则只需重绘

4. 实际操作

4.1 在点击事件里面修改宽和高,会触发几次回流

在这里插入图片描述

其实会触发一次 回流,这里浏览器是有优化的,为了提高效率

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    #app {
      width: 200px;
      height: 200px;
      background-color: red;
    }
  </style>
</head>

<body>
  <div id="app"></div>
  <button>改变</button>
  <script>
    let btnEl = document.querySelector('button');
    function fn() {
      let appEl = document.querySelector('#app');
      appEl.style.width = '300px';
      appEl.style.height = '400px';
    }
    // 为了方便看,第二个参数,用一个变量传递
    btnEl.addEventListener('click', fn)
  </script>
</body>

</html>
http://www.dtcms.com/a/107916.html

相关文章:

  • C++的UDP连接解析域名地址错误
  • React PDF 预览终极优化:30 页大文件不卡,加载快如闪电!
  • 【机器学习】嘿马机器学习(算法篇)第14篇:决策树算法,学习目标【附代码文档】
  • Bigemap手机app数据照片同步至电脑教程
  • 数据结构初阶:二叉树的前中后序三种遍历(递归的暴力美学)
  • 3D意识(3D Awareness)浅析
  • 【Spring Boot 与 Spring Cloud 深度 Mape 之一】剖析 Spring Boot 核心:从快速构建到自动配置原理与实战
  • 零基础 LangGraph 多智能体开发
  • 使用mysqldump进行远程mysql本地定时备份
  • 模板模式——设计模式
  • 记一个.NET AOT交叉编译时的坑
  • 18认识Qt坐标系
  • 青少年编程与数学 02-015 大学数学知识点 01课题、概要
  • 【28BYJ-48】STM32同时驱动4个步进电机,支持调速与正反转
  • vue3二次封装ElDatePicker
  • Vue 组件命名及子组件接收参数命名
  • 汇编学习之《call, return指令》
  • 【前端安全】模板字符串动态拼接HTML的防XSS完全指南
  • 安装IIS 10
  • QML输入控件: RangeSlider的基础用法与样式
  • Flutter中实现中国省份地图
  • dom操作笔记、xml和document等
  • C语言学习笔记
  • 如何平衡元器件成本与性能
  • Day19 -实例:xcx逆向提取+微信开发者工具动态调试+bp动态抓包对小程序进行资产收集
  • React-Markdown详解
  • 解决大小写、保留字与特殊字符问题!Oracle双引号在SQL中的特殊应用
  • 论文阅读笔记:Denoising Diffusion Implicit Models (4)
  • PyTorch 激活函数
  • PyQt5和OpenCV车牌识别系统