首页 > 其他分享 >回流与重绘

回流与重绘

时间:2022-12-14 22:34:20浏览次数:47  
标签:触发 浏览器 元素 回流 重绘 页面

前言

HTML中,每个元素都可以理解成一个盒子,在浏览器解析过程中,会涉及到回流与重绘:

  • 回流:布局引擎会根据各种样式计算每个盒子在页面上的大小与位置
  • 重绘:当计算好盒模型的位置、大小及其他属性后,浏览器根据每个盒子特性进行绘制

具体的浏览器解析渲染机制如下所示:

  • 解析HTML,生成DOM树,解析CSS,生成CSSOM树
  • 将DOM树和CSSOM树结合,生成渲染树(Render Tree)
  • Layout(回流):根据生成的渲染树,进行回流(Layout),得到节点的几何信息(位置,大小)
  • Painting(重绘):根据渲染树以及回流得到的几何信息,得到节点的绝对像素
  • Display:将像素发送给GPU,展示在页面上

在页面初始渲染阶段,回流不可避免的触发,可以理解成页面一开始是空白的元素,后面添加了新的元素使页面布局发生改变

当我们对 DOM 的修改引发了 DOM几何尺寸的变化(比如修改元素的宽、高或隐藏元素等)时,浏览器需要重新计算元素的几何属性,然后再将计算的结果绘制出来

当我们对 DOM的修改导致了样式的变化(colorbackground-color),却并未影响其几何属性时,浏览器不需重新计算元素的几何属性、直接为该元素绘制新的样式,这里就仅仅触发了重绘

如何触发

要想减少回流和重绘的次数,首先要了解回流和重绘是如何触发的

回流触发时机

回流这一阶段主要是计算节点的位置和几何信息,那么当页面布局和几何信息发生变化的时候,就需要回流,如下面情况:

  • 添加或删除可见的DOM元素
  • 元素的位置发生变化
  • 元素的尺寸发生变化(包括外边距、内边框、边框大小、高度和宽度等)
  • 内容发生变化,比如文本变化或图片被另一个不同尺寸的图片所替代
  • 页面一开始渲染的时候(这避免不了)
  • 浏览器的窗口尺寸变化(因为回流是根据视口的大小来计算元素的位置和大小的)

还有一些容易被忽略的操作:获取一些特定属性的值

offsetTop、offsetLeft、 offsetWidth、offsetHeight、scrollTop、scrollLeft、scrollWidth、scrollHeight、clientTop、clientLeft、clientWidth、clientHeight

这些属性有一个共性,就是需要通过即时计算得到。因此浏览器为了获取这些值,也会进行回流

除此还包括getComputedStyle方法,原理是一样的

重绘触发时机

触发回流一定会触发重绘

可以把页面理解为一个黑板,黑板上有一朵画好的小花。现在我们要把这朵从左边移到了右边,那我们要先确定好右边的具体位置,画好形状(回流),再画上它原有的颜色(重绘)

除此之外还有一些其他引起重绘行为:

  • 颜色的修改
  • 文本方向的修改
  • 阴影的修改

浏览器优化机制

由于每次重排都会造成额外的计算消耗,因此大多数浏览器都会通过队列化修改并批量执行来优化重排过程。浏览器会将修改操作放入到队列里,直到过了一段时间或者操作达到了一个阈值,才清空队列

当你获取布局信息的操作的时候,会强制队列刷新,包括前面讲到的offsetTop等方法都会返回最新的数据

因此浏览器不得不清空队列,触发回流重绘来返回正确的值

结语

本文到此结束,谢谢大家的观看!

如有问题,欢迎各位指正!

标签:触发,浏览器,元素,回流,重绘,页面
From: https://blog.51cto.com/u_15718546/5938403

相关文章

  • SMT贴片加工回流焊焊接缺陷检查清单
    SMT贴片加工回流焊焊接缺陷检查清单​​贴片加工​​中,回流焊接是SMT贴片工艺流程的末端,一般焊接好之后,需要进行检测焊接品质,将不良PASS掉,以免流入后面工艺流程,造成Z终品质......
  • 日期对象与节点操作与重构回流
    日期对象日期对象就是,js的内部内置对象,它属于一个构造函数封装的对象。实例化对象,在代码中一定要使用new,实例化对象。创建一个时间对象获取当前时间:constNowTime=new......
  • 如何召回流失用户
    对于负责用户运营的人员,用户流失是一个必须要关注的问题。如果没有及时发现用户流失的原因,及时采取相对应的策略进行干预和挽留,最终到了流失的末期,那么整个产品可能会宣告死......
  • 什么是重排和重绘
    当浏览器下载完页面所需元素(html标记,css层叠样式表,javascript,图片)之后,会生成两个东西:Dom树和渲染树。Dom树Dom树,主要是用来表示页面的Dom结构。渲染树渲染树主要是用来表示......
  • Winform GDI 系列(2) 窗体边框重绘制
    ///<summary>///窗体边框重绘制///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidForm1_Paint(......
  • 什么是重排与重绘?
    参考文章网页性能管理详解——阮一峰1.网页生成的过程网页生成的过程,大致可以分为五步:HTML代码转换为DOMCSS代码转换为CSSOM(CSSObjectModel)结合DOM......
  • 重绘(repaints)和回流(reflow)
    重绘就是重新绘画,重绘是一个元素外观的改变所触发的浏览器行为,当给一个元素更换颜色、更换背景,虽然不会影响页面布局,但是颜色或背景变了,浏览器就会根据元素的新属性重新绘......
  • vue 用 input 和 canvas 标签实现前端背景图片的移动 重绘 上传
    前言:    闲得无聊写的,嫌麻烦的直接出门左转搜索vuecropper.js模块直接用就行正文:  首先我们要知道input是自带file方法的,直接可以选这文件上传就行,但为了......
  • 带你认识什么是“回流重绘”
    摘要:要想减少回流和重绘的次数,首先要了解回流和重绘是如何触发的。本文分享自华为云社区《前端页面之“回流重绘”》,作者:CoderBin。“回流重绘”是什么?在HTML中,每个元素......
  • 浏览器的渲染过程、回流、重绘
    一、浏览器的渲染过程1.根据HTML生成DOM树浏览器在接收到服务器发来的HTML文件是字节形式的,首先要将字节形式的HTML组建成字符串,然后将字符串转换成token,再将token组装......