contain: layout paint 是实用起点,需容器有明确尺寸(如height/min-height),否则浏览器静默忽略;二者组合才能同时阻断布局重排与绘制重算,覆盖90%场景且兼容性好。
直接加 contain: layout paint 就能起效,但前提是容器有明确尺寸(比如写了 height 或 min-height),否则浏览器会静默忽略——这不是 bug,是规范强制要求。
contain: layout paint 是实用起点单用 contain: layout 挡不住子元素颜色、透明度变化引发的样式重算;单用 contain: paint 挡不住子元素撑大容器导致的外部重排。二者必须组合,才能同时切断布局影响链和绘制扩散链。
contain: content 在 Chrome 120+ 已被废弃,MDN 明确标记为不推荐,行为不稳定,别用contain: strict 等价于 layout paint style size,但 size 会让容器彻底忽略子内容高度贡献,列表项高度浮动时可能塌成 0pxcontain: layout paint 覆盖 90% 有效用例,且兼容性好(Chrome 56+、Firefox 69+、Safari 15.4+)contain 就等于没写浏览器要求 contain: layout 或 contain: strict 的容器必须有可预测的尺寸上下文,否则直接跳过该声明。你查 getComputedStyle(el).contain 看起来生效了,但 DevTools 里 Paint Flashing 仍满屏乱闪。
width 和 height 最稳妥,比如卡片固定高:height: 120px
min-height 或 aspect-ratio + width: 100%,避免 min-content、fit-content 这类依赖内容的值contain,若父容器未设确定尺寸,同样失效contain 容易踩的三个坑不是调 el.style.contain = 'layout paint' 就完事,时机、配套操作和兜底判断缺一不可。
立即学习“前端免费学习笔记(深入)”;
contain,否则插入过程会触发父级重排;插入后若需动画展开,记得收起时清空 el.style.contain = '',否则 size 可能锁死高度resize 时,只对已知固定尺寸区域(如顶部工具栏)补 layout paint,动态宽度侧边栏不能加 size
if ('contain' in document.documentElement.style),Safari 对 size 实现仍有偏差,iOS 微信 X5 内核基本不支持 strict
getComputedStyle
声明写了、控制台查得到,不代表浏览器真执行了隔离。真实效果得看渲染行为本身。
layout 隔离成功最常被忽略的是尺寸约束——哪怕只是加了 min-height: 0,也比不写强;而最容易误用的是 contain: strict,它在多层定位嵌套中极易引发塌陷或错位,除非你确认容器尺寸完全可控且子元素不参与文档流高度计算。