以前真不知道有这个 contain 属性 https://drafts.CSSwg.org/css-containment-3/ , 直到几周前我在 Twitter 上询问容器大小控制的一些做法, David Baron 在回复中提到它, 说 contain: strict; 可以免去很多容器大小控制的麻烦. 于是, 我就是开始阅读 CSS 规范, 试图理解这个属性, 下面就是我学到的.
contain 属性
这个 contain 属性的主要目的是隔离指定内容的样式, 布局和渲染. 开发人员可以使用这个 contain 属性来限制指定的 DOM 元素和它的子元素同页面上其它内容的联系; 我们可以把它看做一个 iframe. 跟 iframe 很相似, 它能建立起一个边界, 产生一个新的根布局; 保证了它和它的子元素的 DOM 变化不会触发父元素重新布局, 渲染等.
开发人员可以用这个 contain 属性声明一个元素和它的子元素是 -- 尽可能的 -- 和页面上的其它元素保持独立.
- 来自 W3C 规范
none | strict | layout | style | paint | size | contain
这个 contain 属性可以有 7 种不同的值.
none 无
layout 开启布局限制
style 开启样式限制
paint 开启渲染限制
size 开启 size 限制
content 开启除了 size 外的所有限制
strict 开启 layout, style 和 paint 三种限制组合
contain 使用场景举例
我们已经知道了, 使用这个 contain 属性可以将一个元素标志为和页面上其它元素是相对独立的元素. 为了说明这个属性的作用, 下面举几个使用例子:
页面小饰件 (widgets)
通常在页面上添加第三方小饰件时, 我们几乎对它们没有什么太多的控制, 比如分享工具, 它们可能会因为具有相当耗资源的布局, 样式, 渲染操作等大幅度的降低整个页面的执行效率. 为了将它们同我们的网站隔离开来, 使用 contain: strict; 将第三方的小饰件同页面上的其它内容隔离开来.
屏幕外的内容
如果你有一个导航栏或其它类似的东西并不在屏幕可现实范围内出现, 浏览器同样会为这些不可见的元素进行渲染. 通过使用 contain: paint; 浏览器就会忽略渲染这些屏幕外不可见的元素, 从而能更快的渲染其它内容.
计算容器尺寸
我在文字开头提到过这个问题, 使用 contain: strict; 可以 免去很多关于容器尺寸控制的问题. 比如, 子元素的内容会影响容器的大小, 使用 contain 属性就可以避免这样的问题产生.
为什么浏览器不能自动的实现 contain 的功能
浏览器已经尽可能的在页面下做了最大的优化, 但每个浏览器引擎的实现方法并不尽相同. 而 contain 属性可以提供一种标准的方式让开发人员告诉 浏览器 https://www.w3.org/TR/UAAG20/#def-user-agent 某些方面可以这样优化, 哪些不能优化.
什么时候应该使用 contain
如果你的页面很简单, 没有复杂的 DOM 节点和小饰件 (widgets), 那就没必要考虑使用这种 CSS 的 contain 技术. 而如果你开发的页面非常复杂, 那么, 这个 CSS 的 contain 技术可以帮助你优化页面的性能. 而对于第三方的小饰件, 始终使用 contain: strict; 是很好的习惯, 它可以保护你的页面不受它们的干扰而出现性能问题.
来源: http://www.webhek.com/post/css-contain-property.html