CSS元素的层叠与z-index设置

2016-02-19 23:36 29 1 收藏

下面图老师小编跟大家分享一个简单易学的CSS元素的层叠与z-index设置教程,get新技能是需要行动的,喜欢的朋友赶紧收藏起来学习下吧!

【 tulaoshi.com - Web开发 】

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

  我们在文章的更新中,特别注重对新手的辅导,但webjx.com面对的是广大的开发人员,大家可能会遇到各种各样的问题,有些问题很不常见,或者应用的很少,但我们依然有必要学习更多的CSS布局知识与技术,以应对可能出现的复杂多变的CSS内外形势(挺汗)。今天这篇文章,主要介绍了元素的层叠与z-index设置,希望对您有所帮助,更多的知识,请多多参考webjx.com的教程。

声明

  定位元素:position属性值设置除默认值static以外的元素,包括relative,absolute,fixed。
  平台:win/IE win/FF

z-index:

  用来确定定位元素在垂直于显示屏方向(以下称为Z轴)上的层叠顺序


  值:   auto | 整数 | inherit
  默认:  auto
  适用于: 定位元素
  继承性: no

理解stacking context

  每个box都归属于一个stacking context,它是元素在z轴方向上定位的参考。根元素形成 root stacking context,其他stacking context由定位元素设置z-index为非auto时产生。如#div1{position:relative;z-index:0;}即可使 id=div1的元素产生stacking context。stacking context和 containing block 并没有必然联系。

理解stack level

  在一个stacking context中的每个box,都有一个stack level(即层叠级别,以下统一用stack level),它决定着在同一stacking context中每个box在z轴上的显示顺序。同一stacking context中,stack level值大的显示在上,stack level值小的显示在下,同一stack level的遵循后来居上的原则(back-to-front )。不同stacking context中,元素显示顺序以父级的stacking context的stack level来决定显示的先后情况。于自身stack level无关。注意stack level和z-index并不是统一概念。(将在后文慢慢理解)

stack level规则

  每个stacking context中可包含块级(block)元素、内联(行内inline)元素,还有设置float属性的元素、定位元素等等他们在同一父级 stacking context中的显示顺序是怎样的?即stack level是怎样的呢?比如一个块级元素和内联元素发生层叠的话谁会在上面呢?是不是谁在后面谁就在上面呢?

  根据w3c关于stack level的介绍可以得出以下stack level规则
  每个stacking context都包括以下stack level (后来居上):


  父级stacking context的背景、边界
  z-index值为负值的定位元素(值越小越在下)
  文本流中非定位的、block块级子元素
  文本流中非定位的、float浮动子元素
  仿佛能产生stacking context的inline元素
  否则,inline元素的stack level将在block元素之前。
  z-index:auto/0的定位元素
  z-index值为正的定位元素(值越大越在上)

以上stack level在浏览器执行情况:

  firefox3.0下测试完全吻合,firefox2.0下稍有不同即:z-index值为负值的定位元素在父级stacking context的背景、边界之前。
  ie6.0和7.0中:inline元素的stack level位于block元素之前,且文本流中非定位的、float浮动子元素(以下简称浮动元素)和文本流中非定位的、block块级子元素(以下简称block元素)处于同一级。

FF下测试

测试页面: 01.html(请分别在FF3.0和FF2.0中打开)

代码说明:

  由前所述,如果元素的stack level同级则后来居上;元素的stack level高,这无论代码在文档中位置如何都显示在上面,即使代码在最前面;如果元素的stack level低,无论代码位置如何都将显示在下面,即使代码在最后面。

  我们就根据这一点,以3.文本流中非定位的、block块级子元素和4.文本流中非定位的、float浮动子元素为例,如果我把float元素 的代码写在block元素的前面,且实际显示为:float元素在block元素之上。即可证明:"float元素的stack level级别较block元素高。因为如果同级,或者block元素的stack level高都应是block元素显示在上。

  根据以上,根据标准中的顺序,把stack level高的元素代码写在前面,stack level低的代码写在后面,如果显示结果是:代码在前面的元素显示在上方 ,即证明上面的stack level规则。

测试结果:

  在FF3.0中结果和标准顺序一致。FF2.0中z-index值为负值的定位元素在父级stacking context的背景下面。(注意ff2.0的这个特殊性)

IE下测试

测试页面: 2.html (请在IE下浏览)

代码说明:

  此代码也是根据上面的测试思想,但由于inline元素在ie中的特殊性,把inline的代码写在了后面,事实证明结论是正确的。对于block元素和float元素顺序大家可以交换顺序测试。

测试结论:

  IE下(无论ie6.0或者ie7.0)float元素和block元素属同一stack level,而inline元素较其stack level低。

解释说明:

了 float元素,z-index:auto的定位元素仿佛产生了新的stacking context,但其真正能产生新的stacking context的后代任按其父级stacking context定位。(但IE中z-index:auto的定位元素
会拥有z-index值0,产生一个新的stacking context,并影响其子元素定位。这是IE一个BUG)
inline元素在FF中仿佛能产生新的stacking context,而在IE中则不能。

  至此stack level规则内容已经完毕,现在应该能理解stack level和z-index的不同。stack level来决定这一个stacking context中各元素在z轴上的显示顺序,对于同一stack level的定位元素才由z-index进一步决定显示次序。

一些问题的解释

怿飞版主在《z-index在IE中的迷惑》一文中最后提到的问题:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

演示地址: 3.html

认为:

解惑:IE浏览器似乎给body元素默认了一个相对定位属性(position: relative)。

真是这样吗?

演示地址: 4.html

分析:

  box1显示在body的下方,根据上面的stack level规则,IE中,如果body默认了一个位置属性,即body是其父级stacking context,box1应显示在其上方,事实却不是这样。而且当我们给body加上position:relative以后,显示效果和stack level规则一致。所以body并没有默认位置属性。
  那为什么负值的定位元素在IE和FF下显示不一致呢?
  ie 中根据stack level规则: z-index为负的定位元素的stack level比父级stacking context(此处是root stacking context)高,显示在其上方。故box1在ie中能显示。ff3.0和标准一致,也能显示。大家可以试一下。
  ff2.0 中由于那条特殊的stack level,即 z-index为负的定位元素的stack level比父级stacking context(此处是root stacking context)低,所以显示在root stacking context下方。故不能看见。
  另外,上面的代码中加上opacity那条后,在ff2.0中即可显示了。这又是什么原因呢?
  推测:在火狐中如果给元素设置opacity属性(1除外),即会产生新的stacking context。
  上面加上opacity属性后在ff2.0中可显示box1在body下,ff3.0box1在body上,(可以根据上面的stack level规则自己分析)符合推测。
在w3c的说明中也证明这点


In future levels of CSS, other properties may
    introduce stacking contexts, for example 'opacity'
    [CSS3COLOR].

总结:

  在一个stacking context中元素的z-轴显示顺序,由元素所处的 stack level 决定。对于同一stack level的定位元素由z-index的大小进一步决定显示次序。
  ie中给元素设置position属性(static除外)可产生新的stacking context
  ff中给元素设置opacity属性(1除外)可产生新的stacking context
  除此之外(也许设置其他属性也会产生新的stacking context,但还不知道)只有定位元素设置了z-index(auto除外)才会产生新的stacking context,子元素将按照新的stacking context,定位。

来源:http://www.tulaoshi.com/n/20160219/1630227.html

延伸阅读
标签: Web开发
当使用了多个样式表,样式表需要争夺特定选择符的控制权。在这些情况下,总会有样式表的规则能获得控制权。以下的特性将决定互相对立的样式表的结果。 正如以前所提及的,网页制作者和读者都有能力去指定样式表。当两者的规则发生冲突,网页制作者的规则会凌驾于读者的其它相同权重的规则。而网页制作者和读者的样式表都超越浏览器的...
标签: Web开发
块元素(block element)一般是其他元素的容器元素,块元素一般都从新行开始,它可以容纳内联元素和其他块元素,常见块元素是段落标签’P”。“form”这个块元素比较非凡,它只能用来容纳其他块元素。 假如没有css的作用,块元素会顺序以每次另起一行的方式一直往下排。而有了css以后,我们可以改变这种html的默认布局模式,把块元素摆放到你想要...
标签: Web开发
课程关键词:、、 要求: 1)宽度、高度均是200像素; 2)颜色为红色#900; 自己做做,看看能不能作出来?先不要看我的代码,如果真的做不出来,就下载下来,跟着我下面说的一步一步修改。 下面是我的代码:  例子1.rar (498 Bytes) 在IE6和FF中显示效果如下图:   怎么样,比较容易吧~,但是你们有没有发现,红色区域离...
标签: Web开发
即使在不太复杂的样式表中,也可能会有两个或者更多个规则找到同一元素。CSS通过一个叫做层叠(cascade)的过程处理这种冲突。层叠给每个规则分配一个重要程度指数。作者定义的样式具有最高的重要性指数,其次是用户定义的样式。但是为了增强用户的控制能力,用户可以通过为任何规则增加一个! important来提高它的重要性指数,让它的优先级...
标签: Web开发
块元素(block element)一般是其他元素的容器元素,块元素一般都从新行开始,它可以容纳内联元素和其他块元素,常见块元素是段落标签'P"。“form"这个块元素比较特殊,它只能用来容纳其他块元素。 如果没有css的作用,块元素会顺序以每次另起一行的方式一直往下排。而有了css以后,我们可以改变这种html的默认布局模式,把块元素摆放到你想...

经验教程

744

收藏

68
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部