Кратко
СкопированоДиректива, которая позволяет задавать разные стили для разных параметров экрана — ширины, высоты, ориентации и даже типа устройства.
Пример
СкопированоСделаем элемент с классом block
флекс-контейнером, когда ширина экрана 900 пикселей или больше:
@media (min-width: 900px) { .block { display: flex; }}
@media (min-width: 900px) { .block { display: flex; } }
Как понять
СкопированоПри вёрстке адаптивных сайтов часто нужно, чтобы какой-то набор стилей применился только при соблюдении определённых условий. Например, текст должен стать зелёным только при горизонтальной ориентации смартфона. Или блок займёт всю ширину родителя, если ширина экрана больше или равна 1500 пикселям. Для подобных случаев и существуют медиавыражения. Они помогают адаптировать вёрстку под разные экраны и устройства и при этом не писать лишний код.
Как пишется
СкопированоВ общем виде синтаксис выглядит так:
@media [тип устройства] [характеристика устройства] { /* CSS-правила */}
@media [тип устройства] [характеристика устройства] { /* CSS-правила */ }
Например:
@media print and (orientation: landscape) { .block { font-size: 25pt; }}
@media print and (orientation: landscape) { .block { font-size: 25pt; } }
Здесь тип устройства — print
(принтер), а характеристика устройства — orientation
(альбомная ориентация). То есть при печати на листе в альбомной ориентации размер шрифта у блока будет 25 пунктов.
Есть четыре типа устройств, которые мы можем указать:
all
— медиавыражение применится ко всем устройствам. Если не задать никакой тип, по умолчанию применится этот.print
— стили внутри такого медиавыражения применятся при печати на принтерах или экспорте в PDF, в том числе в режиме предпросмотра документа.screen
— для устройств с экранами.speech
— для синтезаторов речи (пока не поддерживается ни одним браузером).
В большинстве случаев, когда вы пишете стили только для экрана, указывать типы screen
или all
не нужно. Реальное практическое использование есть только у типа print
.
Возможные характеристики устройства можно разделить на несколько категорий:
Характеристики страницы и окна браузера
width
— ширина окна браузера;min
— минимальная ширина окна браузера;- width max
— максимальная ширина окна браузера;- width height
— высота окна браузера;min
— минимальная высота окна браузера;- height max
— максимальная высота окна браузера;- height aspect
— соотношение между шириной и высотой окна;- ratio min
— минимальное соотношение между шириной и высотой окна;- aspect - ratio max
— максимальное соотношение между шириной и высотой окна;- aspect - ratio orientation
— ориентация устройства:landscape
(альбомная, горизонтальная) илиportrait
(портретная, вертикальная);overflow
— проверка, как устройство вывода обрабатывает содержимое, которое выходит за пределы области просмотра по оси блока;- block overflow
— проверка, можно ли прокручивать содержимое, выходящее за пределы области просмотра по встроенной оси.- inline
Качество отображения
environment
— метод для определения внешнего окружения устройства, такого как тусклое или слишком яркое освещение;- blending display
— проверка режима браузера, используется в PWA:- mode fullscreen
(полноэкранный режим без интерфейса браузера),standalone
(как нативное приложение),minimal
(минимальный интерфейс браузера) и- ui browser
(обычное окно браузера);grid
— проверка, является ли экран растровым (все современные экраны) или сеточным (как старые телефоны или текстовые терминалы);resolution
— разрешение устройства в dpi или dpcm;min
— минимальное разрешение устройства в dpi или dpcm;- resolution max
— максимальное разрешение устройства в dpi или dpcm;- resolution scan
— процесс сканирования устройства вывода;update
— скорость обновления экрана:none
(не обновляется),slow
(медленно),fast
(быстро).
Цвет
color
— количество бит на цвет на устройстве вывода;min
— минимальное количество бит на цвет на устройстве вывода;- color max
— максимальное количество бит на цвет на устройстве вывода;- color color
— количество цветов, которое может отображаться устройством;- index min
— минимальное количество цветов, которое может отображаться устройством;- color - index max
— максимальное количество цветов, которое может отображаться устройством;- color - index monochrome
— количество бит на цвет на монохромном устройстве вывода;min
— минимальное количество бит на цвет на монохромном устройстве вывода;- monochrome max
— максимальное количество бит на цвет на монохромном устройстве вывода;- monochrome color
— примерный диапазон цветов, поддерживаемый браузером и устройством вывода;- gamut dynamic
— комбинация уровня яркости, глубины цвета и контрастного соотношения для видео в браузере или устройстве вывода;- range inverted
— проверка, инвертируются ли цвета браузером или ОС.- colors
Взаимодействие
hover
— проверка, позволяет ли основное устройство наводить указатель на элементы;any
— проверка, позволяет ли любое из устройств ввода наводить указатель на элементы;- hover pointer
— проверка, является ли основное устройство ввода указателем, и насколько оно точное;any
— проверка, является ли любое из устройств ввода указателем, и насколько оно точное.- pointer
Характеристики с префиксом video-
video
— ширина видео на выбранном дисплее (ведётся обсуждение);- width video
— высота видео на выбранном дисплее (ведётся обсуждение);- height video
— примерный диапазон цветов, поддерживаемый для видео в браузере и устройстве вывода;- color - gamut video
— комбинация уровня яркости, глубины цвета и контрастного соотношения для видео в браузере или устройстве вывода;- dynamic - range video
— разрешение видео на выбранном дисплее (ведётся обсуждение).- resolution
Скрипты
scripting
— проверка, включены ли скрипты;
Пользовательские настройки
forced
— проверка, запрещает ли браузер цвета, доступные для использования;- colors prefers
— определяет, какую тему предпочитает пользователь — светлую или тёмную;- color - scheme prefers
— определяет, установлены ли настройки для увеличения или уменьшения контраста между цветами;- contrast prefers
— определяет, предпочитает ли пользователь загружать меньше данных на странице;- reduced - data prefers
— определяет, отключены ли анимации в системных настройках пользователя;- reduced - motion prefers
— определяет, отключена ли прозрачность в системных настройках пользователя.- reduced - transparency
Устаревшие
device
— соотношение между шириной и высотой устройства вывода;- aspect - ratio device
— высота дисплея устройства;- height device
— ширина дисплея устройства.- width
В медиавыражении может быть перечислено несколько условий через запятую. В таком случае стили применятся для любого из указанных условий. Например:
@media (orientation: landscape), (max-width: 960px) { .text { color: tomato; }}
@media (orientation: landscape), (max-width: 960px) { .text { color: tomato; } }
Такой код применится на всех устройствах с альбомной ориентацией экрана или на всех устройствах с шириной экрана менее 960 пикселей.
Часто в медиавыражениях может использоваться ключевое слово and
, реже встречаются ключевые слова not
и only
.
Если мы пишем и тип устройства, и указываем характеристики, то после типа обязательно пишется and
.
@media print and (min-width: 320px) { .link { text-decoration: underline; }}
@media print and (min-width: 320px) { .link { text-decoration: underline; } }
Также and
пишется между характеристиками.
@media (min-width: 320px) and (max-width: 640px) { .link { text-decoration: underline; }}
@media (min-width: 320px) and (max-width: 640px) { .link { text-decoration: underline; } }
Ключевое слово not
используется для отрицания выражения. Оно имеет низкий приоритет и применяется в последнюю очередь. Например:
@media not screen and (min-width: 380px) { .block { display: flex; }}
@media not screen and (min-width: 380px) { .block { display: flex; } }
Здесь сначала вычислится выражение «для всех экранов с минимальной шириной 380 пикселей», а потом оно инвертируется — «для всех устройств, кроме устройств с экранами с минимальной шириной 380 пикселей». То есть будет читаться браузером как:
@media not (screen and (min-width: 380px)) { .block { display: flex; }}
@media not (screen and (min-width: 380px)) { .block { display: flex; } }
При использовании not
в медиавыражениях с запятой инвертируется только та часть выражения, где указан not
. Например:
@media not screen and (height: 500px), print and (height: 700px) { .text { color: tomato; }}
@media not screen and (height: 500px), print and (height: 700px) { .text { color: tomato; } }
Чтобы лучше понять, как выполнится этот пример, можно добавить дополнительные группирующие скобки:
@media (not (screen and (height: 500px))), print and (height: 700px) { .text { color: tomato; }}
@media (not (screen and (height: 500px))), print and (height: 700px) { .text { color: tomato; } }
Поскольку запятая в медиавыражении означает лишь перечисление, то not
в первой части выражения не будет распространяться на вторую, и инвертируется только часть «для всех экранов с высотой окна браузера 500 пикселей».
Ключевое слово only
иногда встречается перед указанием типа устройства — оно используется для того, чтобы старые браузеры, которые не поддерживают медиавыражения, не применяли указанные стили. Современные браузеры никак не реагируют на only
.
@media only screen and (max-width: 600px) { body { background-color: cornflowerblue; }}
@media only screen and (max-width: 600px) { body { background-color: cornflowerblue; } }
Подсказки
Скопировано💡 Для вёрстки от мобильных (mobile first) лучше использовать медиавыражения с min
и располагать их в порядке увеличения ширины экрана; для вёрстки от десктопа (desktop first) — max
, и располагать выражения в обратном порядке.
На практике
Скопированосоветует Скопировано
🛠 медиавыражения можно вкладывать в медиавыражения и другие директивы:
@media (min-width: 520px) { @media (max-width: 1080px) { .cell { background: peachpuff; } }}
@media (min-width: 520px) { @media (max-width: 1080px) { .cell { background: peachpuff; } } }
@supports (position: sticky) { @media (min-width: 1080px) { .block { position: sticky; } }}
@supports (position: sticky) { @media (min-width: 1080px) { .block { position: sticky; } } }