contain属性在Safari 16.4前完全未解析,@supports检测存在误导性,contain: content/strict已被废弃,跨浏览器安全仅contain: size(需显式宽高)。

contain 属性不是“被忽略”,而是根本没被解析——浏览器 CSS 解析器遇到不认识的属性名,直接跳过整条声明,连值都不校验。
contain 在 Safari 16.4 之前完全不识别
Safari 直到 16.4 才开始支持 contain(仅 size 和 inline-size),更早版本(如 15.6、14.1)连 contain: none 都不会出现在 DevTools 的 Styles 面板里。这不是兼容性差,是语法层面不存在。你写的 contain: layout paint 在 Safari 15 中和写 xyz: abc 效果一样:静默丢弃,无 warning,也不影响后续规则。
@supports (contain: paint) 在 Safari 17+ 会返回 true,但实际不执行
这个陷阱最危险:
- Safari 17.0+ 的
@supports检测会错误地返回true,因为 parser 认出了contain这个属性名,但底层渲染引擎压根没实现paint逻辑 - 结果就是:样式进了,隔离没生效,溢出内容照常显示,
getBoundingClientRect()返回值也完全没被裁剪 - 不能靠
@supports做降级分支,必须结合 UA 字符串粗筛:navigator.userAgent.includes('Safari') && !navigator.userAgent.includes('Chrome')
contain: content 和 contain: strict 在 Chrome 120+ 已被移除
这两个简写值不是“兼容性问题”,而是已被规范废弃:
立即学习“前端免费学习笔记(深入)”;
-
contain: content在 Chrome 120+、Firefox 125+ 中已触发警告,MDN 明确标注为 deprecated -
contain: strict等价于layout paint style size,但size会强制忽略子内容撑高,导致富文本编辑器光标消失、折叠面板高度塌陷等真实崩溃场景 - 生产环境应显式写出需要的值,例如只用
contain: layout paint,避免依赖已删除的语义
真正跨浏览器安全的写法极少:目前只有 contain: size(需配合显式 width/height)在 Chrome、Firefox、Safari 16.4+ 上行为一致;其余组合要么被 Safari 静默截断,要么在旧 Chrome 中引发定位逃逸。别把它当通用性能开关,先确认你那个容器是否真的承受得起 size 带来的高度冻结。


















