重绘和回流以及如何优化

重绘和回流以及如何优化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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • NoSuchMethodException分析

    NoSuchMethodException分析NoSuchMethodException分析很多同行差不多都遇到过这个异常,下面我来分析一下:在曾经的一个项目中遇到过,现在拿具体的例子分析下,异常描述如下:java.lang.NoSuchMethodException:com.haotian.struts.actionAddBussinessAction.deleteBussiness(org.apac

    2022年6月26日
    28
  • 国外无限php空间,关于无限空间和美国PHP主机不限制流量存储的认知[通俗易懂]

    国外无限php空间,关于无限空间和美国PHP主机不限制流量存储的认知[通俗易懂]虽然我们看到很多的主机商都从原来的虚拟主机转变成如今较大青睐的云服务器、独立服务器产品。但是还是有很多用户,尤其是外贸网站用户,包括有些习惯使用虚拟主机的网友会选择虚拟主机。我们在选择虚拟主机的时候,看到有商家的套餐的配置,会看到有对于硬件配置限制或者不限制的无限空间。其实美国PHP主机不限制流量或者不限制存储空间的做法很早就已经有过,比如我们早年熟悉的Bluehost、JustHost等主机商几…

    2022年9月21日
    0
  • ITIL该研究的结论(互联网思维的结合)

    ITIL该研究的结论(互联网思维的结合)

    2022年1月8日
    44
  • linux怎么配置tomcat的端口,linux下安装tomcat及iptables开放端口

    linux怎么配置tomcat的端口,linux下安装tomcat及iptables开放端口在Linux运行Tomcat之前必须安装jdk,并配置环境变量。以下是Tomcat的安装配置:1.下载安装包解压以tomcat7为例,https://tomcat.apache.org/download-70.cgi,下载apache-tomcat-7.0.88.tar.gz即可可在/usr下建以tomcat目录,将安装包解压在此目录下即可tar-zxv-fapache-tomcat-7.0…

    2022年5月15日
    35
  • NFS服务器搭建与配置[通俗易懂]

    NFS服务简介什么是NFS?NFS就是NetworkFileSystem的缩写,它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。​ NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,在使用上相当便利;NFS一般用来存储共享视频,图片等静态数据。NFS挂…

    2022年4月18日
    112
  • 网站优化工具-YUI Compressor「建议收藏」

    网站优化工具-YUI Compressor「建议收藏」一、简介YUICompressor,专用于压缩js和css文件,可以有效降低js和css文件占用的空间;如,将使用YUICompressor压缩过的js和css文件部署到网站的生产环境,有效降低浏览器下载相关资源的时延,提升用户体验。二、压缩工具YUI-Compressor英文官网:http://yui.github.io/yuicompressor/GitHub-YUI:https://github.com/yui/yuicompressor在线YUI:http://ganquan.inf

    2022年7月18日
    17

发表回复

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

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