CSS z-index属性

  利用z-index,可以改变元素相互覆盖的顺序,有较高z-index值的元素比z-index值较低的元素离读者更近。也就是说有较高z-index值的元素会覆盖其他元素。

  ① 如果不对节点设定position属性,位于文档流后面的节点会覆盖前面的节点。比如

<div id="a">a</div>
<div id="b">b</div>

  

  

  ② 如果将position设为relative,absolute或者fixed,这样节点会覆盖没有设置position属性值或者属性值为static的节点

<div id="a">a</div>
<div id="b" style="position:relative">b</div>

  ③ 如果所有节点都定义了position的值且值都不为static,并且未指定z-index值,那么文档流后面的依然要覆盖前面的

<div id="a" style="position:absolute;top:0;">a</div>
<div id="b" style="position:absolute;top:0;">b</div>

  由①②③可知,正常情况下即没有设定z-index值时,文档流后面的节点比文档流前面的节点层级高,设定了position的值(relative/absolute/fixed)的节点比没有设定position值或者值为static的节点层级高。比如:

<div id="a">
    <div id="a-1" style="position:relative;">a-1</div>
</div>
<div id="b">b</div>

  b位于文档流a之后,所有b会覆盖a,而a-1又由于设定了position的值,所以a-1会覆盖b。

  在不使用position属性的节点上使用z-index属性,z-index不会改变叠放顺序。所以要利用z-index来改变叠放的顺序,节点上必须有position属性。

  z-index的值可以取负数,0,正数,auto。那么什么时候z-index的值为auto呢?对于使用了position属性但是没有用z-index的值的节点,在IE6/7中,z-index默认为0,而其他浏览器默认是auto。z-index为0和auto的区别是:z-index为0的节点要参与层级比较,而z-index为auto的节点不参与层级关系比较。

  ④ 所有节点都使用了position属性(relative/absolute/fixed),z-index为0的节点与z-index为auto的节点在同一层级内没有高低之分,而z-index大于等于1的节点高于z-index为0或者auto的节点,z-index为负数的节点低于z-index为0或者auto的节点。

<div id="a" style="position:absolute;z-index:2;">a</div>
<div id="b" style="position:absolute;z-index:0">b</div>
<div id="c" style="position:absolute;">c</div>
<div id="d" style="position:absolute;z-index:-1;">d</div>

  c没有设定z-index的值,所以z-index的值为auto,a的z-index的值为2大于b,c,d,所以在最上面,而b的z-index的值为0,虽然在同一层级内b,c没有高低之分,但是在文档流中c位于b之后,所以b在c的下面,d的z-index为-1,所以在最下面。

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

  ⑤ 如果a,b节点定义了position:absolute,a节点的z-index比b节点大,那么a节点的所有子节点会覆盖b节点以及子节点。比如:

<div id="a" style="position:absolute;z-index:2">
    <div id="a-1" style="position:absolute;z-index:1">a-1</div>
</div>
<div id="b" style="position:absolute;z-index:1">
    <div id="b-1" style="position:absolute;z-index:3">b-1</div>
</div>

  由于a的z-index大于b的z-index的值,所以a会覆盖b,a的子节点a-1也会覆盖b,即使b的子节点b-1的z-index值为3比a-1大。

  为某个节点指定了z-index值,且该值不为auto,那么该节点会建立局部叠放上下文,后代节点会参照该节点。但是如果某个节点设定了position的值,但是未设定z-index属性时,即z-index在IE6/7中为0,其他浏览器中为auto。当z-index为auto时,该节点不会建立局部叠放上下文,那么该节点的后代节点该怎么办呢?由此引出定位树的概念。

  浏览器在渲染DOM节点时,除了生成DOM树之外,还会根据DOM树种的定位元素(position不为static)生成定位树。

   ⑥ 根据定位树来确定层级关系,z-index 为 auto 的节点不参与层级关系的比较, 由向上遍历至此且 z-index 不为 auto 的节点来参与比较。比如:

<div id="a" style="position:absolute;z-index:2"><div id="a-1" style="position:relative;z-index:100">
        a-1
    </div>
</div>
<div id="b"><div id="b-1"><div id="b-1-1" style="position:relative;z-index:10;">b-1-1</div>
    </div>
</div>
<div id="c" style="position:absolute"><div id="c-1"><div id="c-1-1"><div id="c-1-1-1" style="position:absolute;z-index:5">c-1-1-1</div>
        </div>
    </div>
</div>

           

  在除IE6/7的浏览器中,c的z-index值为auto,所以它不参与层级比较,它也不为后代建立层叠上下文,后代元素逐级寻找z-index不为auto的最近的祖先元素。此次的层级关系为:

  • a>c>b       因为a的z-index为2,c的z-index为auto,文档流中c在b的后面,所以c>b
  • b-1-1>a     因为b-1-1逐级向上寻找z-index不为auto的祖先节点,最后它与a在同一个层叠上下文中,且b-1-1的z-index为10,所以b-1-1层级大于a
  • a<c-1-1-1<b-1-1   因为c-1-1-1逐级向上寻找z-index不为auto的祖先节点,最后它与a、b-1-1在同一个层叠上下文中,且c-1-1-1的z-index为5,所以它大于a,小于b-1-1

   在IE6/7的浏览器中,c的z-index值为0,当z-index为0,会参与层级关系比较,会建立自己的局部层叠上下文。此时的层级关系为:

  • a>c>b     a的z-index为2,c的z-index为0,所以a>c
  • b-1-1>a>c
  • c-1-1-1<b-1-1  因为c的z-index为0,c<b-1-1,c建立自己的局部层叠上下文,所以c-1-1-1<b-1-1

注意:1.IE6/7 下 position 不为 static, 且 没有z-index属性时 ,z-index 为 0, 除此之外的浏览器 z-index 为 auto。

   2.z-index为0会参与层级比较,建立局部层叠上下文,影响子节点的层级。z-index为auto不参与层级比较,不会建立局部层叠上下文,子节点逐级向上寻找最近的z-index不为auto的节点。

参考文章:http://www.neoease.com/css-z-index-property-and-layering-tree/comment-page-1/

         http://www.neoease.com/css-z-index-dom-tree-to-layering-tree/

时间: 2024-10-14 22:13:39

CSS z-index属性的相关文章

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

深入理解css中position属性及z-index属性 在网页设计中,position属性的使用是非常重要的.有时如果不能认识清楚这个属性,将会给我们带来很多意想不到的困难. position属性共有四种不同的定位方法,分别是static.fixed.relative.absolute.最后将会介绍和position属性密切相关的z-index属性. 第一部分:position: static static定位是HTML元素的默认值,即没有定位,元素出现在正常的流中,因此,这种定位就不会收到t

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

总结:拼爹坑爹不比爹 1,定位移动:距左上角left+top;(移动后对于移动前:如果值为负数,则直接换成整数:如果值为整数,则直接改变相对方向.)2,单一父元素不设值,子z-index才奏效:"不比爹"3,多个父元素,"拼爹坑爹"(子凭父贵,子贵父不贵)(爹设值,因外有body)4,多个父元素多子元素,各父各子高低相互比,就是不比爹:>< [转]深入理解css中position属性及z-index属性 在网页设计中,position属性的使用是非常重要

css常用样式属性详细介绍

对于初学css的来说,肯定会觉得这么多样式不好记,而且记住了也容易忘,其实刚开始我们不用去记这么多的样式,确实是记了也会忘,刚开始只需记住一些常用的就可以了,然后在慢慢的使用过程当中接触并学习一些高级点的,这才是一个靠谱的渐进过程,下面列出一些css常用属性,仅供参考 “文字”属性共有8项: 1.“字体”(font-family),设定时,需考虑浏览器中有无该字体. 2.“大小”(font-size),注意度量单位. 3.“粗细”(font-weight),除了normal(正常).bold(粗

css的一些属性及其属性值

CSS常用文本属性 1.字体.字号类: ①font-weight:字体粗细 bold-加粗.normal-正常.lighter-细体,也可以使用100-900数值,400表示normal,700表示b ②font-style:字体样式.italic-倾斜.normal-正常 ③font-size:字号.可以写px单位,也可以写%.200%表示浏览器默认大小(16px)的两倍=32px ④font-family:字体系列(字体族) >>>可以直接写字体名,也可以写字体系列名. >&g

CSS的常用属性

刚开始学习前段的我,还处于初级阶段,一些东西还是会有搞不明白的时候,还是要大家多多理解.今说就一些关于CSS的常用属性吧! 一.CSS常用选择器 CSS选择器应该说是一个非常重要的工具吧,选择器用得好坏可以直接关系到你代码书写的麻烦程度,简单来说就是CSS选择器用得好,实现相同的功能时所用到的代码就会少,这样做出来的网页代码就没有那么繁杂. 1.选择器的书写样式: 选择器中可以写多对CSS属性,用{}包裹,每个属性名与属性值之间用冒号分隔,多对属性名之间必须用分号分隔. 写法: 选择器{ 属性1

CSS中连接属性的排序

在CSS超链接的属性中,有四个连接方式: a:link  a:hover a:visited a:acticve 之前在使用的时候一直是按照自认为的顺序中去写的,就是 L H V A的排序方式,然而有些时候却发现并不起作用了,查找了一些资料,也上网查找了一下,也有很多人在问及这个问题,如果是按照这种顺序排序,有时候显示正确,而有时候却显示不正确,追究原因,这个可能是由于浏览器的识别先后问题所导致的,也额能有缓存的原因在里面个人觉得,而最正确的写法应该是 L V H ,举个例子: <!DOCTYP

CSS中box-sizing属性的理解与部分用法

今天看了一些关于box-sizing的一些资料,在这里整理一下,希望也能对大家有所帮助. box-sizing是CSS的一个属性,很好的解决了盒模型的相关问题.CSS中的盒模型(Box model)分为两派,一派是W3C的标准模型,一派是IE的传统模型.那它们之间有什么不同的呢?首先需要明确它们都是对元素计算尺寸的模型,具体说就是对元素的width,height,padding,border以及元素实际尺寸的计算关系:而不同的地方就在于两者的计算方法不一至:(下面引用一些公式向大家展示一下两者的

CSS border边框属性教程(color style)

CSS 边框即CSS border-border边框样式颜色.边框样式.边框宽度的语法结构与应用案例教程篇 一.CSS 边框基础知识 CSS 边框即CSS border是控制对象的边框边线宽度.颜色.虚线.实线等样式CSS属性.同时大家可以进入码农教程提供CSS手册查看border手册:http://www.manongjc.com/cssref/pr_border.html 二.Html原始边框与DIV+CSS边框对照 Html表格控制边框:border="1" bordercolo

CSS中display属性:block、inline和inline-block的区别

最近写HTML遇到一个问题:我想设置span的宽度和高度,但是在IE9和chrome下总是不起效果.代码和效果图如下: <head> <style> span{ background-color:#43be60; width:100px; height:50px; margin-top:20px; margin-left:20px; } </style> </head> <body> <div style="background-

CSS的display属性

网页设计中最常用的标签p.div.h1-h6(默认为块级元素),span(默认为内联元素) 1.把元素显示为内联元素和把元素显示为块级元素 <style type="text/css"> div{ display:inline; background:red;}/*区块元素将转换为内联元素*/ span{ display:block; background:green;}/*将内联元素转换为区块元素*/ </style> </head> <bo