HTML中决定元素叠加顺序的CSS属性最有名的应该是z-index了。但是,往往在项目中发现有些情况和我们的预期不太一致。经过研究和学习,总算搞清楚了其中的关系。简单总结如下:

  1. 只有Positioned(Position不为static的元素)元素的z-index属性才有效
  2. z-index可以是负数
  3. 没有z-index或z-index无效的元素(参见第一条)相当于z-index为0;
  4. 符合某些条件(注1)的元素,浏览器会为它们创建一个叫stacking context的东东。根据DOM树结构,stacking context也会形成一个树形结构。
  5. 一个stacking context中的元素会根据z-index决定叠加顺序。z-index大的靠前
  6. z-index 0级元素中,有stacking context的元素的叠加顺序靠前
  7. 以上条件不能区分时,使用DOM树中的顺序决定叠加顺序。

其中细节很多,我也不确定自己的理解都是正确的。欢迎大家指正。

另外,下面是MDN中的一系列相关文章。逐层展开,写得很清楚,各位做WEB的同学可以学习一下。

-- 2015-08-04 在和同事的沟通中,又进行了一些补充 ----------------------------------------

z-index是一个比较邪恶的东西,如果不加控制,很容易形成竞争(传说中的摁下葫芦弹起个瓢)。使用的时候应该有一些规划,不要太随意。如果你们项目使用了Less,建议定义一组常量,规定几个级别。大家都尽量想着几个级别上靠。

另外,大多数时候,其实都可以通过Dom结构的适当调整来减少z-index的使用。往往还可以实现更好的灵活性。例如:

我们知道在Web上要实现一个模态对话框,往往是通过两层div实现的,一层div覆盖全屏,阻止其他元素获得消息,一个div承载模态对话框的内容。如下:

 <head>
<style>
.modal-backdrop {
position: absolute;
left: 0; top: 0;
right: 0; bottom: 0;
background-color: black;
opacity: 0.6; z-index: 1000;
} .modal-dialog {
position: absolute;
width: 800px;
z-index: 1001;
}
</style>
</head>
<body>
<!-- origin web contents -->
<div class="modal-backdrop"></div>
<div class="modal-dialog">
<!-- Modal dialog content -->
</div>
</body>

这样的设计,需要两个z-index值,增加了冲突的风险。并且没有办法支持多次弹出模态对话框(第一次弹出的dialog压在了第二次弹出的backdrop的上面,但是,我们期望第二次弹出的backdrop可以遮住第一次弹出的对话框内容。)。

正确的解决方法应该如下:

 <head>
<style>
.modal-backdrop {
width: 100%; height: 100%;
background-color: black;
opacity: 0.6; z-index: 1000;
} .modal-dialog {
position: absolute;
left: 0; top: 0;
right: 0; bottom: 0;
z-index: 1000;
} .modal-content {
width: 800px;
}
</style>
</head>
<body>
<!-- origin web contents -->
<div class="modal-dialog">
<div class="modal-backdrop"></div>
<div class="modal-content">
<!-- Modal dialog content -->
</div>
</div>
</body>

通过增加了一层Dom结构,只需要使用一个z-index,而且,多次弹出的时候,后面的backdrop可以很好的覆盖前面的对话框内容。

-- 2015-09-21 发现一个细节点 ----------------------------------------

4. 符合某些条件的元素,浏览器会为它们创建一个叫stacking context的东东。根据DOM树结构,stacking context也会形成一个树形结构。

注1:Element with transform, Element with opacity等条件中的Element如果Display是inline的,不会创建Stacking context。因此,往往需要将他们的display改为inline-block.

关于stacking context和CSS z-index的总结的更多相关文章

  1. CSS——关于z-index及层叠上下文(stacking context)

    以下内容根据CSS规范翻译. z-index 'z-index'Value: auto | <integer> | inheritInitial: autoApplies to: posi ...

  2. 层叠上下文(The stacking context)

    MDNThe stacking context 层叠上下文是HTML元素的三维概念,这些HTML元素在一条假想的相对于面向(电脑屏幕的)视窗或者网页的用户的z轴上延伸,HTML元素依据其自身属性按照优 ...

  3. 层叠上下文 Stacking Context

    层叠上下文 Stacking Context 在CSS2.1规范中,每个盒模型的位置是三维的,分别是平面画布上的x轴,y轴以及表示层叠的z轴.对于每个html元素,都可以通过设置z-index属性来设 ...

  4. CSS - 层叠上下文(The stacking context)

    对 MDN 的上的例子的拓展 Root - DIV #1(z-index: 5) - DIV #2(z-index: 2) - DIV #3(z-index: 4) - DIV #4(z-index: ...

  5. CSS:Stacking Context

    通常情况下,HTML页面可以被认为是二维的,因为文本,图像和其他元素被排列在页面上而不重叠.在这种情况下,只有一个渲染进程,所有元素都知道其他元素所占用的空间.z-index属性可让你在渲染内容时调整 ...

  6. The stacking context

    文档中的层叠上下文由满足以下任意一个条件的元素形成: 1. z-index 值不为 "auto"的 绝对/相对定位. 2. position位fixed. 3. opacity 属 ...

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

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

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

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

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

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

随机推荐

  1. linux httpd 服务的安装

    1.查看是否安装了httpd rpm -qa|grep httpd 2.安装httpd 使用yum 安装 yum -y install httpd 3.关闭防火墙和selinxu 4.使用fz软件或者 ...

  2. 说说ID选择符、类选择符和HTML标记选择符的优先级顺序

    ID选择符.类选择符和HTML标记选择符三者之间的优先级顺序是:ID选择符>类选择符>HTML标记选择符,但是可以用!important提升优先权. 如:       p{color:#f ...

  3. 基于python的堡垒机

    一 堡垒机的架构 堡垒机的核心架构通常如下图所示: 二.堡垒机的一般执行流程 管理员为用户在服务器上创建账号(将公钥放置服务器,或者使用用户名密码) 用户登陆堡垒机,输入堡垒机用户名密码,显示当前用户 ...

  4. GNU libc (Glibc) 2.18 发布

    标准C库Glibc发布2.18正式版.2013-08-12 上一个版本是2012-12-25的2.17. 详细改进:Version 2.18 * The following bugs are reso ...

  5. maven 打包 xml文件

    说起来手贱啊,搞了两个小时,就是因为打包的时候,maven无法把xml文件打包到正确的位置. 本来应该是打包到 com/presistence包下,结果打出来有两个包,一个是com/presisten ...

  6. 从源代码分析Android-Universal-Image-Loader的缓存处理机制

    讲到缓存,平时流水线上的码农一定觉得这是一个高大上的东西.看过网上各种讲缓存原理的文章,总感觉那些文章讲的就是玩具,能用吗?这次我将带你一起看过UIL这个国内外大牛都追捧的图片缓存类库的缓存处理机制. ...

  7. Linux下通过NFS共享文件夹

    测试环境:CentOS 6.7 服务端 # yum -y install nfs-utils rpcbind # 开启服务 service nfs start service rpcbind star ...

  8. libevent (二) 接收TCP连接

    libevent 接收TCP连接 Evconnlistener 机制为您提供了侦听和接受传入的 TCP 连接的方法.下面的函数全部包含在`<event2/listener.h>`中. ev ...

  9. jenkins插件 查看job修改历史

    文章来自:http://www.ciandcd.com文中的代码来自可以从github下载: https://github.com/ciandcd 插件jobConfigHistory(https:/ ...

  10. LeadTools Android 入门教学——运行第一个Android Demo

    LeadTools 有很多Windows平台下的Demo,非常全面,但是目前开发手机应用的趋势也越来越明显,LeadTools也给大家提供了10个Android的Demo,这篇文章将会教你如何运行第一 ...