css元素层叠级别及z-index剖析(2)

作者:rong179 来源:蓝色理想 时间:2008-08-29 12:41:00 

FF下测试

测试页面:demo01.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下测试

测试页面:demo02.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中的迷惑》一文中最后提到的问题:

演示地址:demo03.html

认为:

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

真是这样吗?

演示地址:demo04.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的大小进一步决定显示次序。

  1. ie中给元素设置position属性(static除外)可产生新的stacking context

  2. ff中给元素设置opacity属性(1除外)可产生新的stacking context

除此之外(也许设置其他属性也会产生新的stacking context,但还不知道)只有定位元素设置了z-index(auto除外)才会产生新的stacking context,子元素将按照新的stacking context,定位。

标签:z-index,元素,定位
0
投稿

猜你喜欢

  • php函数之strtr和str_replace的用法详解以及效率分析

    2023-06-02 14:04:18
  • js金额浮点格式化控件

    2008-08-01 16:52:00
  • selenium+python实现自动化登录的方法

    2021-08-07 13:38:08
  • IE7下 filter:Alpha(opacity=xx) 的小问题

    2008-12-02 16:24:00
  • 用 iframe 解决下拉框与层之冲突

    2008-04-28 12:24:00
  • 网址站的2.0玩法

    2010-03-15 12:25:00
  • CSS sprites图片拼合生成器

    2007-10-15 12:25:00
  • 深度学习Tensorflow 2.4 完成迁移学习和模型微调

    2023-12-04 14:56:17
  • python3实现字符串的全排列的方法(无重复字符)

    2022-04-14 19:47:56
  • Mybatis update数据库死锁之获取数据库连接池等待

    2024-01-26 20:40:10
  • MySQL数据库自动补全命令的三种方法

    2024-01-26 16:58:35
  • Python 实现数据库(SQL)更新脚本的生成方法

    2024-01-16 21:01:18
  • Python使用os.listdir和os.walk获取文件路径

    2023-01-30 11:02:10
  • Python 变量的创建过程详解

    2022-04-20 03:01:17
  • Python多线程编程(八):使用Event实现线程间通信

    2023-05-07 15:25:50
  • python数据结构之面向对象

    2021-04-09 08:02:06
  • 彻底解决MySql在UTF8字符集下乱码问题

    2011-06-02 12:02:00
  • 小白教你PyCharm从下载到安装再到科学使用PyCharm2020最新激活码

    2021-03-25 05:57:35
  • 用python打印1~20的整数实例讲解

    2023-12-18 21:45:06
  • Python获取昨天、今天、明天开始、结束时间戳的方法

    2022-08-23 18:23:40
  • asp之家 网络编程 m.aspxhome.com