【问题标题】:Force absolutely-positioned elements to inherit transparency强制绝对定位的元素继承透明度
【发布时间】:2012-07-21 22:17:38
【问题描述】:

当一个元素被赋予opacity 时,该元素的所有静态和相对子元素都以部分透明的方式呈现。但是,带有position: absolute(或position: fixed)的元素不会继承这一点,而是以完全不透明的方式呈现,除非另有说明。

现在,我可以通过调用执行分配的函数来替换对style.opacity 的分配,然后循环遍历所有子项,获取它们的计算样式并查看它们的位置属性是否需要添加它自己的style.opacity。 ..但这有点像核弹。

我也知道我可以将opacity: inherit 添加到适当的元素中,但这仅适用于褪色元素的直接子元素 - 如果它们是后代怎么办?

我想知道是否有办法强制元素继承正确的透明度。

旁注:当我使用filter:alpha(...) 时,IE 会执行我想要的方式,这很有趣。

【问题讨论】:

  • 我似乎无法复制您描述的任何行为。在 IE 上,我的绝对定位元素永远不会获得透明度,即使是 filter。在所有其他浏览器上,绝对定位元素的行为与所有其他子元素一样,以与父元素上设置的相同的不透明度呈现。
  • Made a Fiddle - 刚刚在 Chrome 中测试过,你是对的,这似乎是 IE 特有的问题...

标签: css opacity


【解决方案1】:

根据 cmets,这似乎只是 IE 的问题。这似乎也是您需要解决的错误。但是仅在定位元素上设置...

opacity: inherit; /* IE9 */
filter: inherit; /* IE8 */

...在 IE8-9 中的 absolute 元素中的 absolute 继承了 opacity假设这些孩子本身是 do not have position 集合even position: relative for IE8;然而,a later experiment in IE9表明absolute 元素的孙子元素似乎在其本身也是position: absolute 时保持隐藏)。任何其他定位的孩子都需要同样的。 IE7(如果你关心的话)晚上让inherit 无法在filter 上工作。

IE9 could be resolved by having position: relative set#container 没有在 inherit 上设置任何 #contained,但这可能会严重影响您对 absolute 孩子的定位(尽管不是 fixed 孩子)。

如果您在内处理许多定位元素,那么我建议有条件地将this code 馈送到 IE9 及以下(我没有测试 IE10)。 p>

#container * {
    opacity: 0;
    filter: alpha(opacity=0);    
}

【讨论】:

  • 当然它会传播给孩子——那是因为 IE8 支持inherit。但是,除非他们也有继承权,否则它不会传播给孙辈等。如果你让孙子继承,而不是孩子,那么孩子会将他们的opacity: 1 传递给孙子,没有明显的效果。但是,小提琴没有演示使用任意嵌套的后代(孙子等)。另外,IE7 不支持inherit
  • @BoltClock--第一个小提琴中的p标签没有设置positionopacity,但它确实消失了,表明它接受了opacity 从 IE8-9 中的父 contained 元素 直到 p 本身获得 position (第二把小提琴)。这里还有更多"arbitrarily-nested" grand-children,都隐藏在原始absolute 容器中,继承opacity,如long as they have no position in IE8(我在IE9 中注意到,它适用于absolute 元素的absolute 孙子)。
【解决方案2】:

事实证明,答案只是“确保绝对元素具有受透明度影响的相对容器”。我忘了。

【讨论】:

  • 不错的发现!这也是我一直在寻找的。我敢肯定这一切都在这里解释,如果只有一个人可以阅读它:w3.org/TR/css3-color/#opacity
猜你喜欢
  • 2018-08-16
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多