当我们对一个页面进行布局时,性能瓶颈通常是 style、layout、paint。
在《浏览器层面优化前端性能(2):Reader引擎线程与模块分析优化点》提过:
避免大规模、复杂的布局 布局,就是浏览器计算DOM元素的几何信息的过程:元素大小和在页面中的位置。每个元素都有一个显式或隐式的大小信息,决定于其CSS属性的设置、或是元素本身内容的大小、抑或是其父元素的大小。在Blink/WebKit内核的浏览器和IE中,这个过程称为布局。在基于Gecko的浏览器(比如Firefox)中,这个过程称为Reflow。 尽可能避免触发布局 布局的时间消耗主要在于:
减少绘制区域 有时候尽管把元素提升到了一个单独的渲染层,渲染工作依然是必须的。渲染过程中一个比较有挑战的问题是,浏览器会把两个相邻区域的渲染任务合并在一起进行,这将导致整个屏幕区域都会被绘制。比如,你的页面顶部有一个固定位置的header,而此时屏幕底部有某个区域正在发生绘制的话,整个屏幕都将会被绘制。 注意:在DPI较高的屏幕上,固定定位的元素会自动地被提升到一个它自有的渲染层中。但在DPI较低的设备上却并非如此,因为这个渲染层的提升会使得字体渲染方式由子像素变为灰阶(详细内容请参考:Text Rendering),我们需要手动实现渲染层的提升。 减少绘制区域通常需要对动画效果进行精密设计,以保证各自的绘制区域之间不会有太多重叠,或者想办法避免对页面中某些区域执行动画效果。 简化绘制的复杂度 比如js 获取元素的offsetTop ffsetTop 比如getBoundingClientRect 消耗更少。 在css里面,重绘 backgroun 比如 box-shadow 消耗更好。 优先使用渲染层合并属性、控制层数量
一般情况下,浏览器会把 整个 DOM 作为 CSS 布局上下文,因此:当我们改变部分 DOM 的样式时,也会影响到其他部分。
在布局时,现代主流的浏览器都会做一些智能的判断,最终决定哪些需要改变,哪些不需要改变。不过,页面布局是很复杂的,浏览器不一定能判断到所有的情况。
但是,我们可是使用css contain 属性来限制 回流与重绘
CSS 新出了 contain 属性,拥有 contain 属性(不为 none)的元素与页面其他元素相对独立,并且该元素及其后代元素样式、DOM 发生变化时不会导致整个页面回流和重绘。
contain: none | strict | content | [ size || layout || paint ]
contain容易混淆的就是, background-size属性的值:cover和contain的缩放背景图
contain | 此时会保持图像的纵横比并将图像缩放成将适合背景定位区域的最大大小。等比例缩放图象到垂直或者水平其中一项填满区域。 |
---|---|
cover | 此时会保持图像的纵横比并将图像缩放成将完全覆盖背景定位区域的最小大小。等比例缩放图象到垂直和水平两项均填满区域。 |
display:contents 使 div 不产生任何框 ,因此不会渲染其背景 边框 和 内边距 ,但颜色 / 字体等继承的属性还是会对其子元素产生效果
即在盒子上添加 display : contents , 当前盒子若设置了 background border padding width height 等属性会失效
参考文章:
介绍 contain 属性 https://www.hexuanzhang.com/2822848773.html
听说有个能优化性能的属性 contain https://zhuanlan.zhihu.com/p/30618818
https://www.CSS性能优化新属性 contain 的语法、作用及使用场景 webhek.com/post/css-contain-property.html
http://www.cnblogs.com/freefish12/p/5776747.html
转载本站文章《css布局优化:布局计算限制— contain/will-change/合成层》, 请注明出处:https://www.zhoulujun.cn/html/webfront/style/cssBase/2020_0813_8543.html
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。