前面的话

  对于所有定位,最后都不免遇到两个元素试图放在同一位置上的情况。显然,其中一个必须盖住另一个。但,如何控制哪个元素放在上层,这就引入了属性z-index

定义

  利用z-index,可以改变元素相互覆盖的顺序。这个属性的名字由坐标系统得来,其中从左向右是x轴,从上到下是y轴。从屏幕到用户是z轴。在这个坐标系中,较高z-index值的元素比较低z-index值的元素离用户更近,这会导致较高z-index值的元素覆盖其他元素,这也称为堆叠或叠放

z-index

  值: <integer> | auto | inherit

  初始值: auto

  应用于: 定位元素

  继承性: 无

  [注意]z-index应用于定位元素是CSS2的规范,到了CSS3标准,z-index的应用范围扩大了不少

  [注意]所有整数都可以作为z-index的值,包括负数。如果为元素指定一个负z-index值,会将其移到离读者更远的位置,会移到叠放栈的更低层

堆叠规则

  对于CSS2.1来说,页面元素的堆叠规则如下图所示:

定位元素的堆叠规则

  [1]对于定位元素(position不是static的元素)来说,不设置z-index或z-index相同时,后面元素覆盖前面元素

  [2]对于处于同一堆叠上下文中的同一层次的元素来说,默认z-index较大值覆盖z-index较小值

style="width: 100%; height: 361px;" src="https://demo.xiaohuochai.site/css/zindex/z1.html" frameborder="0" width="320" height="240">

堆叠上下文

  一旦为一个元素指定了z-index值(不是auto),该元素会建立自己的局部堆叠上下文。这意味着,元素的所有后代相对于该祖先元素都有其自己的叠放顺序

  [注意]auto值指当前堆叠上下文中生成的栈层次与其父框的层次相同,这个框不会建立新的局部叠放上下文。z-index:auto与z-index:0的值相等,但z-index:0会建立新的局部堆叠上下文

默认样式

<divclass="box1">
<ulclass="list1">
<liid="one">1</li>
<liid="two">2</li>
<liid="three">3</li>
<liid="four">4</li>
</ul>
<ulclass="list2">
<liid="five">5</li>
<liid="six">6</li>
</ul>
</div>
<divclass="box2">
<divid="seven">7</div>
<divid="eight">8</div>
</div>
.box1{z-index:1;}.box2{z-index:auto;}.list1{z-index:2;}.list2{z-index:1;}#one{z-index:-1;}#two{z-index:1;}#three{z-index:0;}#four{z-index:auto;}#five{z-index:2;}#six{z-index:1;}#seven{z-index:2;}#eight{z-index:-1;}
//堆叠顺序
.box1                  1.box1 .list11,2.box1 .list1 #one1,2,-1.box1 .list1 #two1,2,1.box1 .list1 #three1,2,0.box1 .list1 #four1,2,auto
.box1 .list21,1.box1 .list2 #five1,1,2.box1 .list2 #six1,1,1.box2                  auto
.box2 #seven           auto,2.box2 #eight           auto,-1

  [注意]auto,2和auto,-1相当于2和-1,因为auto代表未产生堆叠上下文。则#seven和#eight相当于和它们的父级.box2以及.box1处于同一层次

style="width: 100%; height: 498px;" src="https://demo.xiaohuochai.site/css/zindex/z2.html" frameborder="0" width="320" height="240">

  元素不会叠放在其堆叠上下文(即定位父级z-index为数字值)的背景之下,但可以叠放在其内容之下;当元素没有处于堆叠上下文中,元素不会叠放在<body>元素的背景之下,但可以叠放在其内容之下

style="width: 100%; height: 393px;" src="https://demo.xiaohuochai.site/css/zindex/z3.html" frameborder="0" width="320" height="240">

兼容

【1】IE7-浏览器z-index的默认值是0

  一般地,定位元素的z-index的默认值是auto,而IE7-浏览器定位元素的z-index的默认值是0,二者的区别于IE7-浏览器的定位元素会自动生成堆叠上下文

div{position:absolute;border:1px solid black;
}.div1{width:300px;height:100px;background-color:pink;z-index:1;
}.div2{background-color:lightgreen;top:50px;left:50px;width:200px;height:200px;
}.in2{width:100px;height:150px;background-color:lightblue;z-index:2;border:none;
}
<divclass="div1"></div>
<divclass="div2">
<divclass="in2"></div>
</div>

  一般地,div1的堆叠顺序为1;div2的堆叠顺序为auto;in2的堆叠顺序为auto,2相当于2。所以覆盖层次为in2 覆盖 div1 覆盖 div2。但在IE7-浏览器中,div1的堆叠顺序为1;div2的堆叠顺序为0;in2的堆叠顺序为0,2。所以覆盖层次为div1 覆盖 in2 覆盖 div2

  左边为其他浏览器图示,右边为IE7-浏览器图示

【2】IE6-浏览器关于z-index的一个怪异bug

  当元素本身浮动且不是定位元素(position不是static),元素父级是relative,则在IE6-浏览器在无论该元素的父级的z-index如何设置都不起作用

.div1{position:absolute;z-index:1;width:100px;height:100px;background-color:pink;
}.box{position:relative;z-index:2;
}.div2{float:left;width:150px;height:50px;background-color:lightgreen;
}
<divclass="div1"></div>
<divclass="box">
<divclass="div2"></div>
</div>

  左边是IE6浏览器结果,右边是其他浏览器结果

解决方法

  [1]元素去除浮动

  [2]父级元素的相对定位改成绝对定位

  [3]元素添加position属性(static除外)

  以上三个方法任一方法都可以,其实就是在破坏bug成立的条件

【3】IE6-浏览器下select的z-index无效而遮挡div

  IE6-浏览器下select设置z-index无效,且默认会堆叠在div上

.box{left:30px;z-index:2;position:absolute;width:100px;height:100px;background-color:pink;
}select{width:100px;position:absolute;z-index:1;
}
<divclass="box"></div>
<selectname="select"id="slt1">
<optionvalue="1">第一项</option>
<optionvalue="2">第二项</option>
</select>

  左边是IE6浏览器结果,右边是其他浏览器结果

解决方法

  在IE6-浏览器中,虽然div无法覆盖select,但是iframe可以select。所以可以设置一个与div宽高相同的iframe。让div覆盖iframe,iframe覆盖select,最终达到select被div覆盖的效果

iframe{left:30px;position:absolute;width:100px;height:100px;z-index:2;
}
<iframesrc="#"frameborder="0"></iframe>
<divclass="box"></div>
<selectname="select"id="slt1">
<optionvalue="1">第一项</option>
<optionvalue="2">第二项</option>
</select>

CSS3

  CSS3的出现对过去的很多规则发出了挑战。对层叠上下文z-index的影响更加显著,主要包括以下8个属性

  1、z-index值不为auto的flex项(父元素display:flex | inline-flex)

  2、元素的透明度opacity值不等于1

  3、元素的变形transform不是none

  4、元素的mix-blend-mode值不是normal

  5、元素的filter值不是none

  6、元素的isolation值是isolate

  7、will-change指定的属性值为上面的任意一个

  8、元素的-webkit-overflow-scrolling设置为touch

  9、元素的mask属性不是none

  设置以上9个属性的任意一个,都和设置absolute类似,层叠上下文z-index会生效。下面以opacity透明度为例,进行说明

style="width: 100%; height: 468px;" src="https://demo.xiaohuochai.site/css/zindex/z4.html" frameborder="0" width="320" height="240">

更多专业前端知识,请上 【猿2048】www.mk2048.com

深入理解CSS定位中的堆叠z-index相关推荐

  1. 深入理解CSS定位中的偏移

    前面的话 CSS有三种基本的布局机制:普通流.浮动和绝对定位.利用定位,可以准确地定义元素框相对于其正常位置应该出现的位置,或者相对于父元素.另一个元素甚至浏览器窗口本身的位置.但元素究竟如何定位,定 ...

  2. css定位的百分比的算法,css定位中的百分比

    ----转载自自己在牛人部落中的相关文章--- 在前端css定位中经常面对的一个问题是,百分比定位究竟是针对于谁定位? 一.margin,padding的百分比 首先从css的设计意图说起,在浏览器默 ...

  3. CSS定位中“父相子绝”

    一.定位的介绍 定位有三种:相对定位(position:relative).绝对定位(position:absolute).固定定位(position:fixed) 二.三种定位的用法,特点和实例 2 ...

  4. css怎么设置z坐标,CSS 定位(postion、z-index)

    CSS 定位 CSS有三种基本的定位机制:普通流,浮动,绝对定位(absolute, fixed): 普通流是默认定位方式,在普通流中元素框的位置由元素在html中的位置决定,这也是我们最常见的方式, ...

  5. 【拼爹坑爹不比爹】深入理解css中position属性及z-index属性

    总结:拼爹坑爹不比爹 1,定位移动:距左上角left+top;(移动后对于移动前:如果值为负数,则直接换成整数:如果值为整数,则直接改变相对方向.) 2,单一父元素不设值,子z-index才奏效:&q ...

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

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

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

    转载一篇张鑫旭大神的文章(对于理解GPU硬件加速和网页分层还是有一点帮助的),原文地址:深入理解CSS中的层叠上下文和层叠顺序 零.世间的道理都是想通的 在这个世界上,凡事都有个先后顺序,凡物都有个论 ...

  8. css中img如何定位,使用CSS定位img

    下面是我的HTML代码的简化.我想将div中的img C放在div A中而不考虑元素B. B有一个宽度为70px的背景图像,C的宽度为300px. div A的宽度是屏幕的50%.使用CSS定位img ...

  9. R语言ggplot2可视化堆叠的条形图(stacked bar plot)并在每一个条形图的的中间添加对应的数值、值标签定位在geom_col堆叠的条形图中的每个条形段的中间

    R语言ggplot2可视化堆叠的条形图(stacked bar plot)并在每一个条形图的的中间添加对应的数值.值标签定位在geom_col堆叠的条形图中的每个条形段的中间 目录

最新文章

  1. AIX 3D32B80D 错误
  2. 【转载】如何学JavaScript?前辈的经验之谈
  3. 艾伟也谈项目管理,说说我们项目组的考核
  4. SoftReference和WeakReference
  5. FreeModbus线圈
  6. 油猴管理程序复制百度文库网页内容
  7. Axure RP 9基础教程(1)——界面及基本操作(看完就会画)
  8. wincc7.4安装记录
  9. 日本家用电器技术标准及IEC对照介绍
  10. 下行文格式图片_下行文标准模版[2]
  11. 微信公众号 返回40163
  12. 送东阳马生序 与君共勉
  13. win7删除Guest和administrator内置账户及账户所属文件
  14. html 获取声音频谱,[前端]利用WebAudioAPI获取音频频谱(html5音频可视化)
  15. 3D立体相册不过是冷锋蓝plus版 html+css
  16. 计算机 smb共享,文件大师SMB共享使用方法
  17. 移动终端及常见的操作系统
  18. 热图(Heatmap)绘制(matplotlib与seaborn)
  19. 程序员老王给自己的孩子取名字
  20. SQL Server 日志文件查看器提示超时连接

热门文章

  1. sql 两个 in_SQL基础知识——IN运算符
  2. Java集合(1)--集合概述
  3. 【强化学习】可视化学习tensorboard
  4. 我的2020(年终总结)
  5. 西南交大计算机几个专业,西南交通大学计算机科学与技术专业
  6. es6方法过滤掉两个数组中对象id值相等的项
  7. js如何获取服务器端时间?
  8. centos7.5部署ELk
  9. ID3和C4.5分类决策树算法 - 数据挖掘算法(7)
  10. [读书笔记]TCP/IP详解V1读书笔记-4 5