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

例子

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

HTML

<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%;
}

当前回答

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

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

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

其他回答

你可以把图片放在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;
}

在这里找到 http://css-tricks.com/snippets/css/transparent-background-images/

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

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

示例:

以前的Css:

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

To :

 .login-card {
      // .... others CSS
      background-color: rgba(0, 0, 0, 0.5);
    }
#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-index为正会发生什么。) 如果你的元素已经有z索引,那么你不需要这个hack。

演示此技术。

要真正进行微调,我建议将适当的选择放在针对浏览器的包装器中。当我无法让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);
}

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

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

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;   
}