z-index失效主因是层叠上下文被截断,而非数值过小;需检查父级是否含transform、opacity<1等隐式触发器,确保元素处于预期层叠上下文中。
Bootstrap 里 z-index “失效”,90% 不是因为数值太小,而是元素根本没进入你预期的层叠上下文。比如给 .dropdown-menu 设了 z-index: 9999,结果还是被 .navbar 盖住——问题不在菜单,而在它的父级 .navbar-collapse 用了 transform 或 opacity,悄悄创建了一个新层叠上下文,把菜单“关”在里面了。
transform、opacity < 1、filter、will-change、perspective
position: static 的元素无视 z-index,必须显式设 position: relative/absolute/fixed
常见现象:模态框能显示,但点不了按钮、输不了文字,开发者工具里发现 .modal 的父节点是 <div id="app"> 而不是 <body>。这时 .modal 的 z-index: 1050 只在它自己的父容器内生效,而 .modal-backdrop(z-index: 1040)直接挂在 <body> 下,自然就“压”住了它。
createPortal 渲染到 document.body,不能直接 return <Modal />
<Teleport to="body"><Modal /></Teleport>,别依赖 v-model 绑定在局部节点modal.show() 前执行 document.body.appendChild(modalEl),否则可能触发两次重排硬写魔数会破坏 Bootstrap 的语义化层级体系。比如你把 .dropdown-menu 改成 z-index: 9999,后面引入 .toast(默认 z-index: 1090)或第三方日期选择器(可能用 z-index: 2147483647),立刻冲突。更糟的是,!important 会让后续调试不可预测,尤其多个 !important 规则叠加时。
$zindex-dropdown: 1060,再 @import "bootstrap"
.my-dropdown { z-index: calc(var(--bs-zindex-modal) + 10); }(Bootstrap 5.3+ 支持).navbar .dropdown-menu、.modal .dropdown-menu
iOS Safari 对 position: fixed 的处理极其敏感。地址栏收起/展开、双指缩放、键盘弹出时,fixed 元素可能“漂移”或被系统 UI 截断。这不是 z-index 没生效,而是定位基准发生了变化。
z-index 解决 iOS 上 Modal 被键盘挡住的问题position: absolute + 手动监听 resize 或 focusin 事件动态计算 top.modal-dialog 加 max-height: 80vh 和 overflow-y: auto,避免内容撑出视口