在不影响子元素的情况下设置背景图像的不透明度

是否可以设置背景图像的不透明度而不影响子元素的不透明度?

例子

页脚中的所有链接都需要一个自定义项目符号(背景图像),自定义项目符号的透明度应该是50%。

超文本标记语言

<div id="footer">
<ul>
<li><a href="#">Link 1</a></li>
<li><a href="#">Link 2</a></li>
<li><a href="#">Link 3</a></li>
<li><a href="#">Link 4</a></li>
<li><a href="#">Link 5</a></li>
</ul>
</div>

CSS

#footer ul li {
background: url(/images/arrow.png) no-repeat 0 50%;
}

我的努力

我尝试将列表项的不透明度设置为50%,但随后链接文本的不透明度也是50% -似乎没有一种方法来重置子元素的不透明度:

#footer ul li {
background: url(/images/arrow.png) no-repeat 0 50%;
/* will also set the opacity of the link text */
opacity: 0.5;
}

我也尝试使用rgba,但这对背景图像没有任何影响:

#footer ul li {
/* rgba doesn't apply to the background image */
background: rgba(255, 255, 255, 0.5) url(/images/arrow.png) no-repeat 0 50%;
}
624410 次浏览

如果你必须只设置项目符号的不透明度,为什么不直接在图像中设置alpha通道呢?顺便说一下,我不认为有一种方法可以通过css设置背景图像的不透明度而不改变整个元素(及其子元素)的不透明度。

这适用于所有浏览器

div {
-khtml-opacity:.50;
-moz-opacity:.50;
-ms-filter:"alpha(opacity=50)";
filter:alpha(opacity=50);
filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0.5);
opacity:.50;
}

如果您不希望透明度影响整个容器及其子容器,请检查此解决方案。你必须有一个绝对定位的子节点和一个相对定位的父节点。

http://www.impressivewebs.com/css-opacity-that-doesnt-affect-child-elements/检查demo

如果使用图像作为项目符号,可以考虑在伪元素之前使用:。

#footer ul li {
}


#footer ul li:before {
content: url(/images/arrow.png);
filter:alpha(opacity=50);
filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0.5);
opacity:.50;
}

只是为了补充以上..你可以使用alpha通道与新的颜色属性,例如。Rgba(0,0,0,0)好的,这是黑色的但不透明度为零所以作为父元素它不会影响子元素。这只适用于Chrome, FF, Safari和....我瘦O。

将你的十六进制颜色转换为RGBA

把你的图片放到图片编辑器中,降低不透明度,保存为。png格式,然后使用这个格式。

关于这个问题,我找到了一个非常好的和简单的教程。我认为它很好用(虽然它支持IE,但我只是告诉我的客户使用其他浏览器):

CSS背景透明不影响子元素,通过RGBa和过滤器

从那里你可以添加渐变支持,等等。

要真正进行微调,我建议将适当的选择放在针对浏览器的包装器中。当我无法让IE7和IE8“与他人友好相处”(因为我目前在一家继续支持它们的软件公司工作)时,这是唯一对我有效的方法。

/* color or background image for all browsers, of course */
#myBackground {
background-color:#666;
}
/* target chrome & safari without disrupting IE7-8 */
@media screen and (-webkit-min-device-pixel-ratio:0) {
#myBackground {
-khtml-opacity:.50;
opacity:.50;
}
}
/* target firefox without disrupting IE */
@-moz-document url-prefix() {
#myBackground {
-moz-opacity:.50;
opacity:0.5;
}
}
/* and IE last so it doesn't blow up */
#myBackground {
opacity:.50;
filter:alpha(opacity=50);
filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0.5);
}

我可能在上面的代码中有冗余-如果有人希望进一步清理它,请随意!

为了在IE7/8中工作,“filter”属性需要一个整数来表示不透明度的百分比,而不是两个。

filter: progid:DXImageTransform.Microsoft.Alpha(opacity=50);

附注:我把这个作为一个答案,因为所以,需要至少6个改变的字符来编辑。

不幸的是,在写这个答案的时候,有没有直接的方法来做这个。你需要:

  1. 使用半透明图像作为背景(容易得多)。
  2. 在你想要不透明的子元素旁边添加一个额外的元素(如div),添加背景,使其半透明后,将其定位在提到的子元素后面。
#footer ul li {
position: relative;
opacity: 0.99;
}


#footer ul li::before {
content: "";
position: absolute;
width: 100%;
height: 100%;
z-index: -1;
background: url(/images/arrow.png) no-repeat 0 50%;
opacity: 0.5;
}
使用不透明度。99(小于1)创建z-index上下文,因此您不必担心全局z-index值。(试着删除它,看看下一个演示中发生了什么,父包装器有正的z索引。)
如果你的元素已经有z-index,那么你不需要这个hack

该技术的演示

你可以把图片放在div:after或div:before中,并设置虚拟div的不透明度

div:after {
background: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/owl1.jpg);
opacity: 0.25;
}
< p >在这里找到 http://css-tricks.com/snippets/css/transparent-background-images/ < / p >
#footer ul li
{
position:relative;
list-style:none;
}
#footer ul li:before
{
background-image: url(imagesFolder/bg_demo.png);
background-repeat:no-repeat;
content: "";
top: 5px;
left: -10px;
bottom: 0;
right: 0;
position: absolute;
z-index: -1;
opacity: 0.5;
}

您可以试试这段代码。我认为这是可行的。你可以访问演示

你可以使用CSS linear-gradient()rgba()

div {
width: 300px;
height: 200px;
background: linear-gradient(rgba(255,255,255,.5), rgba(255,255,255,.5)), url("https://i.imgur.com/xnh5x47.jpg");
}
span {
background: black;
color: white;
}
<div><span>Hello world.</span></div>

另一个选项是CSS技巧方法,在它后面插入一个与原始元素相同大小的伪元素,以伪造我们正在寻找的不透明背景效果。有时需要为伪元素设置高度。

div {
width: 200px;
height: 200px;
display: block;
position: relative;
}


div::after {
content: "";
background: url(image.jpg);
opacity: 0.5;
top: 0;
left: 0;
bottom: 0;
right: 0;
position: absolute;
z-index: -1;
}

我们可以通过使用rgba颜色来解决不透明度问题

"background-color: rgba(0,0,0, 0.5)"

示例:

enter image description here

以前的Css:

 .login-card {
// .... others CSS
background-color: #121e1b;
opacity: 0.5;
}

:

 .login-card {
// .... others CSS
background-color: rgba(0, 0, 0, 0.5);
}