首页 > 其他分享 >浏览器的回流和重绘

浏览器的回流和重绘

时间:2023-06-22 17:12:50浏览次数:34  
标签:浏览器 DOM 元素 回流 重绘 属性

1、回流重绘的概念 回流:当Render Tree中部分或全部元素的尺寸、结构、或某些属性发生改变时,浏览器重新渲染部分或全部文档的过程 重绘:当页面中元素样式的改变并不影响它在文档流中的位置时,浏览器会将新样式赋予给元素并重新绘制它的过程

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

【回流必将引起重绘,重绘不一定会引起回流】

2、回流的常见场景

页面首次渲染 、浏览器窗口大小发生改变 、元素尺寸或位置发生改变 、元素内容变化(文字数量或图片大小等等)、

元素字体大小变化、 添加或者删除可见的DOM元素 、激活CSS伪类(例如::hover)、 查询某些属性或调用某些方法

 

一些常用且会导致回流的属性和方法:

clientWidth、clientHeight、clientTop、clientLeft offsetWidth、offsetHeight、offsetTop、

offsetLeft scrollWidth、scrollHeight、scrollTop、scrollLeft scrollIntoView()、

scrollIntoViewIfNeeded() getComputedStyle() getBoundingClientRect() scrollTo()

3、减少回流重绘的优化方案

CSS

  • 避免使用table布局。 尽可能在DOM树的最末端改变class。
  • 避免设置多层内联样式。
  • 将动画效果应用到position属性为absolute或fixed的元素上。 避免使用CSS表达式(例如:calc())

JavaScript

  • 避免频繁操作样式,最好一次性重写style属性,或者将样式列表定义为class并一次性更改class属性。
  • 避免频繁操作DOM,创建一个documentFragment,在它上面应用所有DOM操作,最后再把它添加到文档中。
  • 也可以先为元素设置display: none,操作结束后再把它显示出来。因为在display属性为none的元素上进行的DOM操作不会引发回流和重绘。
  • 避免频繁读取会引发回流/重绘的属性,如果确实需要多次使用,就用一个变量缓存起来。
  • 对具有复杂动画的元素使用绝对定位,使它脱离文档流,否则会引起父元素及后续元素频繁回流。

标签:浏览器,DOM,元素,回流,重绘,属性
From: https://www.cnblogs.com/le-cheng/p/17498007.html

相关文章

  • [转]火狐浏览器访问github提示:未连接:有潜在的安全问题...github.com 启用了被称为 HTT
    火狐浏览器访问github,提示:       未连接:有潜在的安全问题;       Firefox检测到潜在的安全威胁,并因github.com要求安全连接而没有继续。如果这种情况是因为使用DevSidecar而引起的,可以使用以下方式解决:在地址栏输入:about:config在搜索框输入:security.en......
  • 添加一段代码,让你的网站在微信QQ提示使用浏览器访问
    <script>//跳转提示if(is_weixn_qq()){;window.location.href='https://c.pc.qq.com/middle.html?pfurl='+window.location.href;}functionis_weixn_qq(){//判断当前是否微信/QQ浏览器varua=navigator.userAgent;varisWeixin=!!/MicroMessenger/i.test......
  • 浏览器插件管理工具 auto-extension-manager
    背景最初的需求是,能够根据当前TAB的URL,自动打开或者关闭某些浏览器插件。找到了一个扩展管理工具(本身也是个扩展),有类似的功能,但却失效了,而且作者看起来没有再维护了。所以,就自己写了一个。插件JasonGrass/auto-extension-manager:achromeextensionmanagerwhereyouca......
  • 保护个人隐私的新趋势:防关联浏览器与指纹浏览器
    在数字化时代,个人隐私保护成为人们越来越关注的话题。随着互联网的快速发展,我们在日常生活中越来越多地依赖网络浏览器进行各种活动,但同时也面临着隐私泄露的风险。为了保护个人隐私,新一代的防关联浏览器和指纹浏览器应运而生。本文将深入探讨这两种浏览器技术的原理、应用以及对个......
  • 探索防关联浏览器与指纹浏览器的隐私保护之路
    在数字化时代,互联网的快速发展使得我们的生活更加便利,但同时也带来了隐私泄露的风险。近年来,随着互联网追踪技术的不断进步,人们对在线隐私保护的需求也越来越迫切。本文将探讨防关联浏览器和指纹浏览器这两个与隐私保护相关的关键词,并介绍它们对隐私保护的作用以及未来的发展趋势。......
  • 基于原子能力的浏览器扩展程序开发
    原文合集地址如下,有需要的朋友可以关注本文地址合集地址实现步骤原子能力服务提供端需提供标准的HTTP或HTTPS协议的服务浏览器安全策略由于浏览器安全策略如对SSL证书的要求和同源策略的影响,直接提供的原子能力或许不具有能够供给浏览器使用的要求,此时需要一个代理来实现这......
  • 基于原子能力的浏览器扩展程序开发
    原文合集地址如下,有需要的朋友可以关注本文地址合集地址实现步骤原子能力服务提供端需提供标准的HTTP或HTTPS协议的服务浏览器安全策略由于浏览器安全策略如对SSL证书的要求和同源策略的影响,直接提供的原子能力或许不具有能够供给浏览器使用的要求,此时需要一个代理来实现这些功能。......
  • Carbonyl 运行在终端里的浏览器
    运行在终端里的浏览器。这是一款基于Chromium的命令行浏览器,可以在终端里用浏览器的方式访问网页,支持图片、动图、视频、音频等内容。sudodockerrun--rm-tifathyb/carbonylhttp://www.cnblogs.comenjoy.........
  • [连载]JavaScript讲义(06)--- 浏览器对象模型
    ......
  • vue 学习第17天 CSS学习 ---- 浏览器私有前缀 + css3阶段总结
    浏览器私有前缀是为了兼容老版本的写法,比较新的浏览器无需添加1、私有前缀 2、提倡的写法(私有前缀+属性) 总结:CSS3学习的  五个大方面         ......