
因为 overflow:hidden 只对「自身形成块级格式化上下文(BFC)」且「子元素在正常流中或相对定位」时才生效;绝对定位元素脱离文档流,其渲染层叠和裁切边界取决于最近的「定位上下文(positioned ancestor)」,而非父容器的 overflow 设置。
div 设了 overflow:hidden,但里面 position:absolute 的弹窗、下拉菜单、tooltip 依然溢出显示position:static(默认),那包含块其实是初始包含块(通常是视口),裁切自然失效position:relative(或其他非 static 值)position:relative 本身不改变布局,但会触发 BFC 并成为包含块,此时 overflow:hidden 才能真正裁切其内部绝对定位子元素不是。即使父级设了 position:relative 和 overflow:hidden,仍可能失效——关键看子元素的 z-index 和层叠上下文是否绕过了裁切。
z-index:9999,而父级没有创建层叠上下文(如没设 z-index 或 opacity 等),此时子元素可能在父级渲染层之上,overflow:hidden 失效z-index 只在「同层叠上下文内」比较;父级若没生成新层叠上下文,子元素的 z-index 就和 body 下其他元素同级,裁切无效z-index:0(或任意值)+ position:relative,强制创建层叠上下文z-index 层叠上下文处理异常,已基本可忽略有效,但行为和 position:relative 不同:它会让父容器成为包含块,且无需显式设定位属性,但要注意 transform 本身的渲染副作用。
transform:translateZ(0) 或 transform:scale(1)
transform 都会触发 BFC,并使该元素成为其子元素(包括 position:absolute)的包含块transform 会创建新的层叠上下文,可能意外遮挡兄弟元素;移动端还可能引发滚动卡顿或模糊(尤其配合 will-change 时)position:relative 开销略大,纯裁切需求优先选后者别猜,按顺序查这四点,90% 的问题当场定位。
立即学习“前端免费学习笔记(深入)”;
position 且值不为 static?(必须)position,也可检查是否有 float、display:flow-root、overflow 非 visible 等z-index、opacity、filter 等触发新层叠上下文的属性最常被忽略的是「包含块」和「层叠上下文」这两个概念混用。裁切是视觉渲染阶段的行为,依赖的是包含块边界;而显示与否,还受层叠顺序控制——两者缺一不可。