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

jmo*_*ohr 207 css opacity css3

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

页脚中的所有链接都需要一个自定义项目符号(背景图像),自定义项目符号的不透明度应为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>  
Run Code Online (Sandbox Code Playgroud)

CSS

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

我试过的

我尝试将列表项的不透明度设置为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;
}
Run Code Online (Sandbox Code Playgroud)

我也尝试过使用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%;
}
Run Code Online (Sandbox Code Playgroud)

Sti*_*ers 96

您可以使用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;
}
Run Code Online (Sandbox Code Playgroud)
<div><span>Hello world.</span></div>
Run Code Online (Sandbox Code Playgroud)

  • 非常好的技巧,正是我想要的,谢谢 (6认同)
  • 在我看来,这就是酷孩子们的表现 (2认同)

小智 93

将图像转换为图像编辑器,调低不透明度,将其另存为.png并使用它.

  • 这是一个很好的选择,不知道为什么这么多的downvotes.如果我可以两次投票,我会.部分不透明父元素的子元素将部分不透明,应该是.所有"变通办法"都是最终应该修复的错误. (9认同)
  • 嗯...我只是投票,但看看这个接受的答案:http://stackoverflow.com/a/6502295/131809 upvoted 10次,几乎完全相同. (8认同)
  • @mystrdat您已经下载了图片,这不是额外的请求. (6认同)
  • @mystrdat但他已经下载了箭头图片.您还没有提供非图像解决方案,所以这就是我的观点.他已经下载了箭头图像,它可能会根据需要而来,这不是一个额外的请求.我不明白你来自哪里. (2认同)

Hus*_*ein 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; 
}
Run Code Online (Sandbox Code Playgroud)

如果您不希望透明度影响整个容器及其子容器,请检查此解决方法.你必须有一个绝对定位的孩子,父母位置相对较低.

查看http://www.impressivewebs.com/css-opacity-that-doesnt-affect-child-elements/上的演示

  • 这整个答案毫无意义.给定的代码,正好是提问者**不想做的**因为**它不起作用**,与描述或链接不匹配.我很难理解为什么有这么多人投票赞成它. (25认同)
  • 这个答案仍然是人们发现问题的最佳解决方案:"如何使子元素不继承父元素的CSS不透明度值"?我需要孩子真正成为一个孩子......并且在文档流程中......并且也不想为此带来javascript/flash; 更喜欢纯CSS. (6认同)

Mr *_*ver 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 过滤器只是一个IE解决方案 (3认同)

Zie*_*mdi 14

您可以将图像放在div中:after或div:before并在"virtual div"上设置不透明度

div:after {
  background: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/owl1.jpg);
  opacity: 0.25;
}
Run Code Online (Sandbox Code Playgroud)

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


use*_*ser 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;
}
Run Code Online (Sandbox Code Playgroud)

使用不透明度.99(小于1)的Hack会创建z-index上下文,因此您无需担心全局z-index值.(尝试删除它,看看在父包装器具有正z-index的下一个演示中会发生什么.)
如果你的元素已经有z-index,那么你不需要这个hack.

演示这种技术.


Rey*_*raa 5

不幸的是,在撰写此答案时,还没有直接的方法可以做到这一点。你需要:

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


kal*_*azy 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;   
}
Run Code Online (Sandbox Code Playgroud)


Min*_*ele 1

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