Anidar reglas @media en CSS

El soporte parece ser diferente en todos los navegadores.

Verifique el enlace

Firefox: negro con texto blanco.

Opera, Chrome, IE9: azul con texto negro.

¿Cuál es correcto y cómo lo haré consistente?

El código

@media screen and (min-width: 480px) { body{ background-color:#6aa6cc; color:#000; } @media screen and (min-width: 768px) { body{ background-color:#000; color:#fff; } } } 

1.

Curiosamente, parece que las consultas de anidamiento de medios dentro de un @import condicional parecen funcionar.

p.ej:

Index.html

     Media test    

Why is this not consistent.

importer.css

 @import url(media.css) screen and (min-width: 480px); 

media.css

 body { background-color: #6aa6cc; color: #000; } @media screen and (min-width:768px) { body { background-color: #000; color: #fff; } } 

La respuesta corta es que mientras que anidar reglas @media (y no solo consultas multimedia) está permitido en CSS3 , no estaba permitido en CSS2.1 , sobre todo porque no había una razón para permitirlo ya que las consultas de medios aún no existe.

Firefox fue el primero en admitir reglas de @media anidadas, sin embargo, desde el momento en que esta respuesta se publicó por primera vez, otros navegadores se han puesto lentamente al día. A saber, Chrome (y de manera similar, Blink Opera) se ha actualizado para admitirlo.

Por lo que sé, Safari e IE todavía no lo admiten.


Hay un poco de confusión terminológica que necesita aclararse para que podamos entender qué está pasando exactamente.

El código que tiene hace referencia a las reglas de @media , y no tanto a las consultas de medios: la consulta de medios es el componente que sigue al token @media , mientras que la regla es todo el bloque de código que consiste en @media , la consulta de medios y las reglas anidadas dentro de su conjunto de llaves.

Esto puede causar confusión entre muchos cuando se trata de usar consultas de medios en CSS, así como su caso específico donde una regla @media en una hoja de estilos importada funciona correctamente incluso cuando la @import está acompañada por otra consulta de medios. Tenga en cuenta que las consultas de medios pueden ocurrir en las reglas @media y @import . Son lo mismo, pero se usan para aplicar restrictivamente las reglas de estilo de diferentes maneras.

Ahora, el problema real aquí es que las reglas anidadas de @media no son válidas en CSS2.1 porque no está permitido anidar ninguna regla at en las reglas @media . Sin embargo, las cosas parecen bastante diferentes en CSS3. A saber, el módulo Reglas condicionales establece muy claramente que las reglas de @media se pueden anidar, incluso proporcionando un ejemplo:

Por ejemplo, con este conjunto de reglas anidadas:

 @media print { // rule (1) #navigation { display: none } @media (max-width: 12cm) { // rule (2) .note { float: none } } } 

la condición de la regla marcada (1) es verdadera para medios impresos, y la condición de la regla marcada (2) es verdadera cuando el ancho del área de visualización (que para medios impresos es el cuadro de página) es menor o igual que 12cm. Por lo tanto, la regla ‘#navegación {mostrar: ninguno}’ se aplica siempre que esta hoja de estilos se aplique a medios impresos, y la regla ‘.note {float: none}’ se aplica solo cuando la hoja de estilos se aplica a medios impresos y el ancho del cuadro de página es menor o igual a 12 centímetros.

Además, parece que Firefox está siguiendo esta especificación y procesando las reglas en consecuencia, mientras que los otros navegadores aún lo están tratando como CSS2.1.

Sin embargo, la gramática en el módulo de syntax no se ha actualizado para reflejar esto; aún no permite la anidación de reglas at en las reglas @media como con CSS2.1. Esta especificación está progtwigda para una reescritura de todos modos, así que supongo que esto no importa.

Básicamente, CSS3 lo permite (pendiente de reescribir el módulo de syntax), pero no CSS2.1 (porque no define consultas de medios ni permite bloques de reglas de @media nesteds). Y aunque al menos un navegador ha comenzado a admitir la nueva especificación, no llamaría a otros navegadores con errores; en cambio, diré que simplemente aún no se han puesto al día ya que realmente se ajustan a especificaciones más antiguas y estables.

Por último, la razón por la cual su @import funciona es porque @import puede funcionar condicionalmente con la ayuda de una consulta de medios. Sin embargo, esto no tiene relación con la regla @media en su hoja de estilo importada. De hecho, se trata de dos cosas separadas, y todos los navegadores las tratan como tales.

Para que el código funcione de forma coherente en todos los navegadores, puede usar su statement @import o, como ambas reglas usan min-width , simplemente elimine el anidamiento de sus reglas @media :

 @media screen and (min-width: 480px) { body { background-color: #6aa6cc; color: #000; } } @media screen and (min-width: 768px) { body { background-color: #000; color: #fff; } }