前言

z-index是一个用于控制文档中图层顺序的属性。具有较高z-index值的元素将会出现在具有较低值的元素之上。就像页面上的x轴和y轴决定一个元素在水平和垂直方向上的位置一样,z-index控制它们在z轴上相互层叠的方式。

默认层叠顺序

当我们编写HTML时,出现在文档靠后位置的元素,会自然层叠到靠前位置的元素之上。

<body>
<header class="site-header"></header>
<main class="site-content"></main>
<footer class="site-footer"></footer>
</body>

基于上面给定的HTML片段,如果它们的位置相互重叠的话,footer将会层叠在main内容区域之上,main将会层叠在header之上。

元素可以通过使用position属性和偏移属性的组合来进行重叠,偏移属性值包括toprightbottom以及left

如果为每个元素设置position: absolute ,他们都会在彼此的基础上进行布局。footer元素在文档中最后出现,因此默认情况下,该元素会层叠在前两个元素之上。

.site-header, .site-content, .site-footer {
position: absolute;
width: 400px;
padding: 20px;
}
.site-header {top: 0; left: 0;}
.site-content {top: 50px; left: 50px;}
.site-footer {top: 100px; left: 100px;}

如果使用偏移属性topleft,我们可以更清楚地看到层叠顺序。

层叠上下文

虽然使用position: absolute可以创建相互重叠的元素,但我们还没有创建所谓的层叠上下文

层叠上下文可以通过以下任意方式进行创建:

  • 元素的position属性值为absolute或者relative,且z-index值不为auto
  • flex容器的子元素,且z-index值不为auto
  • opacity属性值小于 1 的元素。
  • transform属性值不为none的元素。

到目前为止,最常见的创建和使用层叠上下文的方式是上述列表中的第一种,所以让我们多花点时间来关注它。

回到先前的示例,我们有三个元素彼此重叠,但目前为止它们并没有z-index值。

z-index属性允许我们控制层叠的顺序。如果在footer元素上设置z-index: 1,在main元素上设置z-index: 2,以及在header元素上设置z-index: 3,那么默认层叠顺序将会完全颠倒。

表面上看起来很简单,更高的z-index值有更高的元素层叠顺序。因此z-index: 9999 总是位于z-index: 9上面。事实果真如此吗?不幸的是,实际情况要更复杂一些。

层叠上下文中的z-index

<header class="site-header blue">header</header>
<main class="site-content green">content
<div class="box yellow"></div>
</main>
<footer class="site-footer pink">footer</footer>

如果我在site-content容器内添加一个box,并将其定位在右下角之外,我们可以看到它位于绿色盒子的上面和粉色盒子的下面。

.box {
position: absolute;
bottom: -25px;
right: -25px;
z-index: 4; /* won't work :( */
width: 75px;
height: 75px;
border: 1px solid #000;
}
.site-header {top: 0; left: 0; z-index: -1;}
.site-content {top: 50px; left: 50px;}
.site-footer {top: 100px; left: 100px; z-index: 3;}

基于我们所了解的z-index ,我们可能会认为,为了使这个黄色的盒子出现在粉色盒子的上方,我们可以为z-index设置一个更高的值。

如果我为黄色盒子设置了z-index: 4,该值要比z-index: 3 高,但是并没有看到任何变化。人们通常视图通过设置一个巨大的数字来强制改变层叠顺序,比如说设置z-index: 9999 ,但这样做没有任何效果。如果在项目中看到这样的z-index值,那就属于坏代码。我们要尽量避免这种行为。

导致上述设置不生效的根本原因,是由于z-index在层叠上下文中的行为。

为了演示这一点,让我们来看一个稍微复杂一点的例子,这是我从MDN网站上借鉴来的。

<header class="site-header blue">
<h1>Header</h1>
<code>position: relative;<br/>
z-index: 5;</code>
</header> <main class="site-content pink">
<div class="box1 yellow">
<h1>Content box 1</h1>
<code>position: relative;<br/>
z-index: 6;</code>
</div> <h1>Main content</h1>
<code>position: absolute;<br/>
z-index: 4;</code> <div class="box2 yellow">
<h1>Content box 2</h1>
<code>position: relative;<br/>
z-index: 1;</code>
</div> <div class="box3 yellow">
<h1>Content box 3</h1>
<code>position: absolute;<br/>
z-index: 3;</code>
</div>
</main> <footer class="site-footer green">
<h1>Footer</h1>
<code>position: relative;<br/>
z-index: 2;</code>
</footer>
.blue {background: hsla(190,81%,67%,0.8); color: #1c1c1c;}
.purple {background: hsla(261,100%,75%,0.8);}
.green {background: hsla(84,76%,53%,0.8); color: #1c1c1c;}
.yellow {background: hsla(61,59%,66%,0.8); color: #1c1c1c;}
.pink {background: hsla(329,58%,52%,0.8);} header, footer, main, div {
position: relative;
border: 1px dashed #000;
}
h1 {
font: inherit;
font-weight: bold;
}
.site-header, .site-footer {
padding: 10px;
}
.site-header {
z-index: 5;
top: -30px;
margin-bottom: 210px;
}
.site-footer {
z-index: 2;
}
.site-content {
z-index: 4;
opacity: 1;
position: absolute;
top: 40px;
left: 180px;
width: 330px;
padding: 40px 20px 20px;
}
.box1 {
z-index: 6;
margin-bottom: 15px;
padding: 25px 10px 5px;
}
.box2 {
z-index: 1;
width: 400px;
margin-top: 15px;
padding: 5px 10px;
}
.box3 {
z-index: 3;
position: absolute;
top: 20px;
left: 180px;
width: 150px;
height: 250px;
padding-top: 125px;
text-align: center;
}

在这里,我们有一个headerfootermain容器,就跟以前一样。但是在site-content内部,我们有三个盒子,它们都被定位了,并赋予了z-index

让我们首先看一下三个主要容器 - headerfootermain

headerz-index值为5,因此出现在z-index值为4的main之上,footerz-index值为2,因此出现在main之下。目前为止一切顺利吧?很好。

main容器内的三个盒子让事情变得扑朔迷离起来。

Content box 1的z-index值为6,但出现在header下面,而headerz-index值为5。

Content box 2的z-index值为1,但出现在footer上面,而footerz-index值为2。

这究竟发生了啥?

所有疑虑都可以通过以下事实来解释:所有的z-index值都是在其父级层叠上下文中生效的。因为父容器.site-content相比footer而言,有一个更高的z-index值,因此.site-content中的任何定位元素都将在该上下文中计算。

在层叠上下文中思考层叠顺序的一个好方法是,把它看作是嵌套有序列表中的一个子项目。按照这种思路可以写成如下格式:

  • Header: z-index: 5

  • Main: z-index: 4

    • Box 1: z-index: 4.6
    • Box 2: z-index: 4.1
    • Box 3: z-index: 4.3
  • Footer: z-index: 2

因此,即使headerz-index: 5 ,content box 1是z-index: 6 ,但content box 1的渲染顺序是4.6,仍然小于5。因此,content box 1在header下面。

刚开始确实有点乱,但随着练习,开始有眉目了。

z-index只作用于定位元素

如果你想控制元素的层叠顺序,你可以使用z-index达到目的。但是,只有当该元素的position值为absoluterelativefixed时,z-index才会产生影响。

position精确地放置元素,对于建立复杂的布局或有趣的UI模式来说是不错的。但通常只是想要控制层叠的顺序,而不把元素从它在页面上的原始位置移开。

如果是这种情况,你可以只设置position: relative,而不提供toprightbottomleft的任何值。该元素将保持在其在页面上的原始位置,文档流不会被打断,z-index值将会生效。

z-index可以是负值

分层元素通常是为了建立复杂的图形或UI组件。这通常意味着将分层元素彼此重叠,并设置不断增加的z-index值。要把一个元素放在另一个元素的下面,它只需要有一个较低的z-index值,但这个较低的值可以是负值。

当使用伪元素并希望将其定位在其父元素的内容之后时,负值的z-index是非常有用的。

由于层叠上下文的工作方式,对于任何:before:after元素,如果它们要被定位在其父元素的文本内容后面,那么它们需要一个负的z-index值。

z-index策略

让我们用我在项目中应用z-index的一个简单策略来总结一下。

以前,我们使用个位数递增来设置z-index值,但如果你想在两个设置了z-index: 3z-index: 4 的元素之间添加一个新的元素,你该怎么办?你必须同时改变更多的值。这可能会成为问题,并容易在网站的其他部分破坏CSS。

使用100步长设置z-index

在处理z-index时,经常会看到这样的代码:

.modal {
z-index: 99999;
}

这样的代码对我来说非常粗糙,当附加上!important时,会更加糟糕。当看到这样的值时,往往意味着开发者不了解层叠上下文,并试图强制一个层在另一个层的上面。

与其使用像9999、53或12这样的任意数字,不如使我们的z-index比例系统化,为程序带来更多秩序。这里我将使用以100为基础进行递增的z-index值。

.layer-one {z-index: 100;}
.layer-two {z-index: 200;}
.layer-three {z-index: 300;}

我这样做是为了保持事情的条理性,同时也是为了注意整个项目中使用的众多不同的层。另一个好处是,如果需要在其他两个图层之间添加一个新的图层,有99个潜在的值可以挑选。

当建立一个z-index系统时,这种手动方法是相当可靠的,但当与像Sass这样的预处理器的能力相结合时,可以变得更加灵活。

原文链接:https://www.sitepoint.com/atoz-css-z-index/

作者:Guy Routledge

掌握CSS中的z-index的更多相关文章

  1. 深入理解CSS中的层叠上下文和层叠顺序(转)

    by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpress/?p=5115 零.世间的道 ...

  2. 深入理解css中position属性及z-index属性

    深入理解css中position属性及z-index属性 在网页设计中,position属性的使用是非常重要的.有时如果不能认识清楚这个属性,将会给我们带来很多意想不到的困难. position属性共 ...

  3. 深入理解CSS中的层叠上下文和层叠顺序

    零.世间的道理都是想通的 在这个世界上,凡事都有个先后顺序,凡物都有个论资排辈.比方说食堂排队打饭,对吧,讲求先到先得,总不可能一拥而上.再比如说话语权,老婆的话永远是对的,领导的话永远是对的. 在C ...

  4. [转]深入理解CSS中的层叠上下文和层叠顺序

    http://www.zhangxinxu.com/wordpress/2016/01/understand-css-stacking-context-order-z-index/ 零.世间的道理都是 ...

  5. CSS中的层叠上下文和层叠顺序

    一.什么是层叠上下文和层叠水平 层叠上下文和层叠水平有一点儿抽象.我们可以吧层叠上下问想象成一张桌子,如果有另一个桌子在他旁边,则代表了另一个层叠上下文. Stacking context 1由文件根 ...

  6. 深入理解css中position属性及z-index属性 https://www.cnblogs.com/zhuzhenwei918/p/6112034.html

    深入理解css中position属性及z-index属性 请看出处:https://www.cnblogs.com/zhuzhenwei918/p/6112034.html 在网页设计中,positi ...

  7. 浅析CSS中的BFC和IFC

    1. 为什么会有BFC和IFC 首先要先了解两个概念:Box和formatting context: Box:CSS渲染的时候是以Box作为渲染的基本单位.Box的类型由元素的类型和display属性 ...

  8. CSS系列:CSS中盒子的浮动与定位

    1. 盒子的浮动 在标准流中,一个块级元素在水平方向会自动伸展,知道包含它的元素的边接:而在竖直方向与相邻元素依次排列,不能并排. CSS中float属性,默认为none.将float属性的值设置为l ...

  9. Css中的Position属性

    Css中的Position属性 Css属性在线查询地址: http://www.css88.com/book/css/properties/index.htm CSS 中的 position 属性 在 ...

  10. css中position与z-index

    position属性 在css中,position属性用来控制元素的位置信息,其取值共有4种,即static.relative.absolute.fixed. 静态定位(static) 若没有指定po ...

随机推荐

  1. pandas子集选取的三种方法:[]、.loc[]、.iloc[]

    pandas读取Excel.csv文件中的数据时,得到的大多是表格型的二维数据,在pandas中对应的即为DataFrame数据结构.在处理这类数据时,往往要根据据需求先获取数据中的子集,如某些列.某 ...

  2. CentOS 并没有死,Rocky Linux 让其重生

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 近日,CentOS 官方发文称CentOS Stream ...

  3. pyhon对excel的xls与xlsx的读取,写入

    import shutilimport osfrom openpyxl import load_workbookfrom xlutils.copy import copyimport win32com ...

  4. python和pycharm下载与安装

    python解释器 1.python的由来 Python诞生于1989年的一个圣诞节,其创作者Guido van Rossum为了打发圣诞节假期的无聊,便开始了Python语言的编写.Python第一 ...

  5. Soa: 一个轻量级的微服务库

    Soa 项目地址:Github:MatoApps/Soa 介绍 一个轻量级的微服务库,基于.Net 6 + Abp框架 可快速地将现有项目改造成为面向服务体系结构,实现模块间松耦合. 感谢 Rabbi ...

  6. layui数据表格导入数据

    作为一个后端程序员,前端做的确实很丑,所以就学习了一下layui框架的使用.数据表格主要的问题就是传输数据的问题,这里我用我的前后端代码来做一个实际的分解. 前端部分 可以到layui官网示例中找到数 ...

  7. Python模块Ⅱ

    Python模块2 part3 模块的分类: 内置模块200种左右:python自带的模块,time os sys hashlib等 第三方模块6000种左右:需要pip install beauti ...

  8. 国内GPU 厂商产品分布

    抽空理了理国内目前已知显卡厂商的各类产品(来源与各个公司产品网站),可能不全,后续会实时更新. 目前来看,显卡市场还是国外两巨头+intel 占据了绝大数的市场,intel 在igpu上深耕了很多年, ...

  9. [CSP-S 2019 Day2]Emiya家今天的饭

    思路: 这种题目就考我们首先想到一个性质.这题其实容易想到:超限的菜最多只有一个,再加上这题有容斥那味,就枚举超限的菜然后dp就做完了. 推式子能力还是不行,要看题解. 式子还需要一个优化,就是废除冗 ...

  10. 【转】理解 CI 和 CD 之间的区别

    有很多关于持续集成(CI)和持续交付(CD)的资料.很多文章用技术术语来进行解释,以及它们怎么帮助你的组织.可惜的是,在一些情况下,这些方法通常与特定工具.甚至供应商相关联.在公司食堂里非常常见的谈话 ...