一文教会你何为重绘、回流?

文章目录

  • css图层
  • 图层创建的条件
  • 重绘(Repaint)
  • 回流
  • 触发重绘的属性
  • 触发回流的属性
  • 常见的触发回流的操作
  • 优化方案
  • requestAnimationFrame----请求动画帧
  • 写在最后

学习目标:

  • 了解前端Dom代码、css样式、js逻辑代码到浏览器展现过程
  • 了解什么是图层
  • 了解重绘与回流
  • 了解前端层面针对重绘、回流如何优化

css图层

浏览器在渲染一个页面时,会将页面分为很多个图层,图层有大有小,每个图层上有一个或多个节点。
也就是我们各种各样的Dom标签
在这里插入图片描述
在渲染DOM的时候,浏览器所做的工作实际上是:
1. 获取DOM后分割为多个图层
2. 对每个图层的节点计算样式结果 (Recalculate style–样式重计算)
3. 为每个节点生成图形和位置 (Layout–布局,重排,回流)
4. 将每个节点绘制填充到图层位图中 (Paint–重绘)
5. 图层作为纹理上传至GPU
6. 组合多个图层到页面上生成最终屏幕图像 (Composite Layers–图层重组)

图层创建的条件

在这里插入图片描述

Chrome浏览器满足以下任意情况就会创建图层:
1. 拥有具有3D变换的CSS属性
2. 使用加速视频解码的节点
3. 节点
4. CSS3动画的节点
5. 拥有CSS加速属性的元素(will-change)

重绘(Repaint)

重绘是一个元素外观的改变所触发的浏览器行为,例如改变outline、背景色等属性。浏览器会根据元素的新属性重新绘制,
使元素呈现新的外观。重绘不会带来重新布局,所以并不一定伴随回流。

需要注意的是:重绘是以图层为单位,如果图层中某个元素需要重绘,那么整个图层都需要重绘。
所以为了提高性能,我们应该让这些“变化的东西”拥有一个自己一个图层,
不过好在绝大多数的浏览器自己会为CSS3动画的节点自动创建图层。

回流

渲染对象在创建完成并添加到渲染树时,并不包含位置和大小信息。计算这些值的过程称为布局或回流

“重绘"不一定需要"回流”,比如改变某个网页元素的颜色,就只会触发"重绘",不会触发"回流",因为布局没有改变。
“回流"大多数情况下会导致"重绘”,比如改变一个网页元素的位置,就会同时触发"回流"和"重绘",因为布局改变了。

触发重绘的属性

    * color							* background								* outline-color* border-style					* background-image							* outline* border-radius					* background-position						* outline-style* visibility					* background-repeat							* outline-width* text-decoration				* background-size							* box-shadow

触发回流的属性

    * width						* top									* text-align* height					* bottom								* overflow-y* padding					* left									* font-weight* margin					* right									* overflow* display					* position								* font-family* border-width				* float									* line-height* border					* clear									* vertival-align* min-height														* white-space

常见的触发回流的操作

在这里插入图片描述

Reflow(回流) 的成本比 Repaint(重绘) 的成本高很多很多。
一个结点的 Reflow 很有可能导致子结点,甚至父点以及同级结点的 Reflow。
在一些高性能的电脑上也许还没什么,但是如果 Reflow 发生在手机上,那么这个过程是非常痛苦和耗电的。

所以,下面这些动作有很大可能会是成本比较高的。
当你增加、删除、修改 DOM 结点时,会导致 Reflow , Repaint。
当你移动 DOM 的位置
当你修改 CSS 样式的时候。
当你 Resize 窗口的时候(移动端没有这个问题,因为移动端的缩放没有影响布局视口)
当你修改网页的默认字体时。
【获取某些属性时(width,height…)!!!!!】
注:display:none 会触发 reflow,而 visibility:hidden 只会触发 repaint,因为没有发生位置变化。

优化方案

我们已知:浏览器渲染页面时经历了如下“细致”的环节:
1. 计算需要被加载到节点上的样式结果(Recalculate style–样式重计算)
2. 为每个节点生成图形和位置(Layout–重排或回流)
3. 将每个节点填充到图层中(Paint–重绘)
4. 组合图层到页面上(Composite Layers–图层重组)
如果我们需要提升性能,需要做的就是减少浏览器在运行时所需要做的工作,即:尽量减少1234步。

【具体优化方案如下】:
1.元素位置移动变换时尽量使用CSS3的transform来代替对top left等的操作
变换(transform)和透明度(opacity)的改变仅仅影响图层的组合
2.【使用opacity来代替visibility】
(1).使用visibility不触发回流,但是依然重绘。
(2).直接使用opacity即触发重绘,又触发回流(GPU底层设计如此!)。
(3).opacity配合图层使用,即不触发重绘也不触发回流。
原因:
透明度的改变时,GPU在绘画时只是简单的降低之前已经画好的纹理的alpha值来达到效果,并不需要整体的重绘。
不过这个前提是这个被修改opacity本身必须是一个图层。
3.【不要使用table布局】
table-cell
4.将【多次改变样式属性的操作合并成一次】操作
不要一条一条地修改DOM的样式,预先定义好class,然后修改DOM的className
5.【将DOM离线后再修改】
由于display属性为none的元素不在渲染树中,对隐藏的元素操作不会引发其他元素的回流。
如果要对一个元素进行复杂的操作时,可以先隐藏它,操作完成后再显示。这样只在隐藏和显示时触发2次回流。
6.【利用文档碎片】(documentFragment)------vue使用了该种方式提升性能。
7.【不要把获取某些DOM节点的属性值放在一个循环里当成循环的变量】
当你请求向浏览器请求一些 style信息的时候,就会让浏览器flush队列,比如:
1. offsetTop, offsetLeft, offsetWidth, offsetHeight
2. scrollTop/Left/Width/Height
3. clientTop/Left/Width/Height
4. width,height
当你请求上面的一些属性的时候,浏览器为了给你最精确的值,需要刷新内部队列,
因为队列中可能会有影响到这些值的操作。即使你获取元素的布局和样式信息跟最近发生或改变的布局信息无关,
浏览器都会强行刷新渲染队列。
8.动画实现过程中,启用GPU硬件加速:transform: tranlateZ(0)
9.为动画元素新建图层,提高动画元素的z-index
10.编写动画时,尽量使用如下的API

requestAnimationFrame----请求动画帧

在这里插入图片描述

1.window.requestAnimationFrame()
说明:该方法会告诉浏览器在下一次重绘回流之前调用你所指定的函数
1.参数:该方法使用一个回调函数作为参数,这个回调函数会在浏览器下一次重绘之前调用。
回调函数会被自动传入一个参数,DOMHighResTimeStamp,标识requestAnimationFrame()开始触发回调函数的当前时间

2.返回值:
一个 long 整数,请求 ID ,是回调列表中唯一的标识。是个非零值,没别的意义。你可以传这个值给 window.cancelAnimationFrame() 以取消回调函数。

备注:若你想在浏览器下次重绘之前继续更新下一帧动画,那么回调函数自身必须再次调用window.requestAnimationFrame()

2.window.cancelAnimationFrame(requestID)
取消一个先前通过调用window.requestAnimationFrame()方法添加到计划中的动画帧请求。
requestID是先前调用window.requestAnimationFrame()方法时返回的值,它是一个时间标识,用法与定时器的id类似。

写在最后

原创不易,还希望各位大佬支持一下\textcolor{blue}{原创不易,还希望各位大佬支持一下}

👍 点赞,你的认可是我创作的动力!\textcolor{green}{点赞,你的认可是我创作的动力!}

⭐️ 收藏,你的青睐是我努力的方向!\textcolor{green}{收藏,你的青睐是我努力的方向!}

✏️ 评论,你的意见是我进步的财富!\textcolor{green}{评论,你的意见是我进步的财富!}

文章看完了,参与个投票吧,前端目前比较火的三大框架你更喜欢哪个?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js函数、js对象的这些点你真的懂吗?

本篇学习目标 ✨了解函数(高级)原型原型链概念\textcolor{green}{了解函数(高级)原型原型链概念}了解函数(高级)原型原型链概念 ✨掌握函数作用域\textcolor{green}{掌握函数作用域}掌握函数作用域 ✨掌握…

前端处理跨域的几种方式

什么是跨域&#xff1f; 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源&#xff0c;这里跨域是广义的。 广义的跨域&#xff1a; 1、资源跳转&#xff1a;A链接、重定向、表单提交 2、资源嵌入&#xff1a; <link>、<script>、<img>、<frame&g…

程序员必知的缓存套图

文章目录1. 线程与进程1.1 进程:1.2. 线程:1.3. 关系2. 浏览器内核模块组成4. 事件循环机制5. 缓存5.1. 缓存理解5.2. 缓存分类5.3. 缓存使用示意图5.4. 缓存中的header参数1. 线程与进程 1.1 进程: 进程是计算机中的程序关于某数据集合上的一次运行活动&#xff0c;是系统进…

安装webpack及使用

前言 你是否也是只会运用框架中集成好的Webpack配置呢&#xff1f;你明白每一项的意义么&#xff1f;你懂多少Webpack的个性化配置项呢&#xff1f;本篇文章为你讲解Webpack中的各种配置项参数及作用&#xff01; 文章目录了解Webpack相关开启项目编译打包应用使用webpack配置…

php单例型(singleton pattern)

搞定&#xff0c;吃饭 <?php /* The purpose of singleton pattern is to restrict instantiation of class to a single object. It is implemented by creating a method within the class that creates a new instance of that class if one does not exist. If an obje…

助你提高效率的几个Vue指令

前言 很多使用Vue的同学往往最容易忽略的指令&#xff0c;由于在这里考虑到很多初学甚至还没有开始接触Vue的同学呢&#xff0c;在介绍v-clos之前呢就先以大家都熟知的v-model编写小demo v-model 相信大家对v-model并不陌生&#xff0c;简单来讲他就是用于在表单控件以及组建…

掌握Mock摆脱后端同学的束缚

文章目录前言Mock概述mock.js安装Mock规范Mock的使用总结前言 当下采用前后端分离模式开发Web应用已经成为气候&#xff0c;在开发阶段有一个不成文的规定则是 项目开发后端先行 但是作为前端开发工程师的我们&#xff0c;难道在搭建完页面后只能等待后端的接口么&#xff1f;…

Vue技能树上线啦

前言 前端现在越来越多样化&#xff0c;语言众多&#xff0c;大家使用的框架也比较杂&#xff0c;在广泛的前端技术栈面前我唯爱Vue&#xff08;仅代表个人观点勿喷小伙伴们&#xff09;可能很多人觉得我是因为简单&#xff0c;其实并不然&#xff0c;我尝试过很多框架&#x…

《SpringMVC从入门到放肆》一、概述

一、SpringMVC概述 ViewServiceDaoDBSpring MVCinterfaceinterfaceMysqlimplsimplsSpringMVC也叫Spring web mvc&#xff0c;属于表现层框架。SpringMVC是Spring框架的一部分&#xff0c;是在Spring3.0后发布的。 二、第一个SpringMVC程序功能描述&#xff1a;  用户提交一个…

手握流量密码,万粉不是梦

前言 可能大家来到CSDN的目的初衷都是不一样的&#xff0c;像我注册CSDN的时候完全是为了解决自己项目中的各种问题&#xff0c;能够有一个为我提供正确答案、正确解决方案的一个平台&#xff0c;简单的了解后我选择CSDN&#xff0c;直到成为现在的创作者也说明我的选择是对的…

秋季学期学习总结

转载于:https://www.cnblogs.com/zx666/p/10408950.html

一文带你了解React框架

前言 由于 React的设计思想极其独特&#xff0c;属于革命性创新&#xff0c;性能出众&#xff0c;代码逻辑却非常简单。所以&#xff0c;越来越多的人开始关注和使用&#xff0c;认为它可能是将来 Web 开发的主流工具。 这个项目本身也越滚越大&#xff0c;从最早的UI引擎变成…

Web前端JQuery面试题(一)

Web前端JQuery面试题&#xff08;一&#xff09; 一&#xff1a;选择器 基本选择器 什么是#id&#xff0c;element&#xff0c;.class&#xff0c;*&#xff0c;selector1, selector2, selectorN&#xff1f;答&#xff1a; 根据给定的id匹配一个元素&#xff0c;用于搜索&…

前端云原生——微信小程序云服务配置

前端同样涉及云原生前言创建使用云开发项目搭建云环境测试云服务1. 获取openid&#xff08;上传本地login云函数&#xff09;1.1 创建部署login文件时报错2. 自定义sum函数并创建部署3. 上传图片4. 前端操作数据库5. 即时通信demo面试法宝欢迎各位小伙伴们&#xff01; 为大家推…

45天带你玩转Node(第一天)初探Node.js

45天带你玩转Node 粉丝要求博主系统的写一篇关于Node.js的学习资料&#xff0c;但其实我们的Node.js知识点并不少&#xff0c;所以博主为大家搭建了一个专栏&#xff0c;为了方便大家系统的学习Node.js&#xff0c;大家记得订阅哦&#xff01;虽然我们的Node.js还很年轻&#…

【转载】 安卓版手机微信如何清理微信空间

在手机微信的使用过程中&#xff0c;随着手机微信使用的时间越长&#xff0c;手机微信占用的空间越大&#xff0c;其实手机微信存储了很多聊天记录包括图片、视频等大文件信息&#xff0c;此时如果手机存储空间比较紧张&#xff0c;可以使用微信自带的清理工具对手机微信空间进…

45天带你玩转Node(第二天)走进Node.js

45天带你玩转Node 粉丝要求博主系统的写一篇关于Node.js的学习资料&#xff0c;但其实我们的Node.js知识点并不少&#xff0c;所以博主为大家搭建了一个专栏&#xff0c;为了方便大家系统的学习Node.js&#xff0c;大家记得订阅哦&#xff01;虽然我们的Node.js还很年轻&#…

深入Vue原理_数据响应式

欢迎各位小伙伴们&#xff01; 为大家推荐一款刷题神奇哦 点击链接访问牛客网 各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有&#xff0c;赶快来装备自己吧&#xff01;助你面试稳操胜券&#xff0c;solo全场面试官 数据响应式响应式是什么如何实现数据响…

python scipy样条插值函数大全(interpolate里interpld函数)

scipy样条插值 scipy样条插值1、样条插值法是一种以可变样条来作出一条经过一系列点的光滑曲线的数学方法。插值样条是由一些多项式组成的&#xff0c;每一个多项式都是由相邻的两个数据点决定的&#xff0c;这样&#xff0c;任意的两个相邻的多项式以及它们的导数(不包括仇阶导…

EKS独领风骚

前言 随着公司的逐渐发展&#xff0c;开拓了更加多的子项目与小程序&#xff0c;这些都需要进行宣传&#xff0c;但是管理以及部署新的应用是一个繁琐的工程&#xff0c;部署麻烦而且更新业务的时候非常不方面。尤其面向用户的时候&#xff0c;体验感很差。于是想要使用docker…