如何在IE 8中设置div背景的不透明度,而不影响其中包含的元素?

122

我想在不影响IE 8中所包含元素的情况下设置div背景的透明度。请问是否有任何解决方案?请勿回答使用设置1X1.png图像并设置该图像的不透明度,因为我正在使用动态不透明度和管理员可以更改其颜色。

我尝试使用此方法,但在IE 8中无效。

#alpha {
    filter: alpha(opacity=30);
    -moz-opacity: 0.3;
    -khtml-opacity: 0.3;
    opacity: 0.3;
}

rgba(0,0,0,0.3)

同样也可以。


你不能这样做。属性 opacity 影响元素的所有内容(其他 HTML 元素 + 文本)。但我不明白为什么你不想使用 PNG。你只需要在更改 CSS 时一起更改图像(因为我认为,你有不同的 CSS 可以由管理员切换)。 - Elorfin
@Corum:你错了(就像我一样)。这是可能的。看看这篇博客文章。http://robertnyman.com/2010/01/11/css-background-transparency-without-affecting-child-elements-through-rgba-and-filters/ 非常聪明。 - Robert Koritnik
刚刚发布在这里:http://stackoverflow.com/a/11755175/1491212 希望能有所帮助! - Armel Larcier
8个回答

262

opacity 样式会影响整个元素及其内部的所有内容。正确的做法是使用 rgba 背景色。

CSS 相当简单:

.myelement {
    background: rgba(200, 54, 54, 0.5);
}

...其中前三个数字是背景颜色的红色、绿色和蓝色值,第四个数字是“alpha”通道值,它的工作方式与opacity值相同。

有关更多信息,请参见此页面:http://css-tricks.com/rgba-browser-support/

缺点是这在IE8或更低版本中不起作用。我上面链接的页面还列出了一些其他不支持该功能的浏览器,但它们都非常老旧;除了IE6/7/8之外,所有当前使用的浏览器都支持rgba颜色。

好消息是,您可以使用名为CSS3Pie的hack强制IE也支持这一点。 CSS3Pie将许多现代CSS3功能添加到旧版IE中,包括rgba背景颜色。

要在背景中使用CSS3Pie,您需要向CSS添加特定的-pie-background声明,以及PIE behavior样式,因此您的样式表最终会像这样:

.myelement {
    background: rgba(200, 54, 54, 0.5);
    -pie-background:  rgba(200, 54, 54, 0.5);
    behavior: url(PIE.htc);
}

[编辑]

值得一提的是,正如其他人所提到的,您可以使用IE的filter样式,带有gradient关键字。 CSS3Pie解决方案实际上在幕后使用了相同的技术,但消除了您直接与IE的过滤器打交道的需要,因此您的样式表更加清洁。(它还添加了许多其他不错的功能,但这与本讨论无关)


1
太棒了!这帮助了我很多。 - ubuntuuber

24

很简单,你需要做的只是提供

background: rgba(0,0,0,0.3)

& for IE use this filter


(这段代码用于)对于IE浏览器,使用这个过滤器。
background: transparent;
zoom: 1;    
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#4C000000,endColorstr=#4C000000); /* IE 6 & 7 */
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#4C000000,endColorstr=#4C000000)"; /* IE8 */

你可以从这里生成你的rgba过滤器 http://kimili.com/journal/rgba-hsla-css-generator-for-internet-explorer/


1
渐变与不透明度有什么关系? :S - Robert Koritnik
@Robert Koritnik:请查看我对此答案的更好解释- http://stackoverflow.com/questions/5160419/red-bg-black-field-with-opacity-on-85-pink-text/5160668#5160668 还有这里:http://stackoverflow.com/questions/4788564/transparency-and-text-problem/4788642#4788642 - thirtydot
@robert,这只是一个在Web中可用的IE滤镜,它可以产生与rgba相同的效果,而我不是滤镜专家。 - sandeep
@clairesuz,检查一下我的链接,它也提供了这些属性,但当我工作时,我没有使用这些额外的属性。即使没有这些属性,它也可以正常工作。 - sandeep
1
@sandeep,如果没有hasLayout,过滤器将无法工作,您的代码中可能有另一个hasLayout属性,例如width?我只能用一只手工作...我的手腕受伤了,所以回复比较慢,但是这里有一个jsfiddle,其中包含有关IE代码的条件注释,以便比较两种方法。 - clairesuzy
显示剩余2条评论

10

在父元素上设置opacity会影响整个子DOM树

您无法只对某个元素设置透明度,而不会被传递给后代元素。遗憾的是,CSS的opacity并不支持这样的操作。

您可以将两个同级元素放在同一个容器中,并设置透明元素的定位来解决问题:

<div id="container">
    <div id="transparent"></div>
    <div id="content"></div>
</div>

如果要使其内容的同级元素在其上方渲染,您必须将其设置为透明的 position: absolute/relative

rgba 可以实现有颜色背景的透明效果

当然,可以在元素的 background-color 上使用 rgba 颜色设置,但这将限制您只能使用颜色作为背景。抱歉,无法使用图片。不过,如果您提供了 rgba 渐变停止颜色,当然可以使用 CSS3 渐变。

但请注意,rgba 可能不被所需浏览器支持。

无需警告的模态对话框功能

但是,如果您需要遮蔽整个页面,通常可通过添加具有以下一组样式的单独的 div 来实现:

position: fixed;
width: 100%;
height: 100%;
z-index: 1000; /* some high enough value so it will render on top */
opacity: .5;
filter: alpha(opacity=50);

然后当你显示内容时,它应该有更高的z-index。但这两个元素在兄弟姐妹或其他方面并不相关。它们只是按照应该的方式一层放在另一层上面。


这是正确的答案,即使使用背景图片也能正常工作。 - Botea Florin

2

尝试在包含元素上设置更高的 z-index。


1
这种方法怎么样:

 <head>
 <style type="text/css">
  div.gradient {
   color: #000000;
   width: 800px;
   height: 200px;
  }
  div.gradient:after {
   background: url(SOME_BACKGROUND);
   background-size: cover;
   content:'';
   position:absolute;
   top:0;
   left:0;
   width:inherit;
   height:inherit;
   opacity:0.1;
  }
 </style>
 </head>
 <body>
  <div class="gradient">Text</div>
 </body>


0
当您在使用除绝对定位以外的位置特性时,透明度特性会影响整个子div。因此,另一种实现方法是不要将div放置在彼此内部,然后使用绝对定位来控制它们。不要为上层div使用任何背景颜色。

-1

也许有一个更简单的答案,尝试将喜欢的任何背景颜色添加到代码中,例如background-color: #fff;

#alpha {
 background-color: #fff;
 opacity: 0.8;
 filter: alpha(opacity=80);
}

2
它也影响了内容! - Germa Vinsmoke

-1

使用RGBA或者如果你使用十六进制代码,那么将其转换为RGBA。不需要对一些预设元素的CSS进行操作。

function hexaChangeRGB(hex, alpha) {
    var r = parseInt(hex.slice(1, 3), 16),
        g = parseInt(hex.slice(3, 5), 16),
        b = parseInt(hex.slice(5, 7), 16);

    if (alpha) {
        return "rgba(" + r + ", " + g + ", " + b + ", " + alpha + ")";
    } else {
        return "rgb(" + r + ", " + g + ", " + b + ")";
    }
}

hexaChangeRGB('#FF0000', 0.2);

CSS ---------

background-color: #fff;
opacity: 0.8;

或者

mycolor = hexaChangeRGB('#FF0000', 0.2);
document.getElementById("myP").style.background-color = mycolor;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接