位置: IT常识 - 正文

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

编辑:rootadmin
一文教会你何为重绘、回流? 文章目录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}{评论,你的意见是我进步的财富!}评论,你的意见是我进步的财富!

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

本文链接地址:https://www.jiuchutong.com/zhishi/293738.html 转载请保留说明!

上一篇:冰川湾国家公园里的兰普鲁冰川,美国阿拉斯加州 (© Andrew Peacock/Getty Images)(冰川湾国家公园的冰川不止有白色一种)

下一篇:【python模块】python解析json文件详解(python模块怎么写)

  • ppt录课怎么把人像录进去(ppt录课怎么把人录进去)

    ppt录课怎么把人像录进去(ppt录课怎么把人录进去)

  • 荣事达洗衣机e1故障原因如何预防(荣事达洗衣机e1故障怎么解决)

    荣事达洗衣机e1故障原因如何预防(荣事达洗衣机e1故障怎么解决)

  • 支付宝怎么关闭自动扣费(支付宝怎么关闭免密支付)

    支付宝怎么关闭自动扣费(支付宝怎么关闭免密支付)

  • 滴滴服务分多久更新一次(滴滴服务分多久清零)

    滴滴服务分多久更新一次(滴滴服务分多久清零)

  • soul注销期间可以使用吗(soul注销期间可以登录吗)

    soul注销期间可以使用吗(soul注销期间可以登录吗)

  • TWITTER一直显示正在授权

    TWITTER一直显示正在授权

  • 小米手机私密文件在哪里看(小米手机私密文件夹在哪里找)

    小米手机私密文件在哪里看(小米手机私密文件夹在哪里找)

  • ipad可以用无线鼠标吗(ipad可以用无线充电器吗)

    ipad可以用无线鼠标吗(ipad可以用无线充电器吗)

  • 线刷包和卡刷包有区别吗(线刷包和卡刷包能互换用吗?)

    线刷包和卡刷包有区别吗(线刷包和卡刷包能互换用吗?)

  • iphone充电头是多少w(iphone充电头)

    iphone充电头是多少w(iphone充电头)

  • 华为al00叫什么(华为al00是华为什么型号)

    华为al00叫什么(华为al00是华为什么型号)

  • 华为手机微信右下角有盾牌标是什么意思(华为手机微信右上角加把锁)

    华为手机微信右下角有盾牌标是什么意思(华为手机微信右上角加把锁)

  • 换了国产屏就没面容吗(换了国产屏就没声音了)

    换了国产屏就没面容吗(换了国产屏就没声音了)

  • ppt2010合并形状不能用(ppt2010合并形状不能用图片)

    ppt2010合并形状不能用(ppt2010合并形状不能用图片)

  • 小米10pro屏幕是三星的吗(小米10pro屏幕是三星还是国产)

    小米10pro屏幕是三星的吗(小米10pro屏幕是三星还是国产)

  • 为什么微信突然要验证登录(为什么微信突然要重新登录)

    为什么微信突然要验证登录(为什么微信突然要重新登录)

  • QQ非好友不能发视频吗(QQ非好友不能发消息怎么设置)

    QQ非好友不能发视频吗(QQ非好友不能发消息怎么设置)

  • 手机给电视开热点耗流量吗(手机给电视开热点)

    手机给电视开热点耗流量吗(手机给电视开热点)

  • 电话手表怎么定位找回(电话手表怎么定位下载什么软件)

    电话手表怎么定位找回(电话手表怎么定位下载什么软件)

  • word文档修改不了怎么回事(word文档修改不了,提示已锁定)

    word文档修改不了怎么回事(word文档修改不了,提示已锁定)

  • 华为相机怎么连拍(华为相机怎么连拍照片)

    华为相机怎么连拍(华为相机怎么连拍照片)

  • x27如何升降摄像头(x27pro升降摄像头使用教程)

    x27如何升降摄像头(x27pro升降摄像头使用教程)

  • 抖音怎么保存视频没有水印(抖音怎么保存视频没有抖音号)

    抖音怎么保存视频没有水印(抖音怎么保存视频没有抖音号)

  • 绑定滴滴手机号掉了(滴滴车主绑定的手机号不用了怎么办)

    绑定滴滴手机号掉了(滴滴车主绑定的手机号不用了怎么办)

  • qq的svip有什么用(qq的svip能干什么)

    qq的svip有什么用(qq的svip能干什么)

  • 流量超出限额被限速怎么办(流量超过限制)

    流量超出限额被限速怎么办(流量超过限制)

  • vue全局引入scss样式文件(vue全局引入js文件)

    vue全局引入scss样式文件(vue全局引入js文件)

  • 基于Web Speech API给ChatGPT加上语音功能,距离MOSS又近了一步(基于网络创新形成的大数据的最突出特征是什么?( ))

    基于Web Speech API给ChatGPT加上语音功能,距离MOSS又近了一步(基于网络创新形成的大数据的最突出特征是什么?( ))

  • 留底税额有没有时间
  • 不含税的销售额乘以税率等于什么
  • 进口货物的会计科目
  • 现金流量套期与什么无关
  • 视同销售收入是纳税调整项目吗
  • 委外加工怎么做仓库账
  • 什么发票可以抵扣增值税
  • 购买私募基金有风险吗
  • 资金账簿减半征收印花税财税2018 50号
  • 股东入股的标准
  • 城市生活垃圾费是业主出还是物业出
  • 进账多于销项怎样报税
  • 增值税采用零税率政策的内容
  • 员工异地缴纳社保协议
  • 餐饮赠送菜品怎么说
  • 未分配利润如何使用投入生产
  • 捐赠的固定资产按什么计价
  • 酒生产车间
  • 所得税报表怎么申报
  • 新开的公司会计需要做什么
  • 工商局打印公司章程介绍信
  • 1697510722
  • bios设置的完整说法
  • 差旅补助需要计提吗
  • 付款给对方怎么做分录
  • 销项税多了冲销部分的怎么做账
  • 在win7中怎么安转只兼容win10的软件
  • 劳务公司的账务怎么做账
  • windows修复网络
  • 台式电脑组装过程视频
  • linux系统的介绍
  • ppap是什么意思中文
  • php mysql数据库
  • 出差补贴如何入账报销
  • 财税〔2017〕34号文件中提到的科技型中小企业是指哪种企业?
  • 科技型中小企业享受优惠税收政策
  • 资产减值损失会影响利润总额吗
  • 嵌入式从业10年,聊聊我对工业互联网和消费物联网的看法 | 文末赠书4本
  • react+go
  • 增值税不超过10万免征
  • 最好用的刷题笔
  • 购买税盘怎么减免申报
  • 取得投资是什么意思
  • 子公司注销时的账务处理
  • 在建工程转入
  • 开了发票不做收入的账务处理是?
  • 法定盈余公积的主要用途
  • 管理费用的会计要素
  • 增值税专用发票几个点
  • 企业委托企业
  • 销售货物的运费的税率怎么算
  • 冲销以前月份的凭证
  • 跨年更正错误记账凭证的方法
  • 租赁动迁补偿条款
  • 所得税减免的企业税率
  • 给分公司开发票由总公司付款怎么办?
  • 劳务公司 成本
  • 汇算清缴可以调整主营业务成本吗
  • 收到存款利息收入用什么凭证
  • 破产重组还需要还钱吗
  • 会计刚开始学什么
  • windows xp安装win32程序
  • 使用移动硬盘快速启动
  • KunlunPlatform.exe是什么进程?KunlunPlatform.exe是安全的程序吗?
  • windows的气泡屏保会加速
  • 怎么查看自己mac电脑有没有被人使用过
  • linux arp -s
  • win10资源管理器启动不了
  • windows错误1058
  • cocos creator3
  • 小地图的主要作用是观察队友的大概位置
  • Extjs4 类的定义和扩展实例
  • linux的ls-l命令
  • 安卓手机管家怎么关闭
  • 如何搭建python项目架构
  • 医院能开增值税开发票吗
  • 所得税季度预缴,年度汇算清缴
  • 中国税务网官网1732171695993732.2418.61431871
  • 怎么查询手机发票
  • 契税和个税有什么关系
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设