【问题标题】:Set opacity of background image without affecting child elements在不影响子元素的情况下设置背景图像的不透明度
【发布时间】:2011-06-27 05:13:42
【问题描述】:

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

示例

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

【问题讨论】:

标签: css opacity


【解决方案1】:

我们可以通过使用 rgba color

来解决这个问题

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

示例:

以前的 CSS:

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

收件人:

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

【讨论】:

    【解决方案2】:

    另一种选择是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】:

      您可以将 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;
      }
      &lt;div&gt;&lt;span&gt;Hello world.&lt;/span&gt;&lt;/div&gt;

      【讨论】:

      • 非常好的技巧,正是我想要的,谢谢
      • 请@jmohr 将此答案标记为正确答案。
      • 这个答案太聪明了,一开始我忽略了它。不过我也不是那么聪明。谢谢分享。
      • @stickers 我可以问是否说我想让它变得更轻的不透明度,那么我应该在 rgba 中添加哪些数字或小数?谢谢
      • @JaeYing 调整 alpha 值,和rgba 的值相同,否则会有渐变。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:
        #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

        【讨论】:

          【解决方案6】:

          如果您将图像用作项目符号,则可以考虑使用 :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;
          }
          

          【讨论】:

          • 过滤器只是IE解决方案
          • 我认为这可能是最好的解决方案。这是一个纯 CSS 解决方案。也可以使用*zoom: expression( … );(参见:after and :before css pseudo elements hack for IE 7)破解 IE7 支持,但 IE7 终于过时了。
          【解决方案7】:

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

          【讨论】:

            【解决方案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;
            }
            

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

            Demo of this technique.

            【讨论】:

            【解决方案9】:

            将您的图片放入图片编辑器,调低不透明度,将其保存为 .png 并改用它。

            【讨论】:

            • 嗯...我只是投了反对票,但看看这个被接受的答案:stackoverflow.com/a/6502295/131809 投了 10 次,几乎相同。
            • 这是一个不错的选择,不知道为什么会有这么多反对票。如果我可以两次投票,我会的。部分不透明的父元素的子元素将是部分不透明的,并且应该是。所有“解决方法”都是最终应该修复的错误。
            • @mystrdat 你已经在下载图片了,这不是额外的请求。
            • @mystrdat 但他已经在下载箭头图像了。您还没有提供非图像解决方案,这就是我的观点。他已经在下载箭头图了,还不如按需来,不会是额外的请求。我不明白你来自哪里。
            • @brad 抱歉,我再次检查后发现我读错了问题。
            【解决方案10】:

            “过滤器”属性需要一个整数来表示不透明度的百分比,而不是双倍,以便在 IE7/8 上工作。

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

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

            【讨论】:

              【解决方案11】:

              为了真正进行微调,我建议将适当的选择放在浏览器定位的包装器中。当我无法让 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 属性。随着时间的推移,该属性的语法变得标准化,浏览器供应商将放弃对前缀的支持并使用不带任何前缀的 CSS 属性(例如,Firefox 在 Firefox 13 中放弃了对 -moz-border-radius 的支持,而只寻找标准的 @ 987654323@现在的财产)。 IE7 和 IE8 是一个不同的故事,但这只是 IE :-p
              • 我想知道谁对此投了反对票,以及为什么,请。没有信息反馈,投票是无用的。我希望能够改进我的答案。如果只是因为信息过时,请检查日期。 :) 谢谢。
              • @code-sushi:如果反对意见与您的评论几乎同时发生,请考虑它可能来自碰巧同意第三方评论的其他人(请注意评论本身的赞成票)。我没有对你的答案投票,但我必须同意 - 我想补充一点 1)KHTML 永远不会看到 -khtml-opacity 因为它不理解媒体查询,使其无用 2)IE 比 IE 更稳定您认为;它不会因为您将非 IE 前缀添加到适用于 IE 的规则而“炸毁”。在您遇到问题时,问题一定来自其他地方。
              • 我的原始答案来自近 2 年前,最近发生了反对票,就像今年一样。我只是好奇而已。至于 IE cmets,当仍然需要支持时,它们属于 7 个;我很确定现在在大多数情况下忽略 IE 7 是可以的。感谢您的反馈。
              【解决方案12】:

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

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

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

              【讨论】:

              • 好吧,它不会直接工作。例如,您需要将 div 作为具有 background-color: (255,255,255,0.5) 的父元素
              【解决方案13】:

              这适用于所有浏览器

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

              【讨论】:

              • 我认为您需要将上述代码中的“引号”更改为“以便在直接复制粘贴时正常工作。
              • 这个答案是否仍然是人们发现的最佳解决方案:“如何使子元素不继承父元素的 CSS 不透明度值”?我需要孩子真正成为一个孩子......并且在文档流程中......并且也不想为此引入javascript / flash;更喜欢纯 CSS。
              • 我有 50% 不透明的父
              • 包含我想要 100% 不透明的子图像。将
              • 设置为 position:relative; 并将 img 设置为 position:absolute; 不允许我覆盖 img 上继承的不透明度,并且我不能为
              • 本身使用绝对定位(那是一团糟; -)。在 Javascript 中,我尝试了 imgs[i].style.opacity = '1';,但这也无法覆盖继承的不透明度。如果我理解正确,我也不能使用 rgba,因为我需要影响 imgs 本身,而不仅仅是背景颜色。有人推荐给我吗?
            • 整个答案毫无意义。给出的代码,除了正是询问者 不想做 因为 它不起作用 之外,与描述或链接不匹配。我很难理解为什么有这么多人支持它。
            • 如果问题是“如何在元素上设置 50% 的透明度”,这将是一个很好的答案。
            • 【解决方案14】:

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

              将十六进制颜色转换为 RGBA

              【讨论】:

              • 这不适用于 OP 要求的background-image
              【解决方案15】:

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

              【讨论】:

                猜你喜欢
                相关资源
                最近更新 更多
                热门标签