前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库isolation isolate 层叠上下文 用途
CSS盒模型与排版

isolation: isolate 是干什么的?为什么不用 transform 来创建层叠上下文?

isolation: isolate 只做一件事:让元素成为一个新的层叠上下文,除此之外什么都不改。以前用 transform: translateZ(0) 也能达到目的,但它会顺带把元素变成 fixed 子元素的包含块、提升合成层,经常引出新问题。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#盒模型与排版
先看核心答案读代码示例
理解线索

同样创建层叠上下文,副作用不同

  1. isolation: isolate只创建层叠上下文,不影响定位、渲染和布局
  2. transform: translateZ(0)会成为 fixed 和 absolute 后代的包含块,还可能单独提升合成层
  3. position: relative 加 z-index: 0也能创建层叠上下文,但改变了定位属性,容易和已有样式冲突

层叠上下文只决定内部元素和外部元素怎么比层级,它不会让元素自己「浮上来」。元素在外面该被谁盖住,还是由它自己在父级上下文里的层级决定。

核心回答

先记住这个答案

isolation: isolate 的作用是让元素创建一个新的层叠上下文,也就是一个独立的「图层组」。组里元素的 z-index 只在组内比较,整组作为一个整体再和外面的元素比。它最常见的两个用途是:把组件内部的 z-index 圈起来,不和页面上的弹窗、导航抢层级;限制 mix-blend-mode,让混合只发生在组件内部。和 transform、opacity、will-change 这些也能创建层叠上下文的属性相比,它的优点是没有任何副作用,不改变包含块,不改变外观,也不强制提升合成层。

  • isolation: isolate 创建层叠上下文
  • 常用来把组件内部的 z-index 圈在组件里
  • 它还可隔离组件内混合效果
  • 变换祖先会影响固定定位包含块

用途一:把组件内部的 z-index 圈起来

组件里有个角标,为了盖住卡片图片写了 z-index: 10。页面上的吸顶导航是 z-index: 5,滚动时角标就从导航上面穿了过去。角标只需要压住自己卡片里的图片,却和整个页面比了层级。

给卡片加 isolation: isolateCSS
.header {
  position: sticky;
  top: 0;
  z-index: 5; /* 吸顶导航 */
}

.card {
  isolation: isolate; /* 卡片自成一个层叠上下文 */
}

.card .badge {
  position: absolute;
  z-index: 10; /* 只在 .card 内部和图片比较 */
}

/* 没加 isolation:badge 的 10 和 header 的 5 比,badge 穿到导航上面
   加了之后:.card 整体按层级 auto 参与外部比较,排在 header 下面 */

加了 isolation: isolate 后,.badge 的 z-index: 10 只在 .card 内部有效。.card 自己在外面没有设置 z-index,按普通层级参与排序,自然在 z-index: 5 的导航下面。组件作者不用知道页面上其他地方用了多大的 z-index,这就是「隔离」的意思。

设计系统里的用法
一些组件库会在组件根元素上默认加 isolation: isolate,这样组件内部可以放心用 1、2、3 这种小数字排层级,不会因为页面上别的地方写了 z-index: 9999 而出问题。这也是解决「z-index 越写越大」的一个办法:层级只在各自的层叠上下文内比较,数字就不用无限往上加。

用途二:限制 mix-blend-mode 的混合范围

isolation 这个属性最初就是为混合模式设计的。mix-blend-mode 会让元素和它背后所有已经画好的内容混合,一直混到最近的层叠上下文为止。

只和组件自己的背景混合
比如一个标题设了 mix-blend-mode: multiply,本意是和卡片的背景色混合,结果把页面背景图也混了进去,颜色完全不对。给卡片加上 isolation: isolate,卡片就成了混合的边界,标题只和卡片内部的内容混合,卡片外面的东西不参与。

为什么不用 transform 来创建

以前没有 isolation 或者大家不熟悉它时,常见的写法是 transform: translateZ(0)、opacity: 0.99 或者 position: relative 加 z-index: 0。它们都能创建层叠上下文,但各自带着额外的效果。

transform 的副作用
transform 不为 none 的元素会成为所有 position: fixed 后代的包含块。组件里如果有一个 fixed 定位的弹窗或遮罩,本来应该铺满视口,加了 transform 后就只铺满这个组件,而且会跟着组件一起滚动。这是实际项目里最常踩的坑。另外 translateZ(0) 常常会让浏览器把元素提升成单独的合成层,数量多了会占用显存。元素本来就有 transform 动画时,写死的 translateZ(0) 还可能被动画覆盖掉。
其他写法的问题
opacity: 0.99 会让元素有一点点透明,截图对比能看出来。position: relative 加 z-index: 0 相对干净,但它改了 position,会让元素成为 absolute 后代的包含块,原来相对更外层定位的子元素位置就变了。isolation: isolate 不改变任何这些,所以能放心加在任何元素上。
回答前,多想一步

容易答错的地方

以为加了 isolation 元素就会浮到最上面
isolation 不改变元素自己在外部的层级。它只是把内部的层级「封装」起来,外部比较时整个组仍然按元素自己的 z-index 和文档顺序排。想让组件整体压在别人上面,还是要给组件本身设 z-index。
以为 isolation 会影响子元素的定位
它不会成为 absolute 或 fixed 后代的包含块,子元素的 top、left 参照谁,和加不加 isolation 没有关系。这正是它比 transform 好用的地方。
以为 isolation: auto 表示不创建上下文
auto 是默认值,意思是不因为 isolation 属性而创建层叠上下文。如果元素同时有 opacity: 0.5 或 transform,照样会创建。auto 不能「取消」其他属性带来的层叠上下文。
试着用自己的话回答

面试官还会怎么问?

除了 isolation,还有哪些属性会创建层叠上下文?

常见的有:根元素 html;position 为 absolute 或 relative 且 z-index 不是 auto;position: fixed 或 sticky;Flex 或 Grid 子项设了 z-index;opacity 小于 1;transform、filter、perspective 不为 none;mix-blend-mode 不为 normal;will-change 指定了上述属性;contain 为 layout 或 paint。

怎么排查一个元素为什么盖不住另一个?

先找出两个元素各自所在的层叠上下文,一路往上找祖先,看哪个祖先创建了上下文。如果它们不在同一个上下文里,比较的是两者最近的、处在同一上下文中的祖先的层级,子元素自己的 z-index 写多大都没用。Chrome 开发者工具的 Layers 面板和一些浏览器扩展能直观看到层叠上下文。

isolation 的兼容性怎么样?

现代浏览器都支持,IE 不支持。要兼容 IE 的老项目只能退回用 position: relative 加 z-index: 0,并留意它对 absolute 子元素定位参照的影响。

从一道题,走向一组知识

把知识连起来

盒模型与排版

哪些 CSS 属性会创建层叠上下文?为什么 z-index 写到 9999 还是盖不住?

isolation 只是创建层叠上下文的方法之一,那题把所有创建条件和对 z-index 的影响讲全了。

盒模型与排版

margin-top 写 50%,为什么算出来的是父元素宽度的一半?

isolation 不改变子元素的包含块,而百分比 margin 要按包含块的行内尺寸计算;两题正好能区分层叠上下文与包含块。

参考资料

  • CSS:盒模型与排版参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 用途一:把组件内部的 z-index 圈起来
  3. 用途二:限制 mix-blend-mode 的混合范围
  4. 为什么不用 transform 来创建
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑