【CSS】回流/重排与重绘

2023-11-09

  • 浏览器使用流式布局模型 (Flow Based Layout)。
  • 浏览器会把HTML解析成DOM,把CSS解析成CSSOMDOMCSSOM合并就产生了Render Tree
  • 有了RenderTree,我们就知道了所有节点的样式,然后计算他们在页面上的大小和位置,最后把节点绘制到页面上。
  • 由于浏览器使用流式布局,对Render Tree的计算通常只需要遍历一次就可以完成,但table及其内部元素除外,他们可能需要多次计算,通常要花3倍于同等元素的时间,这也是为什么要避免使用table布局的原因之一。
    在这里插入图片描述

回流/重排

回流的基本概念

Render Tree中部分或全部元素的尺寸、结构、或某些属性发生改变时,浏览器重新渲染部分或全部文档的过程称为回流。

会引起浏览器回流的操作

  • 页面首次渲染
  • 浏览器窗口大小发生改变
  • 元素尺寸或位置发生改变
  • 元素内容变化(文字数量或图片大小等等)
  • 元素字体大小变化
  • 添加或者删除可见的DOM元素
  • 激活CSS伪类(例如::hover
  • 查询某些属性或调用某些方法,比如说:
    offsetTop(当前元素相对于其 offsetParent 元素的顶部内边距的距离)、
    offsetLeft(当前元素左上角相对于 HTMLElement.offsetParent 节点的左边界偏移的像素值)、 offsetWidth
    offsetHeight
    scrollTop(对象最顶端和窗口中可见内容最顶端之间的距离)、
    scrollLeft(对象左边界和窗口中目前可见内容最左端之间的距离)、
    scrollWidth(对象的滚动宽度)、
    scrollHeight(对象的滚动高度)、
    clientTop(元素顶部边框的高度)、
    clientLeft
    clientWidth
    clientHeight
    除此之外,当我们调用getComputedStyle方法,或者IE里的currentStyle时,也会触发回流,原理是一样

在这里插入图片描述

重绘

重绘的概念

当页面中元素样式的改变并不影响它在文档流中的位置时(例如:colorbackground-colorvisibility等),浏览器会将新样式赋予给元素并重新绘制它,这个过程称为重绘。

浏览器优化机制

现代的浏览器都是很聪明的,由于每次重排都会造成额外的计算消耗,因此大多数浏览器都会通过队列化修改并批量执行来优化重排过程。浏览器会将修改操作放入到队列里,直到过了一段时间或者操作达到了一个阈值,才清空队列。但是!当你获取布局信息的操作的时候,会强制队列刷新,比如当你访问以下属性或者使用以下方法:

offsetTop、offsetLeft、offsetWidth、offsetHeight
scrollTop、scrollLeft、scrollWidth、scrollHeight
clientTop、clientLeft、clientWidth、clientHeight
getComputedStyle()
getBoundingClientRect

如何减少回流和重绘

  1. 合并多次对DOM和样式的修改
  2. 批量修改DOM
    使元素脱离文档流;对其进行多次修改;将元素带回到文档中
  3. 避免触发同步布局事件
    避免频繁读取会引发回流/重绘的属性,如果确实需要多次使用,就用一个变量缓存起来。
  4. 对具有复杂动画的元素使用绝对定位,使它脱离文档流,否则会引起父元素及后续元素频繁回流。
  5. 尽量避免使用table布局、避免使用CSS表达式(如calc()
  6. 尽可能再DOM树的最末端改变class

隐藏元素的方法

display: none:渲染树不会包含该渲染对象,因此该元素不会在页面中占据位置,也不会响应绑定的监听事件。
visibility: hidden:元素在页面中仍占据空间,但是不会响应绑定的监听事件。
opacity: 0:将元素的透明度设置为 0,以此来实现元素的隐藏。元素在页面中仍然占据空间,并且能够响应元素绑定的监听事件。
position: absolute:通过使用绝对定位将元素移除可视区域内,以此来实现元素的隐藏。
z-index: 负值:来使其他元素遮盖住该元素,以此来实现隐藏。
clip/clip-path :使用元素裁剪的方法来实现元素的隐藏,这种方法下,元素仍在页面中占据位置,但是不会响应绑定的监听事件。
transform: scale(0,0):将元素缩放为 0,来实现元素的隐藏。这种方法下,元素仍在页面中占据位置,但是不会响应绑定的监听事件。


学习参考
1.浏览器的回流与重排
2.你真的了解回流和重绘吗

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【CSS】回流/重排与重绘 的相关文章

  • 仅 IE9_有时_会忽略

    我们正在开发一个大量使用 这是典型的 TYPO3 网站 该网站是在子目录中开发的 稍后将被重新定位到顶级目录 因此我们无法轻易删除 我们的客户告诉我们 有时当她浏览新页面时 她得到的页面内容没有应用布局 我们对此进行了调试 仅在 IE9 中
  • 我可以在元标记中使用 HTML 字符实体吗?

    我有一个有两种语言的网站 英语和中文 在使用 UTF 8 字符集的英文主页中 我有 例如 这出现在搜索结果中 我想将其更改为 在哪里 20013 25991 是 中文 的 ISO 实体 搜索结果中会显示为 中文 吗 我无法将 中文 直接粘贴
  • 使用反增量更改 z-index

    我尝试制作一个图像滑块 当鼠标悬停在一个点上时 它将显示图片 我也尝试使用在图像之间切换z index但什么也没动 slider counter reset index 1000 slider input name slide switch
  • 引导导航栏菜单与文本重叠

    我使用最新版本的引导程序 当我调整屏幕浏览器的大小时 使用小切换按钮下拉导航栏时 导航栏会重叠页面上的文本 而不是向下推页面内容 我已经多次研究过这个问题 我尝试将 padding bottom 放在导航栏上 将 padding top 放
  • 当共享相同的行和列时,将网格项设置为不重叠

    现在 当两个网格项共享相同的行和列时 它们会相互重叠 div class some grid container div Item 1 div div Item 2 div div 我如何让它们不重叠 当共享相同的行和列时 其行为可能类似于
  • html 选择列表 - 通过传入变量获取文本值?

    我有一个显示列表语言的选择列表
  • 我如何能够以两行显示标题,并且每行的字体大小不同?

    我正在使用 Google Chart API 创建时间线图 并希望将图的标题修改为两行 问题 我如何能够显示具有不同字体大小的两线图表标题 电流输出 理想输出 相关研究 我唯一能找到的是有人试图用饼图来做到这一点 但我尝试了但无法使其发挥作
  • Django:按钮链接

    我是一名 Django 新手用户 尝试创建一个按钮 单击该按钮会链接到我网站中的另一个页面 我尝试了一些不同的例子 但似乎没有一个对我有用 举个例子 为什么这不起作用
  • 暂停除了已激活的玩家之外的所有其他玩家。

    我有这个插件 它可以将不同的样式应用于 html5
  • 如何使用 JavaScript 创建链接?

    我有一个标题字符串和一个链接字符串 我不知道如何将两者放在一起以使用 JavaScript 在页面上创建链接 任何帮助表示赞赏 我试图解决这个问题的原因是因为我有一个 RSS 源并且有一个标题和 URL 列表 我想将标题链接到 URL 以使
  • 响应式图像 - srcset 和尺寸属性 - 如何正确使用两者:基于设备像素比和基于视口的选择一起?

    到目前为止 我经常读到这个问题 并且它也发生在我自己的项目中 这里介绍一下我到目前为止所发现的关于 srcset 和 size 属性的内容 关于如何使用有两种不同的可能性srcset 属性 来源 w3c http w3c github io
  • 有角度的动态背景图片

    在 html 模板中 我有这种带有动态图像的样式 div style background none width 200px height 150px div 它适用于网络浏览器和 Android 浏览器 但是 使用 style 的动态背景
  • 图像无法在带有 DOM 的 IE 中加载:控制台中的 7009 错误(无法解码)

    当在 IE 中的单个页面上加载许多图像时 在 IE11 中重现 其中一些图像开始加载失败 并在控制台中出现类似以下警告的内容 DOM7009 无法解码 URL 处的图像 某些唯一的 url 当我查看网络流量时 似乎确实从服务器收到了每个图像
  • 删除子元素上的 CSS 过滤器

    我的 CSS 代码有问题 正如您所看到的 我在 li 元素上有过滤器 但它覆盖了其他元素 我需要使其他两个元素没有过滤器 有没有可能这样做 main width 300px height 300px background color blu
  • 为什么 IE8 在我的图像锚标记上添加底部边框?

    我知道 这很可悲 但今天早上 IT 刚刚在我的机器上安装了 IE8 我立刻遇到了一个明显的问题 尽管我知道答案就在我面前 但我已经把它搞砸了太久了 首先 这是网站 www mchenry edu http www mchenry edu 在
  • 为 Angular2 中的组件加载多个样式表

    我正在构建一个 angular2 应用程序 当我尝试为同一组件加载多个样式表时 我面临多个问题 这是我正在做的代码 import Component from angular core Component selector my tag t
  • 如何选择具有“A”类但不具有“B”类的 div?

    我有一些 div div class A Target div div class A B NotMyTarget div div class A C NotMyTarget div div class A D NotMyTarget di
  • php - 解析html页面

    div divbox div p para1 p p para2 p p para3 p table class table tr td td tr table p para4 p p para5 p 有人可以告诉我如何解析这个 html
  • Firefox 不会在使用 jQuery AJAX 加载的内容上呈现 CSS 样式

    我有一个网站 允许用户对书籍和文章发表评论 主表单有一个搜索输入 用于查找相关书籍或文章 来源 我使用 jQuery 根据输入的搜索词从外部站点动态加载新源 然后还使用 AJAX 返回列表中的源 我有两个问题 现在 在用户输入四个字符后 j
  • 在 Nexus 7 2013 上更改方向时 CSS 媒体查询不起作用

    我目前正在我的笔记本电脑 台式电脑和 Nexus 7 2013 上测试 CSS 媒体查询 除了 Nexus 7 之外 它们在台式机和笔记本电脑上都运行良好 当我更改方向时 除非刷新页面 否则样式不会应用 例如 以纵向模式握住设备时 页面正常

随机推荐

  • 报表设计

    最近在做任务报表方面的工作 之前一直以为查询和报表是一样东西 虽说 报表是查询的一种展示模式 但是做分析时 还是应该将以区别 报表 多样的格式 动态的数据 报表是我们想要数据展示的一种形态 就像是各种图表 例如 你想查询小明的名字 查询可以
  • 使用Nginx实现多个网站代理[多端口监听][django][资源服务器]

    使用Nginx实现多个网站代理 导航 原文链接 使用Nginx实现多个网站代理 导言 nginx是网站开发后期一个不可缺少的应用 nginx的作用是 请求代理 监听请求并转发给对应端口的进程处理 资源代理 使用nginx直接将服务器资源共享
  • IntelliJ IDEA部署tomcat时出现No artifacts marked for deployment

    这种错误主要是因为没有设置导出包 解决方法 File gt Project Structure gt Artifacts 然后点击ok 然后记得apply ok 此时再回到问题所在 点击Fix即可 或者如下 启动 打开浏览器复制下面网址 h
  • 数学建模--决策树的预测模型的Python实现

    目录 1 算法流程简介 2 算法核心代码 3 算法效果展示 1 算法流程简介 决策树的应用 对泰坦尼克号数据集成员进行预测生死 算法流程还是比较简单的 简单学习一下决策树跟着注释写即可 文章参考 https zhuanlan zhihu c
  • GROUP BY分组单个和多个字段不同条件所查询出来的结果不同

    第一次查询 代码如下 select from test 结果中 按照b列来分 则是 5个a 3个b 按照c列来分 则是 4个甲 4个乙 第二次 查询按照 b列来分组 代码如下 select count a b from test group
  • cordova-plugin-file-transfer cordova plugin下载不到问题解决记录

    环境 cordova 11 1 0 node 16 前提 安卓项目需要支持一些功能 升级到androidX所以一些插件需要更新 使用github方式可能会报ssh需要publicKey相关问题 不想用私人账号进行git github com
  • c++ uint32转为int_轻松实现C/C++各种常见进制相互转换

    这篇文章主要介绍了轻松实现C C 各种常见进制相互转换 文中通过示例代码介绍的非常详细 对大家的学习或者工作具有一定的参考学习价值 需要的朋友们下面随着小编来一起学习学习吧 adsbygoogle window adsbygoogle pu
  • 融云「百幄」之视频会议和直播,让办公桌无限延伸

    2020 年 为避免人员流动造成聚集性感染 全世界各地不少企业开始允许员工居家办公 跨地域 跨终端协同办公行业迎来井喷式增长 视频会议 疫 外爆发 关注 融云 RongCloud 了解协同办公平台更多干货 2022 年 全球疫情仍在蔓延 对
  • Qt,QEvent

    QEvent Class The QEvent class is the base class of all event classes Event objects contain event parameters More include
  • Gabor滤波器与特征提取

    一 Gabor滤波器 Gabor滤波器 最主要使用优势体现在对物体纹理特征的提取上 二维Gabor基函数能够很好地描述哺乳动物初级视觉系统中一对简单视觉神经元的感受野特性 随着小波变换和神经生理学的发展 Gabor变换逐渐演变成二维Gabo
  • HTTP项目常见状态码笔记(200,302,400,403,404,405,500...),

    目录 认识 状态码 status code 出现200 403 Forbidden 出现404 404 Not Found 出现 405 Method Not Allowed 出现 500 Internal Server Error 504
  • windows如何让电脑朗读你的文字

    在使用电脑的过程中 常常需要文字能够自动朗读 那么你是如何解决的呢 其实可以不借助任何外部软件 而使用windows记事本就能简单将任意文字转化成语音朗读 步骤1 新建一个记事本 注意记事本的默认后缀名为 txt 步骤2 打开记事本 在记事
  • python库和模块的区别_python中模块、包、库的区别和使用

    模块 就是 py文件 里面定义了一些函数和变量 需要的时候就可以导入这些模块 包 在模块之上的概念 为了方便管理而将文件进行打包 包目录下第一个文件便是 init py 然后是一些模块文件和子目录 假如子目录中也有 init py 那么它就
  • Docker 数据迁移

    问题描述 docker存储目录磁盘空间不够了 需要迁移到新的磁盘 忒扣了 迁移分析 迁移数据前向客户说明时间 提前告知业务部门系统维护相关事宜 查看中间件状态 应用服务是否正常 正常情况下才可停止服务进行下一步 停止应用 中间件等程序 停止
  • 解决问题记录10:JAVA调用,kettle资源库连接mysql8小时后报错问题

    先说解决方法 最终我的解决方式是使用心跳机制 创建了一个很简单的查询作业 让它每3小时执行一次 这几天在凌晨1点是跑kettle作业时遇到了一个问题 报错如下 The last packet successfully received fr
  • Python爬取ppt工作项目模板

    前言 ppt模板爬取 大约有一百多套工作项目ppt模板 需要的小伙伴可以通过以下程序来下载 1 爬取程序 author 爱分享的山哥 import requests from bs4 import BeautifulSoup import
  • 服务器上的网站突然打不开了,网站突然打不开是什么情况!

    对于一个网站来说 宣传企业 发展业务是根本目的 保证网站能打开却是最基本的需求 如果一个网站隔三差五就打不开 对于用户体验和网站排名都有很大的影响的 也是让很多站长非常烦恼的地方 下面小编就来跟大家聊一下网站突然打不开是什么情况 第一 域名
  • 【译】无缓冲 I/O 会让你的 Rust 程序变慢

    文章标题 译 无缓冲 I O 会让你的 Rust 程序变慢 Unbuffered I O Can Make Your Rust Programs Much Slower 译文 原文链接 https era co blog unbuffere
  • WPFPasswordBox绑定问题

    PassWordBox的Password属性为什么不能绑定 Introduction WPF中的PassWordBox是用于输入密码的控件 它的Password属性是用于获取或设置PassWordBox中的密码 但是 有很多开发者在使用WP
  • 【CSS】回流/重排与重绘

    回流 重排与重绘 回流 重排 回流的基本概念 会引起浏览器回流的操作 重绘 重绘的概念 浏览器优化机制 如何减少回流和重绘 隐藏元素的方法 浏览器使用流式布局模型 Flow Based Layout 浏览器会把HTML解析成DOM 把CSS