Подтвердить что ты не робот

Вложенные правила @media в CSS

Поддержка в разных браузерах различна.

Проверьте ссылку

Firefox: черный с белым текстом.

Opera, Chrome, IE9: синий с черным текстом.

Что правильно и как я могу сделать это согласованным?

Код

@media screen and (min-width: 480px) {

    body{
        background-color:#6aa6cc;
        color:#000;    
    }

    @media screen and (min-width: 768px) {

        body{
            background-color:#000;
            color:#fff;    
        }
    }
}

Интересно, что кажется, что работа вложенных медиа-запросов в условном @import работает.

например:

Index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>Media test</title>
    <link rel="stylesheet" type="text/css" href="importer.css" />
</head>
<body>
    <h1>Why is this not consistent.</h1>
</body>
</html>

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;
    }
}
4b9b3361

Ответ 1

Короткий ответ заключается в том, что, если в CSS3 разрешено вложение @media правил (а не только медиа-запросов), это не было "t разрешено в CSS2.1, главным образом потому, что не было причин позволять ему видеть, поскольку медиа-запросы еще не существовали.

Firefox первым поддержал вложенные правила @media, однако со времени, когда этот ответ был впервые опубликован, другие браузеры медленно догнали. А именно, Chrome (и аналогично Blink Opera) был обновлен для его поддержки.

Насколько мне известно, Safari и IE до сих пор не поддерживают его.


Там немного путаницы терминологии, которая нуждается в очистке, чтобы мы могли понять, что именно происходит.

В коде, который вы ссылаетесь на правила @media и не столько на медиа-запросы - сам мультимедийный запрос является компонентом, который следует за токеном @media, тогда как правило представляет собой весь блок кода, состоящий из @media, медиа-запрос и правила, вложенные в его набор фигурных скобок.

Это может вызвать путаницу среди многих, когда дело доходит до использования медиа-запросов в CSS, а также для вашего конкретного случая, когда правило @media в импортированной таблице стилей работает корректно, даже если @import сопровождается другим медиа-запросом. Обратите внимание, что медиа-запросы могут встречаться как в правилах @media, так и @import. Это одно и то же, но они используются для ограничения правил стиля по-разному.

Теперь актуальная проблема заключается в том, что вложенные правила @media недействительны в CSS2.1, потому что вам не разрешено встраивать любые правила at в правилах @media. Однако в CSS3 все выглядит совсем по-другому. А именно, модуль условных правил четко говорит о том, что правила @media могут быть вложенными, даже предоставляя пример:

Например, с помощью этого набора вложенных правил:

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

условие правила, помеченного (1), истинно для печатного носителя, а условие правила, отмеченного (2), истинно, когда ширина области отображения (которая для печатного носителя является полем страницы) меньше, чем или равна 12 см. Таким образом, правило "#navigation {display: none) применяется всякий раз, когда эта таблица стилей применяется к печатным носителям, а правило".note {float: none} применяется только тогда, когда таблица стилей применяется к печатным материалам и ширине страница меньше или равна 12 сантиметрам.

Кроме того, похоже, что Firefox выполняет эту спецификацию и обрабатывает правила соответственно, тогда как другие браузеры все еще рассматривают ее как способ CSS2.1.

Грамматика в Синтаксическом модуле не была обновлена, чтобы отразить это; он по-прежнему запрещает вложение правил at в правилах @media, как в CSS2.1. В любом случае эта спецификация предназначена для перезаписи, поэтому я думаю, это не имеет значения.

В принципе, CSS3 позволяет это (в ожидании перезаписи модуля синтаксиса), но не CSS2.1 (поскольку он не определяет медиа-запросы и не допускает вложенные блоки правил @media). И хотя по крайней мере один браузер начал поддерживать новую спецификацию, я бы не назвал другие браузеры ошибками; вместо этого я скажу, что они просто еще не догнали, поскольку они действительно соответствуют более старой, более стабильной спецификации.

Наконец, причина, по которой работает ваш @import, заключается в том, что @import может работать условно с помощью медиа-запроса. Однако это не имеет отношения к правилу @media в импортированной таблице стилей. Это на самом деле две отдельные вещи и рассматриваются как таковые всеми браузерами.

Чтобы ваш код работал последовательно в браузерах, вы можете либо использовать инструкцию @import, либо, поскольку оба правила используют min-width, просто удалите вложенные правила @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;
    }
}