您现在的位置是:网站首页> 编程资料编程资料
CSS 新特性 contain控制页面的重绘与重排问题css重绘与重排的方法
2021-09-02
1240人已围观
简介 这篇文章主要介绍了CSS 新特性 contain控制页面的重绘与重排的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
在介绍新的 CSS 属性 contain 之前,需要读者已经知道什么是页面的重绘与重排。
发现之前已经描述过很多次了,可以看看这个提高 CSS 动画性能的正确姿势[1]。
OK,下面进入本文正题,
contain 为何?
contain 属性允许我们指定特定的 DOM 元素和它的子元素,让它们能够独立于整个 DOM 树结构之外。目的是能够让浏览器有能力只对部分元素进行重绘、重排,而不必每次都针对整个页面。
The contain property allows an author to indicate that an element and its contents are, as much as possible, independent of the rest of the document tree. This allows the browser to recalculate layout, style, paint, size, or any combination of them for a pmited area of the DOM and not the entire page.contain 语法
看看它的语法:
{ /* No layout containment. */ contain: none; /* Turn on containment for layout, style, paint, and size. */ contain: strict; /* Turn on containment for layout, style, and paint. */ contain: content; /* Turn on size containment for an element. */ contain: size; /* Turn on layout containment for an element. */ contain: layout; /* Turn on style containment for an element. */ contain: style; /* Turn on paint containment for an element. */ contain: paint; }
除去 none,取值还有 6 个,我们一个一个来看看。
contain: size
contain: size: 设定了 contain: size 的元素的渲染不会受到其子元素内容的影响。
The value turns on size containment for the element. This ensures that the containing box can be laid out without needing to examine its descendants.
我开始看到这个定义也是一头雾水,光看定义很难明白到底是什么意思。还需实践一番:
假设我们有如下简单结构:
.container { width: 300px; padding: 10px; border: 1px solid red; } p { border: 1px solid #333; margin: 5px; font-size: 14px; } 并且,借助 jQuery 实现每次点击容器添加一个
Coco
结构: $('.container').on('click', e => { $('.container').append('Coco
') })
那么会得到如下结果:

可以看到,容器 .container 的高度是会随着元素的增加而增加的,这是正常的现象。
此刻,我们给容器 .container 添加一个 contain: size,也就会出现上述说的:设定了 contain: size 的元素的渲染不会受到其子元素内容的影响。
.container { width: 300px; padding: 10px; border: 1px solid red; + contain: size } 再看看会发生什么:

正常而言,父元素的高度会因为子元素的增多而被撑高,而现在,子元素的变化不再影响父元素的样式布局,这就是 contain: size 的作用。
contain: style
接下来再说说 contain: style、contain: layout 、contain: paint。先看看 contain: style。
截止至本文书写的过程中,contain: style 暂时被移除了。
CSS Containment Module Level 1[2]: Drop the at-risk “style containment” feature from this specification, move it Level 2。
嗯,官方说辞是因为存在某些风险,暂时被移除,可能在规范的第二版会重新定义吧,那这个属性也暂且放一放。
contain: paint
contain: paint:设定了 contain: paint 的元素即是设定了布局限制,也就是说告知 User Agent,此元素的子元素不会在此元素的边界之外被展示,因此,如果元素不在屏幕上或以其他方式设定为不可见,则还可以保证其后代不可见不被渲染。
This value turns on paint containment for the element. This ensures that the descendants of the containing box don’t display outside its bounds, so if an element is off-screen or otherwise not visible, its descendants are also guaranteed to be not visible.
这个稍微好理解一点,先来看第一个特性:
设定了 contain: paint 的元素的子元素不会在此元素的边界之外被展示 设定了 contain: paint 的元素的子元素不会在此元素的边界之外被展示
这个特点有点类似与 overflow: hidden,也就是明确告知用户代理,子元素的内容不会超出元素的边界,所以超出部分无需渲染。
简单示例,假设元素结构如下:
Coco
.container { contain: paint; border: 1px solid red; } p{ left: -100px; } 我们来看看,设定了 contain: paint 与没设定时会发生什么:

CodePen Demo -- contain: paint Demo[3]
设定了 contain: paint 的元素在屏幕之外时不会渲染绘制
通过使用 contain: paint, 如果元素处于屏幕外,那么用户代理就会忽略渲染这些元素,从而能更快的渲染其它内容。
contain: layout
contain: layout:设定了 contain: layout 的元素即是设定了布局限制,也就是说告知 User Agent,此元素内部的样式变化不会引起元素外部的样式变化,反之亦然。
This value turns on layout containment for the element. This ensures that the containing box is totally opaque for layout purposes; nothing outside can affect its internal layout, and vice versa.
启用 contain: layout 可以潜在地将每一帧需要渲染的元素数量减少到少数,而不是重新渲染整个文档,从而为浏览器节省了大量不必要的工作,并显着提高了性能。
使用 contain:layout,开发人员可以指定对该元素任何后代的任何更改都不会影响任何外部元素的布局,反之亦然。
因此,浏览器仅计算内部元素的位置(如果对其进行了修改),而其余DOM保持不变。因此,这意味着帧渲染管道中的布局过程将加快。
存在的问题
描述很美好,但是在实际 Demo 测试的过程中(截止至2021/04/27,Chrome 90.0.4430.85),仅仅单独使用 contain:layout 并没有验证得到上述那么美好的结果。
设定了 contain: layout 的指定元素,改元素的任何后代的任何更改还是会影响任何外部元素的布局,点击红框会增加一条
Coco
元素插入到 container 中:
简单的代码如下:
Coco
...
html, body { width: 100%; height: 100%; display: flex; justify-content: center; align-items: center; flex-direction: column; gap: 10px; } .container { width: 150px; padding: 10px; contain: layout; border: 1px solid red; } .g-test { width: 150px; height: 150px; border: 1px solid green; } 
CodePen Demo -- contain: layout Demo[4]
Can i Use -- CSS Contain
截止至 2021-04-27,Can i Use 上的 CSS Contain 兼容性,已经可以开始使用起来:
参考文献
CSS Containment Module Level 1[5]
CSS containment[6]
CSS Containment in Chrome 52[7]
参考资料
[1]提高 CSS 动画性能的正确姿势:
https://github.com/chokcoco/iCSS/issues/11
[2]CSS Containment Module Level 1:
https://www.w3.org/TR/css-contain-1/
[3]CodePen Demo -- contain: paint Demo:
https://codepen.io/Chokcoco/pen/KKwmgmN
[4]CodePen Demo -- contain: layout Demo:
https://codepen.io/Chokcoco/pen/rNjRELL
[5]CSS Containment Module Level 1:
https://www.w3.org/TR/css-contain-1/
[6]CSS containment:
https://justmarkup.com/articles/2016-04-05-css-containment/
[7]CSS Containment in Chrome 52:
https://developers.google.com/web/updates/2016/06/css-containment
[8]Github -- iCSS:
https://github.com/chokcoco/iCSS
到此这篇关于CSS 新特性 contain控制页面的重绘与重排的文章就介绍到这了,更多相关CSS 控制页面的重绘与重排内容请搜索以前的文章或继续浏览下面的相关文章,希望大家以后多多支持!
相关内容
- css position fixed 左右双定位的实现代码CSS之定位布局(position,定位布局技巧)css定位position引发的层级关系问题详解详解css粘性定位position:sticky问题采坑CSS position属性和实例应用演示CSS的position定位和float浮动详解css关于position属性的用法详解(绝对定位和相对定位的混淆)
- css3 利用transform-origin 实现圆点分布在大圆上布局及旋转特效CSS3 transform(变形)和transform-origin(变形原点)调试工具
- CSS3实现的侧滑菜单CSS3实现的3D隧道效果用CSS3画一个爱心css3 实现文字闪烁效果的三种方式示例代码六种css3实现的边框过渡效果CSS3 实现的动态星空背景jQuery+CSS3制作卡片式步骤操作ui交互特效代码基于CSS3画一个iPhoneCSS3 实现NES游戏机的示例代码
- 利用HTML5+css3+jquery+weui实现仿微信聊天界面功能HTML5仿微信聊天界面、微信朋友圈实例代码详解html5 canvas 微信海报分享(个人爬坑)HTML5实现分享到微信好友朋友圈QQ好友QQ空间微博二维码功能html5 canvas合成海报所遇问题及解决方案总结基于HTML5实现类似微信手机摇一摇功能(计算摇动次数)HTML5微信播放全屏问题的解决方法HTML5页面音视频在微信和app下自动播放的实现方法HTML5仿手机微信聊天界面微信端html5页面调用分享接口示例
- 分享一个H5原生form表单的checkbox特效代码CSS+HTML自定义checkbox效果的实例代码Html中使用自定义图片来实现checkbox显示的方法HTML的checkbox和radio样式美化的简单实例使用CSS修改HTML的checkbox效果的小示例分享HTML checkbox 点击说明文字即可选择/取消勾选状态
- HTML5混合开发二维码扫描以及调用本地摄像头Html5调用手机摄像头并实现人脸识别的实现html5调用摄像头功能的实现代码HTML5调用手机摄像头拍照的实现思路及代码HTML5 Canvas+JS控制电脑或手机上的摄像头实例html5调用摄像头实例代码
- 详解HTML5中垂直上下居中的解决方案html中table表格的内容水平和垂直居中显示HTML对于元素水平垂直居中的探讨关于html水平垂直居中的问题小结html元素水平居中、垂直居中、水平垂直居中于其父级元素的方法通过css控制HTML文本框中的文字垂直居中
- 详解HTML5新增标签HTML5各种头部meta标签的功能(推荐)HTML标签语义化(含H5)
- html5使用Canvas绘图的使用方法详解html5 canvas常用api总结(二)--绘图API 用html5的canvas和JavaScript创建一个绘图程序的简单实例html5-Canvas可以在web中绘制各种图形详解HTML5 canvas绘图基本使用方法
- 微信浏览器左上角返回按钮拦截功能微信app怎么更换默认浏览器? 微信选择浏览器的教程UC浏览器推出“抢票帮”功能 可让朋友帮你抢火车票UC浏览器如何使用微信摇一摇传图功能?qq浏览器微信功能怎么用 qq浏览器微信版使用教程搜狗浏览器怎么添加微信插件方便快捷登录微信在浏览器上进行微信版网页版聊天用电脑进行微信聊天UC浏览器怎么添加微信 UC浏览器电脑版添加微信方法 在手机不方便使用的情况下如何在浏览器上面进行微信版网页版聊天


