设置背景图像的不透明度而不影响子元素

时间:2011-02-14 21:30:39

标签: css css3 opacity

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

实施例

页脚中的所有链接都需要自定义项目符号(背景图像),自定义项目符号的不透明度应为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%;
}

15 个答案:

答案 0 :(得分:89)

将图像带入图像编辑器,调低不透明度,将其保存为.png并改为使用。

答案 1 :(得分:66)

您可以将CSS linear-gradient()rgba()一起使用。

&#13;
&#13;
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;
}
&#13;
<div><span>Hello world.</span></div>
&#13;
&#13;
&#13;

答案 2 :(得分:42)

这适用于所有浏览器

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/

检查演示

答案 3 :(得分:28)

如果您将图像用作项目符号,则可以考虑:before before element。

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

答案 4 :(得分:13)

您可以将图像放在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/

答案 5 :(得分:8)

#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)的Hack会创建z-index上下文,因此您无需担心全局z-index值。 (尝试删除它,看看在父包装器具有正z-index的下一个演示中会发生什么。)
如果你的元素已经有z-index,那么你不需要这个hack。

Demo of this technique

答案 6 :(得分:4)

不幸的是,在撰写此答案时,没有直接的方法来执行此操作。你需要:

  1. 使用半透明图像作为背景(更容易)。
  2. 在您希望不透明的子项旁边添加一个额外的元素(如div),为其添加背景,并在将其设置为半透明后,将其放在提到的子项后面。

答案 7 :(得分:3)

“filter”属性需要一个整数来表示不透明度而不是双倍,以便适用于IE7 / 8。

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

P.S。:我发布这个作为答案,因为SO,编辑需要至少6个更改的字符。

答案 8 :(得分:2)

为了真正微调,我建议在浏览器定位包装器中放置适当的选项。当我无法让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);
}

我可能在上述代码中有裁员 - 如果有人希望进一步清理它,请随意!

答案 9 :(得分:1)

如果您只需将不透明度设置为项目符号,为什么不直接将Alpha通道设置到图像中?顺便说一下,我认为没有办法通过css将不透明度设置为背景图像而不改变整个元素(及其子元素)的不透明度。

答案 10 :(得分:1)

只是添加到上面..你可以使用带有新颜色属性的alpha通道,例如。 rgba(0,0,0,0)确定所以这是黑色但是不透明度为零,所以作为父母它不会影响孩子。这仅适用于Chrome,FF,Safari和....我很瘦O。

将十六进制颜色转换为RGBA

答案 11 :(得分:1)

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

CSS background transparency without affecting child elements, through RGBa and filters

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

答案 12 :(得分:0)

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

您可以尝试使用此代码。我认为它会奏效。您可以访问demo

答案 13 :(得分:0)

另一种选择是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;   
}

答案 14 :(得分:0)

我们可以通过仅使用 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);
    }