文章目录 css图层 图层创建的条件 重绘(Repaint) 回流 触发重绘的属性 触发回流的属性 常见的触发回流的操作 优化方案 requestAnimationFrame—-请求动画帧 写在最后 学习目标 : 了解前端Dom代码、css样式、js逻辑代码到浏览器展现过程 了解什么是图层 了解重绘与回流 了解前端层面针对重绘、回流如何优化 css图层 浏览器在渲染一个页面时,会将页面分为很多个图层,图层有大有小 重绘不会带来重新布局,所以并不一定伴随回流。 需要注意的是:重绘是以图层为单位,如果图层中某个元素需要重绘,那么整个图层都需要重绘。 计算这些值的过程称为布局或回流 “重绘”不一定需要”回流”,比如改变某个网页元素的颜色,就只会触发”重绘”,不会触发”回流”,因为布局没有改变。 “回流”大多数情况下会导致”重绘”,比如改变一个网页元素的位置,就会同时触发”回流”和”重绘”,因为布局改变了。
HTML默认是流式布局,css与js会打破这种布局,改变DOM的几何属性与外观属性。在绘制时根据渲染树布局,再根据布局绘制,这就是回流重绘。 回流:改变几何属性的渲染。又称重排。 这时只会回流重绘或只有重绘,因此引出一个定向法则:回流必定引发重绘,重绘不一定引发回流。 用户的交互操作引发了网页的重渲染。 避免回流重绘 1.使用visibility:hidden替换display:none 2.使用transform代替top top是几何属性,操作top会改变节点位置引发回流,使用transform:translate3d 4.避免规则层级过多 浏览器的CSS解析器解析css文件时,对CSS规则是从右到左匹配查找,样式层级过多会影响回流重绘效率,建议保持CSS规则在3层左右。 7.将频繁回流重绘的节点设置为图层。 在浏览器中设置频繁回流或重绘的节点为一张新图层,那新图层就能够阻止节点的渲染行为影响别的节点,这张图层中如何变化都无法影响到其他图层。
repaint: 当元素的一部分属性发生变化,如外观背景色不会引起布局变化而需要重新渲染的过程叫做重绘 回流一定会引发重绘 但是 重绘不一定引发回流 引发回流的情况 : 首当其冲自然是dom 浏览器窗口发生变化-resize事件发生时 var s = document.body.style; s.padding = "2px"; // 回流+重绘 s.border = "1px solid red"; // 再一次 回流+重绘 s.color = "blue"; // 再一次重绘 s.backgroundColor = "#ccc"; // 再一次 重绘 s.fontSize = "14px"; // 再一次 回流+重绘 // 添加node,再一次 回流+重绘 document.body.appendChild(document.createTextNode('abc!')) ; 说到这里大家都知道回流比重绘的代价要更高,回流的花销跟render tree有多少节点需要重新构建有关系,假设你直接操作body,比如在body最前面插入1个元素,会导致整个render tree
一、回流与重绘的概念在 HTML 中,每个元素都可以理解成一个盒子,在浏览器解析过程中,会涉及到回流与重绘:回流(reflow):当DOM的结构发生改变或者某个元素的样式发生变化时,浏览器需要重新计算并重新布局 要了解回流与重绘的产生,首先需要了解浏览器解析渲染机制,如下所示:浏览器的解析渲染机制可以分为以下几个步骤:HTML解析:当浏览器接收到 HTML 文档后,会对其进行解析。 二、回流与重绘的触发条件回流的触发条件触发条件:当渲染树中部分或者全部元素的尺寸、结构或者属性发生变化以下这些操作会导致回流添加或删除DOM元素:当添加、删除、修改DOM元素时,会导致整个或部分页面的布局发生变化 注意:当触发回流时,一定会触发重绘,但是重绘不一定会引发回流三、如何减少回流与重绘浏览器优化机制浏览器针对回流和重绘,本身也具备一定的优化机制,但是仅是最基础的。 减少回流与重绘的措施了解了回流与重绘的触发条件,我们可以尽量避免不该有的操作,减少回流与重绘,提高浏览器渲染性能使用CSS动画代替JavaScript动画:CSS动画是利用浏览器的硬件加速,性能更高效。
在认识重绘和回流之前,我们先认识一下一个页面加载的时候,会发生什么? 页面加载时,生成一个DOM树,DOM Tree里包含了构成页面所有的标签。 每个页面至少发生一次回流/重排,就是页面第一次被加载时。当页面中的元素只是外观或风格被改变不影响布局,比如更换背景色background-color,这个过程就是重绘。 比如改变某个元素的背景色、文字颜色、边框颜色等等 影响回流(reflow)/重排(relayout)的因素 影响重绘(replaint)的因素 元素的布局和几何属性改变时就会触发reflow。 (比如颜色的改变),重排必然导致重绘(比如改变网页位置)。 这样多次重排,重绘变成一次重排重绘 减少 reflow/repaint: (1)不要一条一条地修改 DOM 的样式。
Contents 1 写在前面 2 回流(Reflow) 3 重绘(Repaint) 4 影响 5 避免重绘与回流 6 总结 写在前面 在讨论今天的主角之前,我们要先了解一下浏览器的渲染机制。 现代浏览器会对频繁的回流或重绘操作进行优化,浏览器会维护一个队列,当我们页面发生回流或重绘时,有时候并不是立即执行,而是先放入维护的队列中,到达一定时间后统一去进行绘制 当你访问以下属性或方法时,浏览器会立刻清空队列 scrollLeft width、height getComputedStyle() getBoundingClientRect() 所以当我们需要使用如上api获取数据时,我们要注重渲染时机以及取值时机 避免重绘与回流 因为在display属性为none的元素上进行的DOM操作不会引发回流和重绘。 避免频繁读取会引发回流/重绘的属性,如果确实需要多次使用,就用一个变量缓存起来。 或者说,我们简单理解会引起元素位置变化的就会reflow,会引起位置变化的,只是在以前的位置进行改变背景颜色等,只会repaint 本文首发于什么是回流与重绘 (Reflow & Repaint)
一、写在前面 页面优化在面试的过程中经常遇到的问题,今天就来总计一下重绘和回流的问题。 二、重绘和回流是什么 我们都知道一个页面从加载到完成,首先是构建DOM树,然后根据DOM节点进行几何布局形成render树(渲染树),当渲染树构建完成后,页面就根据DOM树开始布局,渲染树也根据设置的样式渲染这些节点 在比如说,我们给一个元素修改颜色,这样的行为是不会影响页面的布局的,DOM树不会发生改变,但是颜色变了,渲染树得重新绘制,这就是重绘。 所以说回流一定会触发重绘,重绘不一定触发回流。 因为display为none会脱离文档流,visibility为hidden虽然看不到,但类似与透明度为0,其实还在文档流中,还是有渲染的过程。 三、怎么样减少回流 回流会重构DOM树,渲染树也得重新渲染,比较麻烦,哪些行为可以引发回流,如何去避免呢? 1、DOM的删除行为 比如删除某个节点,或者给父元素插入子节点,这类操作都会触发回流。
作者:腰花 原文链接:https://juejin.im/post/5a9923e9518825558251c96a 写在前面 在讨论回流与重绘之前,我们要知道: 浏览器使用流布局模型 (Flow Based 一句话:回流必将引起重绘,重绘不一定会引起回流。 回流 (Reflow) 当Render Tree中部分或全部元素的尺寸、结构、或某些属性发生改变时,浏览器重新渲染部分或全部文档的过程称为回流。 性能影响 回流比重绘的代价要更高。 有时即使仅仅回流一个单一的元素,它的父元素以及任何跟随它的元素也会产生回流。 现代浏览器会对频繁的回流或重绘操作进行优化: 浏览器会维护一个队列,把所有引起回流和重绘的操作放入队列中,如果队列中的任务数量或者时间间隔达到一个阈值的,浏览器就会将队列清空,进行一次批处理,这样可以把多次回流和重绘变成一次 因为在display属性为none的元素上进行的DOM操作不会引发回流和重绘。 避免频繁读取会引发回流/重绘的属性,如果确实需要多次使用,就用一个变量缓存起来。
#回流和重绘 JS操作DOM很慢,而且修改DOM还会引发它的外观、样式、大小、位置的改变,就会触发重流或重绘。 回流:当我们对 DOM 的修改引发了 DOM 几何尺寸的变化(比如修改元素的宽、高或隐藏元素等)时,浏览器需要重新计算元素的几何属性(其他元素的几何属性和位置也会因此受到影响),然后再将计算的结果绘制出来 这个过程就是回流(也叫重排)。 重绘:当我们对 DOM 的修改导致了样式的变化、却并未影响其几何属性(比如修改了颜色或背景色)时,浏览器不需重新计算元素的几何属性、直接为该元素绘制新的样式(跳过了上图所示的回流环节)。 这个过程叫做重绘。 由此可以看出,重绘不一定导致回流,但是回流一定会导致重绘。 优化的关键,就是把重绘和回流的次数最小化。 #如何优化 知道了DOM慢的原因,我就可以逐步优化了。
回流 当 Render Tree 中部分或全部元素的尺寸、结构、或某些属性发生改变时,浏览器重新渲染部分或全部文档的过程称为回流。 重绘 当页面中元素样式的改变并不影响它在文档流中的位置时(例如:color、background-color、visibility 等),浏览器会将新样式赋予给元素并重新绘制它,这个过程称为重绘。 如何避免回流 CSS 避免使用 table 布局。 尽可能在 DOM 树的最末端改变 class。 避免设置多层内联样式。 因为在 display 属性为 none 的元素上进行的 DOM 操作不会引发回流和重绘。 避免频繁读取会引发回流/重绘的属性,如果确实需要多次使用,就用一个变量缓存起来。
回流一定会发生重绘,重绘不一定会引发回流 4.浏览器优化 现代浏览器大多都通过队列机制来批量更新布局,浏览器会把修改操作放在队列中,至少一个浏览器刷新(16.6ms)才清空队列,但当你获取布局信息时,队列中可能存在影响这写属性和方法返回值的操作 ,即使没有,浏览器也会强制清空队列,触发重绘和回流来保证返回正确的值 主要有一下方法和属性 offsetTop、offsetLeft、offsetWidth、offsetHeight scrollTop 5.减少重绘与回流 1.css . 减少重绘与回流 1.CSS 使用 transform 替代 top 使用 visibility 替换 display: none ,因为前者只会引起重绘,后者会引发回流(改变了布局) 避免使用 避免频繁读取会引发回流/重绘的属性,如果确实需要多次使用,就用一个变量缓存起来。 对具有复杂动画的元素使用绝对定位,使它脱离文档流,否则会引起父元素及后续元素频繁回流。
浏览器的渲染过程 本文先从浏览器的渲染过程来从头到尾的讲解一下回流重绘,如果大家想直接看如何减少回流和重绘,可以跳到后面。(这个渲染过程来自MDN) ? 既然知道了浏览器的渲染过程后,我们就来探讨下,何时会发生回流重绘。 何时发生回流重绘 我们前面知道了,回流这一阶段主要是计算节点的位置和几何信息,那么当页面布局和几何信息发生变化的时候,就需要回流。 页面一开始渲染的时候(这肯定避免不了) 浏览器的窗口尺寸变化(因为回流是根据视口的大小来计算元素的位置和大小的) 注意:回流一定会触发重绘,而重绘不一定会回流 根据改变的范围和程度,渲染树中或大或小的部分需要重新计算 减少回流和重绘 好了,到了我们今天的重头戏,前面说了这么多背景和理论知识,接下来让我们谈谈如何减少回流和重绘。 最小化重绘和重排 由于重绘和重排可能代价比较昂贵,因此最好就是可以减少它的发生次数。 css3硬件加速(GPU加速) 比起考虑如何减少回流重绘,我们更期望的是,根本不要回流重绘。这个时候,css3硬件加速就闪亮登场啦!!
前言 回流和重绘是前端开发的高频词汇之一,你可以在各种面经,性能优化相关文章可以看到,但是很多都是草草带过。本文带你从浏览器渲染流程中了解回流与重绘的原理。 回流与重绘的原理 webkit 将渲染树中的元素成为渲染对象,每一个渲染对象都代表了一个矩形区域,通常对应相关节点的css框,包含宽度、高度和位置等几何信息。 如何减少回流与重绘 上面我们已经介绍了像素管道相关内容,知道回流和重绘的代价是非常昂贵的,如果我们不停的在改变页面的布局,就会造成浏览器耗费大量的开销在进行页面的计算,对用户体验非常的不友好。 减少回流与重绘前端性能优化重要手段之一。 减少强制同步布局 避免频繁读取会引发回流/重绘的属性,如果确实需要多次使用,就用一个变量缓存起来。 ,浏览器会维护一个队列,把所有引起回流和重绘的操作放入队列中,如果队列中的任务数量或者时间间隔达到一个阈值的,浏览器就会将队列清空,进行一次批处理,这样可以把多次回流和重绘变成一次。
浏览器的渲染过程 本文先从浏览器的渲染过程来从头到尾的讲解一下回流重绘,如果大家想直接看如何减少回流和重绘,优化性能,可以跳到后面。 既然知道了浏览器的渲染过程后,我们就来探讨下,何时会发生回流重绘。 何时发生回流重绘 我们前面知道了,回流这一阶段主要是计算节点的位置和几何信息,那么当页面布局和几何信息发生变化的时候,就需要回流。 减少回流和重绘 好了,到了我们今天的重头戏,前面说了这么多背景和理论知识,接下来让我们谈谈如何减少回流和重绘。 最小化重绘和重排 由于重绘和重排可能代价比较昂贵,因此最好就是可以减少它的发生次数。 css3硬件加速(GPU加速) 比起考虑如何减少回流重绘,我们更期望的是,根本不要回流重绘。这个时候,css3硬件加速就闪亮登场啦!! 划重点: 1. 我通过使用chrome的Performance捕获了动画一段时间里的回流重绘情况,实际结果如下图: 添加描述 从图中我们可以看出,在动画进行的时候,没有发生任何的回流重绘。
; 5、页面渲染初始化; 6、浏览器窗口尺寸改变——resize事件发生时; 注意:回流必将引起重绘,而重绘不一定会引起回流。 var s = document.body.style; s.padding = "2px"; // 回流+重绘 s.border = "1px solid red"; // 再一次 回流+重绘 s.color = "blue"; // 再一次重绘 s.backgroundColor = "#ccc"; // 再一次 重绘 s.fontSize = "14px"; // 再一次 回流+重绘 // 添加node ; 如何减少回流、重绘 减少回流、重绘其实就是需要减少对render tree的操作(合并多次多DOM和样式的修改),并减少对一些style信息的请求,尽量利用好浏览器的优化策略。具体方法有: 1. 让要操作的元素进行”离线处理”,处理完后一起更新 a) 使用DocumentFragment进行缓存操作,引发一次回流和重绘; b) 使用display:none技术,只引发两次回流和重绘; c) 使用
重绘与回流 重绘与回流是浏览器渲染的时候进行的操作,当页面内容发生改变的时候,就会触发重绘或者回流 重绘 当渲染树中的一些元素需要更新属性,而这些属性只是影响元素的外观,风格,而不会影响布局的,比如background-color ,则就叫称为重绘Repaint,重绘不一定触发回流。 每个页面至少需要一次回流,就是在页面第一次加载的时候,这时候是一定会发生回流的,因为要构建渲染树,回流一定触发重绘。 Reflow的成本比Repaint的成本高得多的多。 绝对定位 对于复杂动画效果,由于会经常的非常频繁的引起回流重绘,可以使用绝对定位,让它脱离文档流,否则会引起父元素以及后续元素频繁的回流。 CSS3硬件加速 CSS3硬件加速也就是GPU加速,可以transform、opacity、filters这些动画不会引起回流重绘,但是对于动画的其它属性,比如background-color这些,还是会引起回流重绘的
重绘与回流 当 render tree 中的一部分(或全部)因为元素的规模尺寸、布局、显示/隐藏等改变而需要重新构建,这个过程称作回流(reflow)。页面第一次加载的时候,至少发生一次回流。 因此回流必将引起重绘,而重绘不一定会引起回流。 Reflow 的成本比 Repaint 高得多的多。 // 回流+重绘 浏览器 如果向上述代码中那样,浏览器不停地回流+重绘,很可能性能开销非常大,实际上浏览器会优化这些操作,将所有引起回流和重绘的操作放入一个队列中,等待队列达到一定的数量或者时间间隔,就 flush 这个队列,一次性处理所有的回流和重绘。 参考资料 16毫秒的优化 浏览器渲染页面过程与页面优化 页面重绘和回流以及优化
JavaScript如何减少重绘和回流 方法说明 1、用transform代替top。 2、用visibility换display。 none,前者只引起重绘,后者引起回流。 5、动画实现的动画速度越快,回流次数越多。 也可以使用requestAnimationFrame。 6、将频繁重绘或回流的节点设置为图层。 var body = document.getElementsByTagName('body')[0] var h = body.offsetHeight; } 以上就是JavaScript减少重绘和回流的方法
客户端渲染页面 浏览器渲染页面的步骤 解析HTML,生成DOM树,解析CSS,生成CSSOM树 将DOM树和CSSOM树结合,生成渲染树(Render Tree) Layout(回流):根据生成的染树 ,计算它们在设备视口(viewport)内的确切位置和大小,这个阶段是回流 Painting(重绘): 根据潼染树以及回流得到的几何信息,得到节点的绝对像素 Display:将像素发送给GPU,展示在页面上 DOM重绘和回流 重绘:元素样式的改变(但宽高、大小、位置等不变) 回流:元素的大小或者位置发生了变化(当页面布局和几何信息发生变化的时候),触发了重新布局,导致渲染树重新计算布局和渲染 **注意 :**回流一定会触发重绘,而重绘不一定会回流 前端性能优化之 : 避免DOM的回流 放弃传统操作dom的时代,基于vue/react开始数据影响视图模式 分离读写操作(现代的浏览器都有渲染队列的机制
浏览器的渲染过程 本文先从浏览器的渲染过程来从头到尾的讲解一下回流重绘,如果大家想直接看如何减少回流和重绘,可以跳到后面。 既然知道了浏览器的渲染过程后,我们就来探讨下,何时会发生回流重绘。 何时发生回流重绘 我们前面知道了,回流这一阶段主要是计算节点的位置和几何信息,那么当页面布局和几何信息发生变化的时候,就需要回流。 减少回流和重绘 好了,到了我们今天的重头戏,前面说了这么多背景和理论知识,接下来让我们谈谈如何减少回流和重绘。 最小化重绘和重排 由于重绘和重排可能代价比较昂贵,因此最好就是可以减少它的发生次数。 css3硬件加速(GPU加速) 比起考虑如何减少回流重绘,我们更期望的是,根本不要回流重绘。这个时候,css3硬件加速就闪亮登场啦!! 总结 本文主要讲了浏览器的渲染过程、浏览器的优化机制以及如何减少甚至避免回流和重绘,希望可以帮助大家更好的理解回流重绘。