Какие правила для css media query перекрываются?
Как мы точно распределяем медиа-запросы, чтобы избежать перекрытия?
например, если мы рассмотрим код:
@media (max-width: 20em) {
/* for narrow viewport */
}
@media (min-width: 20em) and (max-width: 45em) {
/* slightly wider viewport */
}
@media (min-width: 45em) {
/* everything else */
}
что произойдет, во всех поддерживаемых браузерах, ровно в 20em и 45em?
Я видел, как люди используют: такие вещи, как 799px, а затем 800px, но как насчет ширины экрана 799.5 px? (Очевидно, не на обычном дисплее, а на сетчатке?)
Мне очень любопытен ответ здесь учитывая спецификацию.
3 ответа:
каковы правила для css media query overlap?
Каскад.
@mediaправила прозрачны для каскада, поэтому когда два или более@mediaправила совпадают в то же время браузер должен применять стили во всех правилах, которые совпадают, и соответственно разрешать каскад.1что произойдет, во всех поддерживаемых браузерах, ровно в 20em и 45em?
At ровно 20em широкий, ваш первый и второй медиа-запрос будет совпадать. Браузеры будут применять стили в обоих
@mediaправила и каскад соответственно, поэтому если есть какие-либо конфликтующие правила, которые необходимо переопределить, последний объявленный выигрывает (с учетом конкретных селекторов,!importantи т. д.). Аналогично для второго и третьего медиа-запроса, когда видовой экран имеет ширину ровно 45em.учитывая ваш пример кода, с некоторыми фактическими правилами стиля добавил:
@media (max-width: 20em) { .sidebar { display: none; } } @media (min-width: 20em) and (max-width: 45em) { .sidebar { display: block; float: left; } }когда видовой экран браузера имеет ширину ровно 20em, оба этих медиа-запроса вернут true. Клянусь каскадом,
display: blockпереопределяетdisplay: noneиfloat: leftбудет применяться к любому элементу с классом.sidebar.вы можете думать об этом как о применении правил, как если бы медиа-запросы не были там для начала:
.sidebar { display: none; } .sidebar { display: block; float: left; }еще один пример, как каскад происходит, когда браузер соответствует двум или более медиа-запросов можно найти в этот и другие ответ.
имейте в виду, однако, что если у вас есть объявления, что не перекрытие в обоих
@mediaправила, то все эти правила будут применяться. Что происходит здесь-это Союз деклараций в@mediaправила, а не только последнее полностью отменяет первое... что приводит нас к вашему предыдущему вопросу:как мы размещаем медиа-запросы точно, чтобы избежать перекрытия?
если вы хотите избежать перекрытия, вам просто нужно написать медиа-запросы, которые являются взаимоисключающими.
помните, что
min-иmax-префиксы означают " минимум включительно "и" максимум включительно"; это означает(min-width: 20em)и(max-width: 20em)оба будут соответствовать видовому окну, которое имеет ширину ровно 20em.похоже, у вас уже есть пример, который подводит нас к вашему последнему вопросу:
я видел, как люди используют: такие вещи, как 799px, а затем 800px, но как насчет ширины экрана 799,5 пикселей? (Очевидно, не на обычном дисплее, а на сетчатке?)
это я не совсем уверен; все значения пикселей в CSS являются логическими пикселями, и мне было трудно найти браузер, который сообщал бы дробное значение пикселя для ширины видового экрана. Я пробовал экспериментировать с некоторыми iframes, но не смог ничего придумать.
из моих экспериментов казалось бы Safari на iOS округляет все дробные значения пикселей чтобы убедиться, что либо один из
max-width: 799pxиmin-width: 800pxбудет соответствовать, даже если видовой экран действительно 799.5 px (который, по-видимому, соответствует первому).
1хотя ничего из этого явно не указано ни в одном из модуль условных правил или модуль "Каскад" (последний из которых в настоящее время запланирован для перезаписи), каскад подразумевается, что он происходит нормально, поскольку спецификация просто говорит о применении стилей в любом и все
@mediaправила, соответствующие браузеру или носителю.
calc()можно использовать, чтобы обойти эту(min-width: 50em and max-width: calc(50em - 1px)будет правильно уложен), но плохая поддержка браузера, и я бы не рекомендовал его.@media (min-width: 20em) and (max-width: calc(45em - 1px)) { /* slightly wider viewport */ }информация:
- https://developer.mozilla.org/en-US/docs/CSS/calc
- http://caniuse.com/calc
- http://www.w3.org/TR/css3-values/#calc
некоторые другие упомянутые, не используя
emгруппа поможет в ваши запросы стекаются.
Я пробовал как рекомендовано здесь:
@media screen and (max-width: calc(48em - 1px)) { /*mobile styles*/ } @media screen and (min-width: 48em) { /*desktop styles*/ }но обнаружил, что это не было хорошей идеей, потому что он не работает на Chrome прямо сейчас либо на моем рабочем столе Ubuntu, либо на моем телефоне Android. (как объяснено здесь:calc () не работает в медиа-запросах) но, я нашел лучший способ...
@media screen and (max-width: 47.9999em) { /*mobile styles*/ } @media screen and (min-width: 48em) { /*desktop styles*/ }и бац!