zoukankan      html  css  js  c++  java
  • 回流与重绘理解,助攻CSS

    HTML渲染过程中回流和重绘是比较重要的概念,了解他们有助于编写性能更好的css代

    回流:指几何属性需改变的渲染,将整个网页填白,对内容重新渲染,只不过以人眼的感官速度看上去浏览器回流是不会有任何变化的
    实质上每次回流都会将页面清空,再从左上角第一个像素点从左往右从上往下一一渲染。
    渲染树的节点发生改变,影响该节点的几何属性,导致该节点位置发生变化,就会触发浏览器回流并重新生成渲染树。
    回流意味着节点的几何属性发生改变,需浏览器重新计算并生成渲染树,渲染树会发生全部或者局部变化。

    :重绘是指外观属性而不影响集合属性的渲染。重绘较回流相对温和些。
    渲染树节点改变,但不影响该节点的几何属性,回流较重绘消耗性能要高些,并且回流一定伴随重绘,重绘不一定有回流。

    上面有讲几何属性和外观属性,可能有些童鞋不清楚

    • 几何属性:包括布局、尺寸等可用数学几何衡量的属性
      • 布局:displayfloatpositionlisttableflexcolumnsgrid
      • 尺寸:marginpaddingborderwidthheight
    • 外观属性:包括界面、文字等可用状态向量描述的属性
      • 界面:appearanceoutlinebackgroundmaskbox-shadowbox-reflectfilteropacityclip
      • 文字:textfontword

    给一个比较好记忆的理解吧:大家喜欢喝奶茶吧,我最喜欢的是一点点奶茶茶,相信很多人喜欢,不然怎么生意好到爆,排队排的老长了,

    突然又问素质较低的小伙子,插队了,引起后面的小哥强烈不满,两人你推我搡的快打起来了,幸好店长劝和,大家有重新排队,这个过程就跟回流差不多,

    大家重新排队影响了大家的时间,怨声载道的,然后又来了一个帅帅的小哥哥,心疼女朋友排队站的太久脚痛,替她排队买,这样皆大欢喜,他女朋友也高兴,大家也不用重新排队

    这个过程除了妹纸,其余人的位置和顺序都无发生变化,跟重绘差不多。

    这样我们得出了个性能优化法则:回流必定引发重绘,重绘不一定引发回流

    很多童鞋可能不知,回流重绘其实与浏览器的事件循环有关

    • 浏览器刷新频率为60Hz,即每16.6ms更新一次
    • 事件循环执行完成微任务
    • 判断document是否需更新
    • 判断resize/scroll事件是否存在,存在则触发事件
    • 判断Media Query是否触发
    • 更新动作并发送事件
    • 判断document.isFullScreen是否为true(全屏)
    • 执行requestAnimationFrame回调
    • 执行IntersectionObserver回调
    • 更新界面

     上述就是浏览器每一帧中可能会做到的事情,若在一帧中有空闲时间,就会执行requestIdleCallback回调。

     回到正题,通过定向法则回流必定引发重绘,重绘不一定引发回流可知道,尽量减少回流重绘,就是CSS性能优化中一个很好的指标。

    如何减少和避免回流重绘?

    1. 使用visibility:hidden替换display:none;
    2. 使用transform代替top;top是几何属性,操作top会改变节点位置从而引发回流,使用transform:translate3d(x,0,0)代替top,只会引发图层重绘,还会间接启动GPU加速,该情况在第12章变换与动画中会详细讲解。

    3. 避免使用Table布局
    4. 避免规则层级过多。浏览器的CSS解析器解析css文件时,对CSS规则是从右到左匹配查找,样式层级过多会影响回流重绘效率,建议保持CSS规则在3层左右。
    5. 避免节点属性值放在循环里当成循环变量

    6. 动态改变类而不改变样式。不要尝试每次操作DOM去改变节点样式,这样会频繁触发回流。
    7. 将频繁回流重绘的节点设置为图层

    CSS编码排序推荐:

    根据回流和重绘原理。涉及到几何属性和外观属性,结合盒模型规范和从外到里进行属性排序,将一些回流的几何属性排在最前面,决定布局尺寸相关的
    状态,在添加外观属性,布局》尺寸》界面》文字》交互 的方式定义顺序,交互的属性放在最后,如transform混入animation会让节点重新生成图层,
    图层不会对其他图层造成影响。
    如建楼一样:从无到有,从打(存在)、搭(布局)、主(尺寸)、砌体(界面)、装修(文字)、装潢(交互)到验收(生成一个完整的节点),
    每一步都基于前一步作为基础才能继续下去,符合我们正常的逻辑思维。
    借鉴太极哲学思想:太极生两仪,两仪生四象,四象生八卦,从无极生太极开始,一直通过物质派生而构筑一个完整的立体结构,
    这一过程是一个立体并包含位次顺序的四维关系。

    布局属性

    • 显示:display visibility
    • 溢出:overflow overflow-x overflow-y
    • 浮动:float clear
    • 定位:position left right top bottom z-index
    • 列表:list-style list-style-type list-style-position list-style-image
    • 表格:table-layout border-collapse border-spacing caption-side empty-cells
    • 弹性:flex-flow flex-direction flex-wrap justify-content align-content align-items align-self flex flex-grow flex-shrink flex-basis order
    • 多列:columns column-width column-count column-gap column-rule column-rule-width column-rule-style column-rule-color column-span column-fill column-break-before column-break-after column-break-inside
    • 格栅:grid-columns grid-rows

    尺寸属性

    • 模型:box-sizing
    • 边距:margin margin-left margin-right margin-top margin-bottom
    • 填充:padding padding-left padding-right padding-top padding-bottom
    • 边框:border border-width border-style border-color border-colors border-[direction]-<param>
    • 圆角:border-radius border-top-left-radius border-top-right-radius border-bottom-left-radius border-bottom-right-radius
    • 框图:border-image border-image-source border-image-slice border-image-width border-image-outset border-image-repeat
    • 大小:width min-width max-width height min-height max-height

    界面属性

    • 外观:appearance
    • 轮廓:outline outline-width outline-style outline-color outline-offset outline-radius outline-radius-[direction]
    • 背景:background
    • 遮罩:mask mask-mode mask-image mask-repeat mask-repeat-x mask-repeat-y mask-position mask-position-x mask-position-y mask-size mask-origin mask-clip mask-attachment mask-composite mask-box-image mask-box-image-source mask-box-image-width mask-box-image-outset mask-box-image-repeat mask-box-image-slice
    • 滤镜:box-shadow box-reflect  filter  mix-blend-mode  opacity,
    • 裁剪:object-fit clip
    • 事件:resize  zoom cursor  pointer-events  touch-callout  user-modify  user-focus  user-input  user-select  user-drag

    文字属性

    • 模式:line-height line-clamp vertical-align direction unicode-bidi writing-mode ime-mode
    • 文本:text-overflow text-decoration text-decoration-line text-decoration-style text-decoration-color text-decoration-skip text-underline-position text-align text-align-last text-justify text-indent text-stroke text-stroke-width text-stroke-color text-shadow text-transform text-size-adjust
    • 字体:src font font-family font-style font-stretch font-weight font-variant font-size font-size-adjust color
    • 内容:overflow-wrap word-wrap word-break word-spacing letter-spacing white-space caret-color tab-size content counter-increment counter-reset quotes page page-break-before page-break-after page-break-inside

    交互属性

    • 模式:will-change perspective perspective-origin backface-visibility
    • 变换:transform transform-origin transform-style
    • 过渡:transition transition-property transition-duration transition-timing-function transition-delay
    • 动画:animation animation-name animation-duration animation-timing-function animation-delay animation-iteration-count animation-direction animation-play-state animation-fill-mode

    在此已经整合了大部分的属性,可满足大部分的属性排序。其他未列入的属性,可根据自身使用习惯添加。分类只提供参考

    文章仅为学习笔记,无写作艺术,仅供大家参考。

    佳物不独来,万物同相携。
  • 相关阅读:
    atomic,nonatomic
    iOS开发-retain/assign/strong/weak/copy/mutablecopy/autorelease区别
    MagicalRecord的使用(第三方库实现的数据库)
    深浅拷贝
    C中的预编译宏定义
    省电的iPhone定位
    ASP连接读写ACCESS数据库实例(转)
    【摘要】JavaScript 的性能优化:加载和执行
    PC端网站跳转手机端网站
    多行未知文本垂直居中
  • 原文地址:https://www.cnblogs.com/rongrongtu/p/14524210.html
Copyright © 2011-2022 走看看