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


214

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

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


Answers:


119

您可以将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>


这是最好的解决方案!
Dzenis H.

93

将您的图像导入图像编辑器,降低不透明度,将其另存为.png并使用它。


8
嗯...我刚刚投票了,但是看看这个被接受的答案:stackoverflow.com/a/6502295/131809投票了10次,几乎一样。
亚历克斯

9
这是一个很好的选择,不知道为什么要进行大量投票。如果我可以投票两次,我会的。部分不透明的父元素的子元素将是部分不透明的,应该是。所有“变通办法”都是最终应修复的错误。
RobW 2012年

6
@mystrdat您已经在下载图像,这不是额外的请求。
brad

2
@mystrdat但是他已经在下载箭头图像。您尚未提供非图像解决方案,所以这是我的观点。他已经在下载箭头图像,它可能会根据需要提供,这不是额外的请求。我不明白你来自哪里。
布拉德

1
我对@brad表示歉意,事实证明,我再次检查后,已经读错了问题。
mystrdat

41

这将适用于所有浏览器

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/查看演示


我认为你需要改变”,在上面的代码中引号“,以便为它工作的时候直接复制粘贴。
nsantorello

6
这个答案仍然是人们发现的以下问题的最佳解决方案:“如何使子元素不继承父元素的CSS不透明度值”?我需要孩子真的是孩子。.并且在文档流中……而且也不想为此引入javascript / flash;更喜欢纯CSS。
govinda

我有50%不透明的父<li>包含我想要100%不透明的子图像。将<li>设置为position:relative;并将img设置为position:absolute;不允许我覆盖img上继承的不透明度,并且我不能对<li>本身使用绝对定位(这是一团糟;-)。在Javascript中,我尝试了imgs[i].style.opacity = '1';,但它也无法覆盖继承的不透明度。如果我理解正确,我也不能使用rgba,因为我需要影响img本身,而不仅是背景色。有人对我有建议吗?
govinda 2012年

26
整个答案没有任何意义。给定的代码,就被恰好是提问者顶部并不想这样做,因为它不工作,不匹配的描述,或链接。我很难理解为什么这么多人支持它。
BoltClock

如果问题是“如何在元素上设置50%的透明度”,这将是一个很好的答案。
lharby

29

如果要将图像用作项目符号,则可以考虑:before伪元素。

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

3
筛选器只是IE解决方案
侯赛因

1
我认为这可能是最好的解决方案。这是一个纯CSS解决方案。也可以使用hack IE7支持*zoom: expression( … );(请参阅IE 7的:after和:before css伪元素hack),但是IE7终于成为过去。
2013年


9
#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,则不需要此技巧。

此技术的演示


您知道为什么我们需要将不透明度设置为小于1的值吗?它是跨浏览器的解决方案吗?
zVictor 2014年

1
@zVictor是的,这是w3c标准化的行为。请参阅了解CSS z-index:堆栈上下文
用户

4

不幸的是,在编写此答案时,尚无直接方法可以做到这一点。你需要:

  1. 使用半透明的图片作为背景(容易得多)。
  2. 在您想要不透明的孩子旁边添加一个额外的元素(如div),向其添加背景,并将其设置为半透明后,将其放置在上述孩子的后面。

4

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

3

为了适用于IE7 / 8,“过滤器”属性需要一个不透明度百分比的整数而不是两倍。

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

PS:我将其作为答案发布,因为这样,至少需要6个更改的字符才能进行编辑。


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

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


3
不必分别定位每个浏览器,只需在单个选择器块中使用浏览器前缀即可。使用浏览器前缀时,浏览器将仅使用适当的CSS属性。随着时间的流逝,该属性的语法变得标准化,浏览器供应商将放弃对前缀的支持,并使用不带任何前缀的CSS属性(例如,Firefox放弃了-moz-border-radius对Firefox 13的支持,border-radius现在仅查找标准属性)。IE7和IE8是一个不同的故事,但这只是IE :-p
第三者

我想知道谁对此投了反对票,为什么?没有信息反馈,投票是无用的。我希望能够改善我的答案。如果仅仅是因为信息过时,请检查日期。:) 谢谢。
代码寿司

@ code-sushi:如果降级投票与您的评论大约在同一时间发生,请考虑它可能来自其他人,该人碰巧同意第三方的评论(请注意评论本身的升票)。我没有对您的答案进行投票,但我必须同意-我想补充一点:1)KHTML永远不会看到,-khtml-opacity因为它不理解媒体查询,使它毫无用处。2)IE比您想象的要稳定。它不会仅仅因为您将非IE前缀添加到适用于IE的规则而“崩溃”了。在您面对该问题时,该问题一定来自其他地方。
BoltClock

我的原始答案来自将近2年前,而像今年一样,最近也曾进行过否决。我只是好奇而已。至于IE的评论,当它们仍需要支持时,它们属于7。我敢肯定,现在大多数情况下现在可以忽略IE 7了。感谢您的反馈意见。
代码寿司

1

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


1

仅添加到上面。您可以将alpha通道与新的颜色属性一起使用,例如。rgba(0,0,0,0)好的,所以它是黑色的,但不透明度为零,因此作为父级它不会影响子级。这仅适用于Chrome,FF,Safari等。

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


4
这不适background-image用于OP要求的。
Torsten Walter


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

您可以尝试此代码。我认为这将会奏效。您可以访问演示

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.