重绘和回流以及如何优化

重绘和回流以及如何优化1 浏览器渲染机制浏览器采用流式布局模型 FlowBasedLay 浏览器会把 HTML 解析成 DOM 把 CSS 解析成 CSSOM DOM 和 CSSOM 合并就产生了渲染树 RenderTree 有了 RenderTree 我们就知道了所有节点的样式 然后计算他们在页面上的大小和位置 最后把节点绘制到页面上 由于浏览器使用流式布局 对 RenderTree 的计算通常只需要遍历一

1、浏览器渲染机制

2、回流 (refolw)

节点的几何属性或者布局发生改变被称为回流,一个元素的回流可能会导致了其所有子元素以及DOM中紧随其后的节点、祖先节点元素的随后的回流,所以一个节点的回流会引起页面某个部分甚至整个页面的回流。

3、重绘(repaint)

节点的样式改变且不影响布局的,比如color,visibility等,称为重绘。

重绘不一定回流,回流一定重绘。

4、 浏览器优化

5、减少回流和重绘

5.1、批量修改DOM或者样式

const el = document.getElementById('test'); el.style.padding = '5px'; el.style.borderLeft = '1px'; el.style.borderRight = '2px'; //可以优化为使用cssText或者class统一添加 const el = document.getElementById('test'); el.style.cssText += 'border-left: 1px; border-right: 2px; padding: 5px;'; //或者 const el = document.getElementById('test'); el.className += ' active';
function appendDataToElement(appendToElement, data) { let li; for (let i = 0; i < data.length; i++) { li = document.createElement('li'); li.textContent = 'text'; appendToElement.appendChild(li); } } const ul = document.getElementById('list'); appendDataToElement(ul, data);
const ul = document.getElementById('list'); const fragment = document.createDocumentFragment(); appendDataToElement(fragment, data); ul.appendChild(fragment);
function appendDataToElement(appendToElement, data) { let li; for (let i = 0; i < data.length; i++) { li = document.createElement('li'); li.textContent = 'text'; appendToElement.appendChild(li); } } const ul = document.getElementById('list'); ul.style.display = 'none'; appendDataToElement(ul, data); ul.style.display = 'block';

5.2、避免触发同步UI渲染

function initP() { for (let i = 0; i < paragraphs.length; i++) { paragraphs[i].style.width = box.offsetWidth + 'px'; } }

这段代码看上去是没有什么问题,可是其实会造成很大的性能问题。在每次循环的时候,都读取了box的一个offsetWidth属性值,然后利用它来更新p标签的width属性。这就导致了每一次循环的时候,浏览器都必须先使上一次循环中的样式更新操作生效,才能响应本次循环的样式读取操作。每一次循环都会强制浏览器刷新队列。我们可以优化为:

const width = box.offsetWidth; function initP() { for (let i = 0; i < paragraphs.length; i++) { paragraphs[i].style.width = width + 'px'; } }

5.3、对于复杂动画效果,使用绝对定位让其脱离文档流

例子中在未优化前,元素未绝对定位,依靠margin的变化进行动画,引起大量的回流,而当使用了绝对定位,明显感觉FPS稳定在每秒60次,也就是16.6ms一次。

5.4、css3硬件加速(GPU加速)

  1. 使用css3硬件加速,可以让transform、opacity、filters这些动画不会引起回流重绘 。
  2. 对于动画的其它属性,比如background-color这些,还是会引起回流重绘的,不过它还是可以提升这些动画的性能
    如何使用
    常见的触发硬件加速的css属性:
    transform
    opacity
    filters
    Will-change
    效果
    我们可以先看个例子。我通过使用chrome的Performance捕获了动画一段时间里的回流重绘情况,实际结果如下图:
    1264683-20190902164913999-466046388.png








转载于:https://www.cnblogs.com/chenlei987/p/11447484.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233263.html原文链接:https://javaforall.net

(0)
上一篇 2025年8月3日 上午9:01
下一篇 2025年8月3日 上午9:22


相关推荐

  • Unity Sprite Altas「建议收藏」

    Unity Sprite Altas「建议收藏」SpriteAtlas(精灵图集)SpriteAtlas针对现有的图集打包系统SpritePacker在性能和易用性上的不足,进行了全面改善。除此之外,相比SpritePacker,SpriteAtlas将对精灵更多的控制权交还给用户。由用户来掌控图集的打包过程以及加载时机,更加利于对系统性能的控制。SpriteAtlas的主要有以下三个功能:1.创建、编辑图集以及设定图集参数2.添加图集Variant(变种)3.运行时访问图集下面将通过具体案例来分别展示以上三个功能。创建

    2025年8月7日
    2
  • 基因表达数据中信息基因和基因调控网络 第六周报告

    基因表达数据中信息基因和基因调控网络 第六周报告基因表达数据中信息基因和基因调控网络第六周报告本周主要看了 基因芯片技术 基因表达数据的聚类分析 两篇论文 初步了解了基因芯片和聚类分析的含义 一 基因芯片技术基因芯片技术是同时将大量的探针分子固定在固相支持物上 借助核酸分子杂交配对的特性 对 DNA 样品的序列信息进行高效的解读和分析 基因芯片的主要类型 原位合成 较复杂 合成点样 大多公司使用 显色和分析测定方法 荧光法 质谱法 化

    2026年3月17日
    1
  • SSE,SSR,SSE 的关系

    SSE,SSR,SSE 的关系一 SSE 和方差 该统计参数计算的是拟合数据和原始数据对应点的误差的平方和 计算公式如下 SSE 越接近于 0 说明模型选择和拟合更好 数据预测也越成功 接下来的 MSE 和 RMSE 因为和 SSE 是同出一宗 所以效果一样二 MSE 均方差 该统计参数是预测数据和原始数据对应点误差的平方和的均值 也就是 SSE n 和 SSE 没有太大的区别 计算公式如下三 RMSE 均方

    2026年3月17日
    2
  • linux内存不足导致tomcat宕机

    linux内存不足导致tomcat宕机情况,正常运行的服务器,突然tomcat不能访问了因为服务器的内存是2g的,所以就怀疑是内存不够了,所导致开始排查ps-ef|greptomcat[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TTLyQ5EC-1585835537446)(E:\Workspaces\Markdown\linux\记一次内存不够的情况.assets\image-…

    2022年7月23日
    11
  • 预训练模型还要训练吗_多模态预训练模型

    预训练模型还要训练吗_多模态预训练模型若使用已保存好的镜像reid_mgn:v1,在本机上可按如下操作训练#1.进入已保存环境的镜像(reid_mgn:v1(8.48G)、pytorch/pytorch:1.0.1-cuda10.0-cudnn7-devel_mgnreid(6.37G))nvidia-dockerrun-it–rm-v/home/lc-deep/sdr:/home/personReID…

    2022年10月6日
    4
  • 惠普笔记本连接不了无线网_惠普电脑连接不了无线网

    惠普笔记本连接不了无线网_惠普电脑连接不了无线网关于惠普电脑连不上无线网的问题,一些网友不太清楚该怎么办,那么下面就由学习啦小编来给你们说说惠普电脑连不上无线网的解决方法吧,希望可以帮到你们哦!惠普电脑连不上无线网的解决方法一:电脑连不上wifi,图标会有黄色叹号(我的连上所以没有),在右下角右键点击无线wifi图标,再点击打开网络和共享中心。在网络和共享中心里面点击左上角的更改适配器设置。进去以后一般可以看到3个连接,一个是蓝牙的,一个是有线…

    2022年8月13日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号