css不透明度堆叠顺序

Posted

技术标签:

【中文标题】css不透明度堆叠顺序【英文标题】:css opacity stacking order 【发布时间】:2013-05-28 10:53:03 【问题描述】:

我正在尝试在图像顶部添加一个白色 div,然后为白色层添加不透明度,以便我可以在图像上放置文本。

html

<div id="red">
    <div id="white">
        <div id="blue"></div>
    </div>
</div>

CSS:

div 
    width: 300px;
    height: 300px

#red 
    background: red;
    position: relative;
    z-index: -15;

#white 
    background: white;
    opacity: 0.5;
    position: relative;
    z-index: -10;

#blue 
    background: blue;
    width: 100px;
    height: 100px;
    opacity: 1;

http://jsfiddle.net/Nd2EZ/1/

背景呈现粉红色,非常棒。但是我想出现在顶部的蓝色盒子是蓝色的——但遗憾的是它是紫色的。因此,由于某种原因,蓝色框有点不透明。

我怎样才能让蓝色框出现在顶部,没有任何不透明度?

【问题讨论】:

不可能。不过,您可以使用一些额外的标记并将所需的 #white 内容放入 #blue 的同级元素中,并将该元素赋予 opacity:0.5 CSS Opacity That Doesn’t Affect Child Elements 【参考方案1】:

您可以使用rgba(Red - Green - Blue - Alpha),而不是使用opacity,这将获得您想要的效果..

#white 
    background: rgba(255,255,255,.5);
    position: relative;
    z-index: -10;

Demo

顺便说一句,你真的需要z-index :-/ 吗?

【讨论】:

请注意,在 IE8 中 rgba 值将被忽略。不透明度也是如此,但有更直接的解决方法。 @ChrisD 有 polyfills 可用【参考方案2】:

不透明度适用于所有内容,包括儿童。想象一下,孩子们首先被渲染,然后将不透明度应用于这个渲染的内容。如果元素不是子元素 - 即在不同的层次结构中并定位在上面 - 那么它不会受到(前一个)父元素的不透明度的影响。

<div id="red">
    <div id="white">
    </div>
</div>
<div id="blue"></div>

#blue 
    position: absolute;
    width: 100px;
    height: 100px;
    left: 0;
    right: 0;

【讨论】:

【参考方案3】:

您可以像这样构建您的 HTML:

<div id="red">
    <div id="white"></div>
    <div id="blue"></div>
</div>

并将您的 css 更改为:

div 
    width: 300px;
    height: 300px

#red 
    background: red;
    position: relative;

#white 
    background: white;
    opacity: 0.5;
    position: absolute;
    top: 0;
    left: 0;

#blue 
    background: blue;
    width: 100px;
    height: 100px;
    position: absolute;
    top: 0;
    left: 0;

【讨论】:

【参考方案4】:

你所犯的错误是把他们当作孩子。不透明度会影响孩子。当white 不透明度为0.5 时,blue 不透明度将为0.5 甚至1。 More documentation is here.

See this answer了解更多。

【讨论】:

【参考方案5】:

将 div#blue 移动为 div#red 的子元素,然后将 div#blue 的 css 样式位置设置为绝对;

HTML

<div id="red">
    <div id="white">
    </div>
    <div id="blue"></div>
</div>

CSS

div 
    width: 300px;
    height: 300px

#red 
    background: red;
    position: relative;
    z-index: -15;

#white 
    background: white;
    opacity: 0.5;
    position: relative;
    z-index: -10;

#blue 
    background: blue;
    width: 100px;
    height: 100px;
    opacity: 1;
    position:absolute;
    left:0em;
    top:0em;

【讨论】:

以上是关于css不透明度堆叠顺序的主要内容,如果未能解决你的问题,请参考以下文章

CSS 实现图片透明度渐变效果

为啥不透明度声明的顺序在这个两阶段淡入中很重要?

CSS3 基本要素概览

CSS CSS - 使用透明度 - 不透明度

堆叠的半透明盒子的颜色取决于订单?

CSS CSS不透明度和透明度设置