在对元素和叠加层使用透明度的过程中,我们遇到了一个CSS奇怪的问题,我们无法解决这个问题。
http://i.imgur.com/h5Lzvde.png
如屏幕截图所示,有两个img元素应用了0.4不透明度。然后我们在这些上方打开一个叠加层,它们出现在此前面。当不透明度设置为1.0时,它们不再显示在前面。
其他相关的CSS是叠加层的Z-Index为999,与按钮没有祖先连接。
答案 0 :(得分:6)
请考虑以下HTML代码段:
<div class="wrapper tweak">
<div class="overlay">
<p>The Overlay Panel</p>
</div>
<div class="content">
<p>The main Content panel with a motif:
<b>♥</b> <b class="foggy">♠</b></p>
</div>
</div>
和以下CSS:
.wrapper {
position: relative;
outline: 1px solid blue;
}
.overlay {
position: absolute;
top: 0;
left: 0;
background-color: white;
border: 1px dotted blue;
width: 400px;
}
.content p b {
background-color: black;
color: white;
padding: 0 10px;
opacity: 1.0; /* default value */
}
.content p b.foggy {
opacity: 0.4;
}
.tweak .overlay {
z-index: 1;
}
基本上,我有一个包含两个子div的包装器.overlay
和.content
。请注意,叠加层位于代码(DOM)中的内容之前。如果它之后,你就不会在第一时间看到这个问题。
内容有两个带有两个不同不透明度值的粗体元素。
请参阅演示小提琴中的基本行:http://jsfiddle.net/audetwebdesign/DxQZv/
启用叠加层时,叠加层前面会显示不透明度为0.4的.foggy
元素。这种排列的堆叠顺序是从后到前:不透明度为1.0(默认值)的流入内容,绝对定位的叠加,然后是不透明度为0.4的元素。
但是,如果您明确将z-index: 1
设置为.overlay
(添加.tweak
类),
然后.overlay
在堆叠顺序中被放置得更高。
还有其他方法可以调整z-index值以获得相同的效果,但这可能是最简单的。
<强>参考:强>
请参阅CSS2规范中的9.9.1 Specifying the stack level: the 'z-index' property 和CSS3颜色模块规范中的3.2. Transparency: the ‘opacity’ property。
从技术上讲,向元素添加不透明度值(1.0除外)会创建一个z-index为0的新堆叠上下文,这也是定位元素所发生的情况。
但是,当两个元素具有相同的z-index时,它们将按照它们在DOM(树顺序)中出现的顺序进行绘制。在这种情况下,首先绘制叠加层,然后绘制不透明度为0.4的粗体元素,这就是它出现在叠加层前面的原因。
还有一个早期问题涉及同一问题:
What has bigger priority: opacity or z-index in browsers?
我在发布答案后发现了。