管理大型网站上的 z-index 可能会很痛苦。CSS 难以测试,因此很容易进行更改,从而最终隐藏一些重要的 UI,而您不知道它在哪里。
如果您使用 CSS 预处理器,也许我们可以以特殊方式处理它。
来自游戏编程的想法
垂直堆叠顺序不仅是网页设计的问题,对于游戏开发者来说也是一个主要问题。他们在更加动态的环境中工作,在这种环境中,哪些东西出现在其他东西的顶部至关重要。

在与正在 深入游戏世界 的 Ryan Campbell 的简短交谈中,他说通常处理它的方法是一个枚举(类似于一个命名的常量数组)变量,然后您在需要时引用它。
以下是他可能会使用的一些代码示例
typedef enum : uint16_t {
WorldLayerGround = 100,
WorldLayerBelowCharacter = 200,
WorldLayerAboveCharacter = 400,
WorldLayerTop = 800,
WorldLayerCount = 1600
} WorldLayer;
它是在专门用于声明游戏要使用的常量的文件中定义的。请注意,
- 它们全部一起声明
- 数字之间留有空格
在网页设计中,看到人们用 z-index
编排数百个数字也很常见。这样做的目的是,如果需要,您可以在以后插入一些东西,而如果您使用 1、2、3 等,则无法做到,因为 z-index
不支持小数。但很少看到像那样分组声明 z-index
。在我看来,这似乎是一个好主意!
分组
这样做的目的是将控制垂直堆叠的所有代码都放在一个地方。您可以将所有这些内容放在一起。
.modal {
z-index: 9000;
}
.overlay {
z-index: 8000;
}
.header {
z-index: 7000;
}
但我不是很喜欢这样做。我不喜欢为了组织而重复整个样式表中的选择器。这只是个人喜好。当我找到一个类定义的位置时,该类执行的所有操作都在那里。
也许我们可以做同样的事情,只是使用值……

z-index 部分
也许预处理器的最有用功能是能够进行包含。将多个文件合并到一个输出文件中。这意味着您可以以对您有意义的方式组织您的 CSS,这几乎肯定意味着将其分解成小的模块化部分。
也许您已经有了 variables.styl
或 constants.less
之类的文件。您可以变得更加模块化,并创建一个专门用于管理 z-index
的文件。在 SCSS 中,仅用于包含的文件的典型命名约定以一个下划线开头,因此我们将创建一个 _zindex.scss
。
在该文件中,您将声明包含整个站点中使用的所有 z-index 值的变量。
$zindexModal : 9000;
$zindexOverlay : 8000;
$zindexHeader : 7000;
然后,在其他 SCSS 文件的全局包含集中,您始终可以使用它
@import "zindex";
并根据需要使用它们
.header {
z-index: $zindexHeader;
}
这样做的目的是 **尽一切可能做到这一点**。不要在没有为其创建变量并将其放置在 _zindex.scss
文件中的堆栈中的情况下声明 z-index。
地图可能更简洁
同样的想法,但使用 Sass 地图而不是单个全局变量
$zindex: (
modal : 9000,
overlay : 8000,
dropdown : 7000,
header : 6000,
footer : 5000
);
.header {
z-index: map-get($zindex, header);
}
我想我会将网站转换为这种系统。我没有任何缺点,而且有很多优点。
哇,我真的很喜欢这个想法,尤其是对于多个开发者正在开发的大型项目。每当我遇到 z-index 问题并需要更改一个值时,我都会担心我更改的值是与站点/应用中其他位置的另一个元素结合设置的,而我并不知道,并且通常将 z-index 值更改以解决一个问题只是在其他地方创建另一个问题。很容易忘记哪些值在做什么,这将有助于解决这个问题。我想,如果没有使用这种技术,我至少可以添加一个注释来解释该值及其与哪些其他元素相关联。
感谢您的想法,兄弟!
这个想法 已经在 Twitter Bootstrap 中使用。
这也是我最初借鉴的地方,这是一个很棒的系统。使 z-index 的故障排除变得更加容易。
好主意 - 我肯定会使用地图并编写一个函数来节省以后的输入时间
然后
我以前从未见过这个,我感到很着迷!
你能向我解释一下吗?
地图到底是什么?
你在哪里学到这些东西的?
大约 6 个月前,我开始使用 sass 变量来表示 z-index,并且从未后悔过。起初,我们的开发人员对我们为什么要为单一用途的项目创建变量提出了一些问题,但是当我解释了避免堆叠冲突的好处时,他们恍然大悟。这使使用 z-index 变得轻松无忧。
有一个错字,“Maybe ou already have a variables.styl” 应该为 “Maybe you already have a variables.styl”。
我非常喜欢这个主意。我知道 Bootstrap 也使用 这种方法。我们也在工作中将其应用到自己的代码库中。
如果您有一个记录的编码风格,则添加关于这种技术的说明将有助于其他开发者,这样您就不会在整个代码中发现随机的 z-index 实例没有使用这种方法。
太棒了!我很高兴像您这样有影响力的人终于提出了一种 z-index 标准。我也很喜欢 SASS 的做法。
我已经使用了一种类似的东西有一段时间了,我称之为“Z-Index 指数”:https://github.com/danielmall/danielmallcom/blob/master/-/c/_scss/base.scss(从第 27 行开始)
我一直使用一个堆叠部分来实现这种实用程序,但我使用
data-order="100"
数据属性而不是类。对我来说,这是一个更清晰的分离,但这只是个人喜好。听起来很有趣,我很欣赏这种做法可以被认为是内容层的责任。你能告诉我们更多关于它的信息吗?
不希望成为那个注意到并指出它的人……“nortiously”?
Sass 地图……我甚至不知道它们存在!
是否有某个博客发布了类似“您不知道的 Sass 功能”这样的帖子?哈哈(不过说真的)
我也不知道 Sass 地图是干什么的。现在我要去学习所有关于它们的信息,以确定如何清理我当前的 Sass 代码。不错!
请阅读 文档。:)
除了官方的 Sass 文档外,Hugo 还有一些关于如何使用更高级的功能来改进 Sass 工作流程的优秀内容:HugoGIRAUDEL.com。
我本想说我很惊讶他还没有发表评论,但当然他已经发表了,只是在更下面。
有用的信息,我只是想评论一下最终幻想 3 是多么棒。
顺便说一下,那是 FF6 :-)。但它们都很棒。
我对 z-index 的问题是,它只适用于 position:absolute、position:relative 或 position:fixed 的元素。
对于大量使用 z-index 的网站,您如何处理这种情况?将所有内容都设置为
* {position:relative}
吗?如果是这样,您如何处理在多个层级之上的元素中绝对定位元素?或者您只是避免这种情况,因为它是一种不好的做法?或者有人有一个 Sass 函数,该函数将上述技术与默认情况下将每个具有 z-index 的元素设置为 position:relative 相结合吗?
您不能更改现有系统。z-index 必须始终用于定位元素。我不明白这有什么问题。仍然有一些元素需要保持静态,并且不需要任何定位。
这就是我一直在处理当前正在开发的 Web 应用程序的 z-index 的方式。只有 2 个前端开发人员,20 多个后端开发人员,为每个需要 z-index 的项目设置一个带有变量的 Sass 文件,然后在我们的模式库中记录该文件,这将分层问题减少到 0。
@Fooman — 这将为您提供 Sass 地图的简介:http://benfrain.com/using-lists-with-maps-in-sass-3-3/
谢谢!去阅读。
我以前也没有使用过地图,但从本文中的用法来看,我认为即使没有文章,我也已经可以使用 Sass 地图了。感谢您提供链接。我会试着看看。
将来,我可以看到使用 CSS 变量来完成这件事。除了当前的兼容性限制之外,我认为没有比这更好的方法了。
这是 CSS 变量的“旧”语法。这是新的语法。
好吧,尝试使用 C++11 的类型化枚举挺不错的,但 uint8_t 将值限制在 [0, 255] 范围内,所以……
下次再试试?
你说得对!我已将它更正为可以处理这些数字的类型。
昨晚你睡得好吗?睡得好吗?
对我来说很有道理。这一点没有解决的是第三方小部件(模态、分享按钮等)的集成,这些小部件不可避免地有自己的 z-index 系统,通常使用 JavaScript 将自己放在“最上面”。
我想现在达成一项标准方法只能随着时间的推移减少这个问题。
您如何处理新的堆叠上下文?具有 z-index 7000 的元素可能会显示在具有 z-index 5000 的元素下方,因为它们的父元素的 z-index。
更多信息
http://philipwalton.com/articles/what-no-one-told-you-about-z-index/
https://mdn.org.cn/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context
这是一个好问题。当然,该系统可以扩展以适应。也许只是在组织地图的方式上。
感谢您的怀疑!由于您在“更多信息”中粘贴的链接,我今天学到了一些新东西:)
这正是我担心的问题,Leon。随着堆叠上下文发生变化,事情会变得更加复杂,您最终会遇到使用上述方法的堆叠上下文相关问题。
我很少将我的 z-index 计为超过 3。当然,这意味着所有相关人员都需要了解堆叠上下文。Leon 提到的文章非常棒,可以帮助您使用堆叠上下文编写更好的样式。
但我看到很多人在这里使用了这种方法,效果很好。我会留意它,看看它是否会在某一天派上用场。
@Mudassir:很高兴能帮上忙!堆叠上下文可能很棘手,但一旦您理解了它们,就可以利用它们来发挥优势。
例如:将伪元素隐藏在其父元素后面 (http://nicolasgallagher.com/css-drop-shadows-without-images/)。
很棒的解决方案。Z-index 绝对是那些容易变得混乱和令人困惑的事情之一。任何试图缓解这个问题的方法都是受欢迎的。我认为我将切换到这种方法。
不错的解决方案,但这些 z-index 太高了。从 5000 开始有什么理由吗?我个人更喜欢我的 z-index 保持在 100 以下。我看到太多网站的 z-index 范围从 0 到 999999,这有点荒谬。
太棒了,我以前不知道 SCSS 中有映射值!
Chris,这里有一个很棒的!我开始使用 Sass 地图制作调色板,这是一个很棒的体验。现在 z-index 也加入了列表。
我个人会构建一个额外的函数来获取 z-index 值,而不是多次输入 map-get。下面是一个示例。
这只是多走一步,但我喜欢这种方法。如果您发现它有用,那就太好了。
太棒了!
我使用类似的方法。我不喜欢使用这些任意的高
z-index
数字,然后在它们之间添加新的数字。一段时间后就会变得很乱。相反,我使用列表,并从列表中获取它的索引。
这样,我不必摆弄任何数字,并且在堆栈中添加新项目变得非常容易。
好吧,这听起来很棒,但是——正如之前提到的——由于 CSS 中的堆叠上下文的概念,这一切都归结于无用。很遗憾,但我担心 z-index 仍然很烦人(这是其设计的本质,无法通过 Sass 等辅助工具和技术来克服)。我希望我错了.. :(
我正在开发一个大型 Web 应用程序,我是团队中唯一负责 CSS 的人。这个想法非常有用。谢谢。您的书什么时候可以订购?暗示
对于完全自编代码来说,这听起来很棒,但是当使用不想让您设置 z-index 的库(例如 jQuery-dialogs)时该怎么办?
在我几乎所有工作的网站上,我极少需要为任何东西使用 z-index。你们到底是在用它做什么?
我也是这样,而且在我确实需要使用 z-index 的少数情况下,正确设置堆叠上下文可以解决问题。
我的做法是,每个
position
ed 或transform
ed 元素的z-index
,如果要放在文档流中出现的某个元素之上,都应该为1
或2
,如果z-index
是本地的,则将本地范围(应该具有position: relative
或transform
等)的z-index
设置为0
。此外,整个页面的容器(除了具有全局z-index
的元素——嗯,索引)具有position: relative; z-index: 0;
,对于其具有全局z-index
的同级元素,只需分配 1 或 2 即可。抱歉打错了字。
将本地范围的 z-index 设置为 0,该范围应具有 position: relative 或 transform 等。
我想到了一种处理复杂 z-index 的优雅方法,本质上是将 z-index 抽象成 “层级”,并让 Sass 完成繁琐的工作。这使得整个过程更加 “设计化”,让您只需直观地列出层级,而无需显式声明任何 z-index 值。在 _config.scss 文件中
在 _mixins.scss 文件中
如果需要,这也可以在层级之间使用,以便在需要时插入另一组 z-index 值
结果将会输出在第一层和第二层(来自
$layers
)之间具有适当 z-index 值的 “层级”。我还没有花太多时间优化或扩展它,因为它目前已经满足我的需求,但我知道如果您需要,可以在这之上添加更多功能。也许可以用一个函数来返回某个层级的 z-index,但我还没有用到它。
Chris,请告诉我您的想法,我是长期读者,第一次发帖 ;)
-Mike McCormick
这是输出结果,应该包含在内
您会看到我应该使用这个
而不是这个