CSS中的z-index属性基本使用教程

所属分类: 网页制作 / CSS 阅读数: 1193
收藏 0 赞 0 分享

z-index语法和应用

CSS Code复制内容到剪贴板
  1. z-indexauto | <integer>  

z-index 接受的属性值为:关键字auto和整数,整数可以是负值(Firefox2.0及之前不支持负值)。

需要注意的是 z-index 虽然很给力,却只能应用于定位元素(即设置了 position 属性为非 static 值),其它情况下,z-index 将被忽略。

对于定位元素而言,z-index 意味着:

确定该元素在当前层叠上下文中的层叠级别。
确定该元素是否创建了一个新的局部层叠上下文。


创建层叠上下文

在规范中说明:当某个元素的 z-index 未显式定义或者被指定为 auto 时,该元素不会产生新的局部层叠上下文。也就是说它可以和兄弟,祖先,后辈元素处在同一个堆叠上下文中,它们被放在一起比较层叠级别,儿子可以盖住祖先,父亲也可以盖住儿子,儿子甚至可以越过祖先,盖住祖先的兄弟,在层叠上下文中,它们是并级的关系。来看这样一个例子 DEMO1: z-index与创建层叠上下文

值得高兴的是,大部分浏览器都实现了这个特性;不过在IE6/7下,不论 z-index 值是否被显式定义,都将产生新的局部层叠上下文,也就是说子元素不可以越过是定位元素的父亲,子元素都处在新创建的局部层叠上下文中,只能在内部进行层叠级别的比较。

深入浅出

某区域内有个浮层提示或者下拉菜单,于是可能需要遮住该区域之下的区域。

HTML

XML/HTML Code复制内容到剪贴板
  1. <div class="a">  
  2.     ...   
  3.     <div class="tips">我是一个简陋的浮层提示</div>  
  4. </div>  
  5. <div class="b">  
  6.     ...   
  7. </div>  

CSS

CSS Code复制内容到剪贴板
  1. .a{position:relative;}   
  2. .tips{position:absolute;z-index:99;}  

如上HTML/CSS代码,很显然,浮层 tips 将可以覆盖在其父级元素 a 的兄弟元素 b 之上。

于是你的意图得到实现,效果如下图:
201635115051330.png (294×116)

不过很显然,你依然无法准确的判断出在各浏览器下,tips 能盖住 b 是因为其父级的定位还是本身的定位。

但是我们可以做这样一个测试,我们让 b 也拥有定位,Code如下:

CSS

CSS Code复制内容到剪贴板
  1. .a{position:relative;}   
  2. .tips{position:absolute;z-index:99;}   
  3. .b{position:relative;}  

这段代码run完之后,就比较纠结了,你能得到的效果将会如下:
201635115132931.png (600×140)

首先,我们来解读一下这个例子:因为 a 和 b 都是 relative 且没有定义 z-index (等同于z-index:auto),根据后来居上的原则,此时 b 的层叠级别是要高于 a 的,意思就是说 a 是无法遮住 b 的。不过从 DEMO3 中,我们看到 a 的子元素 tips 遮住了 b,这就表示 tips 能越过它,所以可以判断出 a 没有创建新的局部层叠上下文。很明显,这是完全吻合标准对此的定义。

不过这是在非IE6/7之下结果。在IE6/7下,我们看到 tips 并没能遮住 b,也就是说 tips 无法越过父级,因为 a 创建了新的局部层叠上下文,而 a 的层叠级别又比 b 低,所以 tips 无法遮住 b,这也就是在IE6/7下常出现覆盖Bug的根源。

能得出以下结论:

当定位元素没有显式定义z-index值时,不会创建新的局部层叠上下文
子元素有可能和祖先的兄弟或者祖先兄弟的子元素处在同一个层叠上下文中
在实际工作中,有些情况可能是你没注意或者已然存在的。比如你事先可能并不知道 b 也是定位元素,或者由于某些原因,你需要将其设置为定位元素,于是可能出现各种兼容问题。如果你不了解 z-index 是如何创建局部层叠上下文,且又没注意到IE6/7的实现错误,那么处理起这样的问题将会让你深陷泥潭。

所以在实际的场景中,如果是为了相互覆盖而设置为定位,那么显式的定义 z-index 值,将可避免出现创建新局部层叠上下文差异。

如果需要越过祖先和其它区块内部元素进行相互层叠,那么考虑IE6/7的情况,也应该尽量避免给父级元素进定位。

opacity与层叠上下文

我们知道 opacity 属性是用来设置元素不透明度的。但可能知道 opacity 和层叠上下文有关的不多,不过没关系,这里我们简单聊聊这个话题,有两点必须注意:

当opacity值小于1时,该元素会创建新的局部层叠上下文,也就是说它可以和定位元素进行层叠层别比较
当opacity值小于1时,该元素拥有层叠级别且相当于z-index:0或auto,但不能定义 z-index ,除非本身是定位元素
简单来说,当一个普通的元素定义了 opacity 的值小于1时(比如 opacity:.5),那么该元素的层叠级别将会高于普通元素,其效果类同于定位元素没有显式定义 z-index 的情况,唯一的区别是没有显式定义 z-index 的定位元素不会产生局部层叠上下文,而定义了 opacity 值小于1的元素会产生新的局部层叠上下文。

opacity猜想

假定我们有 a, b, c 三个元素,它们相互层层覆盖在一起,如果这时将 a 元素定义为 opacity:.8,你知道结果会怎样吗?

HTML

XML/HTML Code复制内容到剪贴板
  1. <div class="a">a</div>  
  2. <div class="b">b</div>  
  3. <div class="c">c</div>  

CSS

CSS Code复制内容到剪贴板
  1. .a,.b,.c{width:100px;height:100px;}   
  2. .a{opacity:.8;background:#999;}   
  3. .b{margin:-70px 0 0 30px;background:#090;}   
  4. .c{margin:-70px 0 0 60px;background:#f00;}  

如果你看明白了我对于 opacity 与层叠上下文的描述,相信你可以猜到结果,是的,a 元素将会覆盖 b 和 c 元素,虽然它在HTML文档中出现在 b 和 c 之前,且不是定位元素。

必须看看具体的示例不是么?DEMO4: opacity与局部层叠上下文猜想。

如果我们将 b 和 c 设置为定位元素,又将会如何呢?

CSS

CSS Code复制内容到剪贴板
  1. .a,.b,.c{width:100px;height:100px;}   
  2. .a{opacity:.8;background:#999;}   
  3. .b{position:relative;margin:-70px 0 0 30px;background:#090;}   
  4. .c{position:relative;margin:-70px 0 0 60px;background:#f00;}  

不急,我们可以接着看示例 DEMO5: opacity与局部层叠上下文猜想2。

当一个普通元素定义了 opacity 为小于1的值时,该元素将像定位元素一样拥有层叠级别,可以覆盖普通元素,并且其层叠级别与未显式定义 z-index 的定位元素一样。

opacity创建局部层叠上下文

与未显式定义 z-index 的定位元素唯一不同的是 opacity 值小于1的元素会创建局部层叠上下文。

创建局部层叠上下文意味着什么,前文我们已经详述过。所以不再赘述,这里只给一个示例用以验证该特性。先奉上代码:

HTML

XML/HTML Code复制内容到剪贴板
  1. <div class="a">a   
  2.     <div class="d">d</div>  
  3. </div>  
  4. <div class="b">b</div>  
  5. <div class="c">c</div>  

CSS

CSS Code复制内容到剪贴板
  1. .a,.b,.c,.d{width:100px;height:100px;}   
  2. .a{opacity:.8;background:#999;}   
  3. .b{position:relative;margin:-70px 0 0 30px;background:#090;}   
  4. .c{position:relative;margin:-70px 0 0 60px;background:#f00;}   
  5. .d{position:absolute;z-index:99;height:50px;background:#090;}  

你会发现虽然 a 的子元素 d 将 z-index 定义为99,但 d 仍然无法遮住 b 和 c 元素,这是因为 a 创建了新的局部层叠上下文,d 元素无法超越父级。

需要注意的是,此时就算 a 元素变成了定位元素,也不能改变其会创建新局部层叠上下文的命运,因为他设置了 opacity:.8。

按照我们前文所说,如果 a 没有定义 opacity:.8 ,但却像 b 和 c 元素一样设置了 relative,那么其子元素 d 将可以覆盖 b 和 c,至于这个例子就不再奉上了,大家随便写个测试一下即可。


更多精彩内容其他人还在看

利用纯CSS3实现动态的自行车特效源码

这篇文章主要介绍了如何利用纯CSS3实现动态的自行车的方法,文中给出了完整的实例代码,实现后的效果非常不错,大家可以直接运行看看效果,需要的朋友下面来一起学习学习吧。
收藏 0 赞 0 分享

web前端开发规范文档(2014年版本)

这篇文章主要为大家介绍了前端开发团队遵循和约定的代码书写规范,意在提高代码的规范性和可维护性,需要的朋友可以参考下
收藏 0 赞 0 分享

前端编码规范(4)—— CSS 和 Sass (SCSS) 开发规范

这篇文章主要介绍了前端编码规范(4)—— CSS 和 Sass (SCSS) 开发规范,需要的朋友可以参考下
收藏 0 赞 0 分享

手把手教你用CSS实现带箭头的流程进度条

这篇文章主要给大家介绍了利用CSS实现带箭头的流程进度条大方法,文中给出了详细的示例代码,对大家具有一定的参考价值,有需要的朋友们一起来看看吧。
收藏 0 赞 0 分享

CSS实现三栏布局的四种方法示例

可能有人不理解三栏布局是什么,其实三栏布局页面分为左中右三部分,然后对中间一部分做自适应的一种布局方式,下面这篇文章就给大家详细介绍了CSS实现三栏布局的四种方法,需要的朋友可以参考借鉴,下面来一起看看吧。
收藏 0 赞 0 分享

利用css实现浮雕效果示例代码

这篇文章主要给大家介绍了利用css如何实现浮雕的效果,文中给出了详细的示例代码和解释,相信对大家有一定的参考价值,感兴趣的朋友们下面来一起看看吧。
收藏 0 赞 0 分享

浏览器默认样式(User Agent Stylesheet)的介绍与最佳处理方法

这篇文章主要给大家介绍了浏览器默认样式(User Agent Stylesheet)的相关资料,并给出了相对应的最佳解决方法。有需要的朋友可以参考借鉴,下面来一起看看吧。
收藏 0 赞 0 分享

css中px、em和rem的区别总结

相信每位前端工程师们都有这么一个体会,国内的设计师大都喜欢用px,而国外的网站大都喜欢用em和rem,那么三者有什么区别,又各自有什么优劣呢?下面这篇文章小编就来给大家详细介绍关于css中px、em和rem的区别,需要的朋友可以参考借鉴,下面来一起看看吧。
收藏 0 赞 0 分享

CSS3实现点击放大的动画实例代码

这篇文章主要给大家介绍了关于利用CSS3实现点击放大的动画效果,文中给出了完整的实例代码,相信对大家具有一定的参考价值,需要的朋友们可以一起来看看吧。
收藏 0 赞 0 分享

利用css代码实现纸飞机效果实例源码

这篇文章主要给大家介绍了如何利用css代码实现纸飞机的效果,实现后效果非常不错,文中给出了详细的实例代码,大家可以参考借鉴,下面来一起看看吧。
收藏 0 赞 0 分享
查看更多