当前位置: 首页 > 面试题库 >

来说说你对重绘和重排的理解,以及如何优化?

胡承悦
2023-03-14
本文向大家介绍来说说你对重绘和重排的理解,以及如何优化?相关面试题,主要包含被问及来说说你对重绘和重排的理解,以及如何优化?时的应答技巧和注意事项,需要的朋友参考一下

浏览器加载网页时会生成DOM树和CSSOM树

重绘:

当盒子的位置、大小以及其他属性,例如颜色、字体大小等都确定下来之后,浏览器便把这些原色都按照各自的特性绘制一遍,将内容呈现在页面上。重绘是指一个元素外观的改变所触发的浏览器行为,浏览器会根据元素的新属性重新绘制,使元素呈现新的外观。
触发重绘的条件:改变元素外观属性。如:color,background-color,font-size等。

重排(回流):

当渲染树中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建, 这就称为回流(reflow)。每个页面至少需要一次回流,就是在页面第一次加载的时候。
重绘和重排的关系:在回流的时候,浏览器会使渲染树中受到影响的部分失效,并重新构造这部分渲染树,完成回流后,浏览器会重新绘制受影响的部分到屏幕中,该过程称为重绘。
所以,重排必定会引发重绘,但重绘不一定会引发重排
  触发重排的条件:任何页面布局和几何属性的改变都会触发重排,
比如:
  1、页面渲染初始化;(无法避免)
  2、添加或删除可见的DOM元素;
  3、元素位置的改变,或者使用动画;
  4、元素尺寸的改变——大小,外边距,边框;
  5、浏览器窗口尺寸的变化(resize事件发生时);
  6、填充内容的改变,比如文本的改变或图片大小改变而引起的计算值宽度和高度的改变;
触发重排的条件:改变元素的大小 位置 等如:width、height、pading、margin、position等, 添加删除DOM操作等
重绘重排的代价:耗时,导致浏览器卡慢。

优化

1、浏览器自己的优化:浏览器会维护1个队列,把所有会引起回流、重绘的操作放入这个队列,等队列中的操作到了一定的数量或者到了一定的时间间隔,浏览器就会flush队列,进行一个批处理。这样就会让多次的回流、重绘变成一次回流重绘。
2、我们要注意的优化:我们要减少重绘和重排就是要减少对渲染树的操作,则我们可以合并多次的DOM和样式的html" target="_blank">修改。并减少对style样式的请求。
(1)直接改变元素的className
(2)display:none;先设置元素为display:none;然后进行页面布局等操作;设置完成后将元素设置为display:block;这样的话就只引发两次重绘和重排;
(3)不要经常访问浏览器的flush队列属性;如果一定要访问,可以利用缓存。将访问的值存储起来,接下来使用就不会再引发回流;
(4)使用cloneNode(true or false) 和 replaceChild 技术,引发一次回流和重绘;
(5)将需要多次重排的元素,position属性设为absolute或fixed,元素脱离了文档流,它的变化不会影响到其他元素;
(6)如果需要创建多个DOM节点,可以使用DocumentFragment创建完后一次性的加入document;

 类似资料:
  • 本文向大家介绍说说你对AMD和Commonjs的理解相关面试题,主要包含被问及说说你对AMD和Commonjs的理解时的应答技巧和注意事项,需要的朋友参考一下 CommonJS是服务器端模块的规范,Node.js采用了这个规范。CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作。AMD规范则是非同步加载模块,允许指定回调函数。 AMD推荐的风格通过返回一个对象做为模块

  • 本文向大家介绍说说你对provide和inject的理解相关面试题,主要包含被问及说说你对provide和inject的理解时的应答技巧和注意事项,需要的朋友参考一下 通过在父组件中inject一些数据然后再所有子组件中都可以通过provide获取使用该参数, 主要是为了解决一些循环组件比如tree, menu, list等, 传参困难, 并且难以管理的问题, 主要用于组件封装, 常见于一些ui组

  • 本文向大家介绍说说你对MVC和MVVM的理解相关面试题,主要包含被问及说说你对MVC和MVVM的理解时的应答技巧和注意事项,需要的朋友参考一下 MVC是一种设计模式,全称是Model(模型)、View(视图)和Controller(控制)。 Model(数据层):储存和管理数据 View(视图层):展示UI、响应用户的交互 Controller(控制层):监听数据的改变、控制视图行为和处理用户交互

  • 本文向大家介绍说说你对Relay的理解相关面试题,主要包含被问及说说你对Relay的理解时的应答技巧和注意事项,需要的朋友参考一下 https://relay.dev/ Relay是Facebook在React.js Conf(2015年1月)上首次公开的一个新框架,用于为React应用处理数据层问题。 在Relay中,每个组件都使用一种叫做GraphQL的查询语句声明对数据的依赖。组件可以使用

  • 本文向大家介绍说说你对this的理解相关面试题,主要包含被问及说说你对this的理解时的应答技巧和注意事项,需要的朋友参考一下 js 中有两个重要概念:作用域和原型链 我个人感觉 作用域对应函数式开发,闭包是主要工具 原型链对应对象式开发,this 是主要工具,把一些操作封装在一个工具包上,然后用 this 来调用

  • 本文向大家介绍说说你对eval的理解相关面试题,主要包含被问及说说你对eval的理解时的应答技巧和注意事项,需要的朋友参考一下 不安全的, 容易出错, 因为你不知道你传入的参数是什么鬼 性能底下. 某种情况下跟new Function(), setTimeout, setInterval类似 不利于代码可维护性, 可拓展性 不是在无可奈何的情况下, 请不要使用