【发布时间】:2011-09-02 22:56:59
【问题描述】:
在大多数浏览器中,当一个 html 元素只是部分不透明时,它的子元素会“继承”这种不透明性。 (这不完全是继承——更准确地说,整个图像被组装起来,包括父级及其子级递归,然后将不透明度应用于整个事物。)
在 IE8 中(我也假设对于早期版本的 IE),不透明度并不总是会发生这种情况。如果子元素具有 position:static (如果没有指定位置,则为默认值),那么它确实像我上面描述的那样工作。但是,如果将位置设置为其他任何值(例如,绝对或相对),那么子元素似乎是完全不透明的。
我想知道如何使不透明度正确地影响父元素和子元素,但仍然保持子元素的位置:绝对;
这是一个问题的例子。下面的代码应该在一个垂直的红色条的顶部制作一个半透明的灰色框,周围有一个半透明的蓝色区域。在 Firefox、Chrome 等上,这是实际看到的。在 IE8 上,蓝色框是正确半透明的,但灰色部分是不透明的。
<!doctype html>
<html>
<head>
<style>
div.parentElem
{
background-color:#0000ff;
position: absolute;
left:75px;
top:75px;
width:300px;
height:225px;
opacity:0.5;
filter:alpha(opacity=50);
}
div.childElem
{
background-color:#808080;
position: absolute;
left: 10px;
right: 10px;
top: 10px;
bottom: 10px;
}
div.redBar
{
position: absolute;
left:150px;
top:50px;
height:350px;
width:25px;
background-color: #ff0000;
}
</style>
</head>
<body>
<div class="redBar"></div>
<div class="parentElem">
<div class="childElem"></div>
</div>
</body>
</html>
显然,这只是一个玩具示例——我可以有一个带有蓝色边框和灰色背景的 div 来达到预期的效果。在真实场景中,我将几个不同的 div 分层,每个 div 都有一个 png 背景图像来动态构建图像。
我第一次尝试的解决方法是将不透明度应用于父级和子级,方法是将子级的过滤器设置为 alpha(opacity=50);或简单地设置过滤器:继承;。这并没有达到预期的效果,因为它会生成一个半透明的蓝色矩形,上面有一个半透明的灰色矩形。中间的空白空间最终是半透明的蓝灰色,而它应该是半透明的灰色。同样,使元素成为兄弟也不起作用。任何解决方案都需要在对任何内容应用任何透明度之前合成两个图像。
在我的研究中,我发现了一些应用 zoom:1; 的建议。或浮动:无;到内部元素可能会解决问题,但对我来说都不起作用。
我最终的解决方法是给子元素位置:静态。这是一种丑陋的解决方案,但我将其应用于上述示例的方法是将子元素的样式更改为:
div.childElem
{
background-color:#808080;
position:static;
margin-left:10px;
margin-right:10px;
height:205px;
margin-top:10px;
}
这是一种丑陋的解决方案,因为这意味着我必须知道对象的高度。此外,在实际情况下,我正在编写几个不同的 png,并且我希望它们成为逻辑上的兄弟姐妹,我必须将它们全部放在嵌套的父子孙子等中。关系。它还阻止我添加任何文本元素,除了堆栈的最顶部(最里面的 div),而不会弄乱定位。不过,它确实有效,而且在所有浏览器中看起来都一样。
有没有什么办法可以避免这种可怕的解决方法,让不透明度正确地影响子元素而不使位置静态?谢谢!
【问题讨论】:
标签: css internet-explorer parent-child opacity css-position