2012-07-23 13 views
5

Cuando se da un elemento opacity, todos los elementos estáticos y relativos del elemento se representan con transparencia parcial. Sin embargo, los elementos con position: absolute (o position: fixed) no heredan esto, y en su lugar se representan con opacidad total a menos que se indique específicamente lo contrario.Forzar elementos de posición absoluta para heredar transparencia

Ahora, podría sustituir a las asignaciones a style.opacity con una llamada a una función que realiza la asignación, a continuación, recorre todos los niños, conseguir su estilo computarizada y ver si sus órdenes de propiedad de posición de la adición de su propio style.opacity ... pero eso es un poco nuclear.

También sé que podría agregar opacity: inherit a los elementos apropiados, pero esto solo funciona si son hijos directos del elemento desvanecido, ¿y si son descendientes?

Me gustaría saber si hay una manera de forzar a los elementos a heredar la transparencia correcta.

Nota al margen: IE funciona de la manera que quiero cuando uso filter:alpha(...), curiosamente.

+1

Parece que no puedo reproducir el comportamiento que describes. En IE, mi elemento absolutamente posicionado nunca recibe transparencia, incluso con 'filter'. En todos los demás navegadores, el elemento en posición absoluta se comporta como todos los demás elementos secundarios, renderizados con la misma opacidad que se establece en el elemento principal. – BoltClock

+0

[Hecho un violín] (http://jsfiddle.net/2Zqd6/) - acaba de probar en Chrome y tienes razón, esto parece ser un problema específico de IE ... –

Respuesta

8

Así como se vio después, la respuesta fue simplemente "asegurarse de que los elementos absolutos tienen un contenedor relativo que se ve afectada por la transparencia". Me olvide de.

+0

¡Bonito hallazgo! Eso es lo que estaba buscando también. Estoy seguro de que todo se explica aquí, si solo un ser humano pudiera leerlo: http://www.w3.org/TR/css3-color/#opacity –

0

Según los comentarios, parece ser un problema solo de IE. También parece ser un error que necesita solucionar. Sin embargo el establecimiento de sólo el elemento posicionado ...

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

... en IE8-9 does propagate to children del elemento absolute heredar el opacity, suponiendo que esos mismos niños do not have position conjunto (even position: relative for IE8, sin embargo, demostraron que una a later experiment in IE9 nieto del elemento absolute parecía estar oculto cuando también era position: absolute). Cualquier otro niño posicionado necesitaría lo mismo. IE7 (si le importa) falló en la noche teniendo el inherit para trabajar en el filter.

IE9 could be resolved by having position: relative set a la #container sin ningún inherit situado en #contained, pero que podría afectar seriamente su posición de absolute los niños (aunque no fixed unos).

Si se trata de muchos elementos posicionados dentro de, entonces recomendaría condicionalmente alimentaciónthis code a IE9 y bajo (no he probado IE10).

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

Por supuesto, se propaga a los niños - eso es porque IE8 admite 'inherit'. Sin embargo, no se propaga a los nietos, etc. a menos que también hayan heredado. Si haces que nietos hereden, pero no niños, entonces los niños pasarán su 'opacidad: 1' a los nietos, sin dar ningún efecto aparente.Sin embargo, el violín no demuestra el uso de descendientes anidados arbitrariamente (nietos, etc.). Además, IE7 no admite 'inherit' en nada. – BoltClock

+0

@ BoltClock - la etiqueta 'p' en el primer violín no tiene' position' ni 'opacity' set, aún así _does_ disappear, lo que indica que aceptó la' opacity' del elemento 'contained' primario en IE8-9 _hasta el 'p' en sí ganó' posición' (el segundo violín). Aquí hay un poco más de nietos ["arbitrariamente anidados"] (http://jsfiddle.net/2Zqd6/9/), todos escondidos dentro del contenedor 'absoluto' original que hereda' opacidad', como [siempre que no tengan 'position' en IE8] (http://jsfiddle.net/2Zqd6/10/) (Noté en IE9, funcionó en nietos' absolutos' del elemento 'absolute'). – ScottS

Cuestiones relacionadas