Использование медиа-запросов
Медиа-запросы позволяют применять стили CSS в зависимости от типа устройства (например, печать или экран) или других функций или характеристик, таких как разрешение экрана или ориентация, соотношение сторон, ширина или высота области просмотра браузера viewport, пользовательские предпочтения, такие как отказ от анимации, ограничение использования данных или прозрачности.
Медиа-запросы используются для:
- Условного применения стилей с помощью CSS
@mediaи@importправил @. - Нацеливания на определённые типы устройств для
<style>,<link>,<source>и других HTML элементов с помощью атрибутовmedia=илиsizes=". - Для проверки и мониторинга состояний медиа с помощью методов
Window.matchMedia()иEventTarget.addEventListener().
Примечание: В примерах на этой странице используется @media CSS для иллюстрации, но базовый синтаксис остаётся одинаковым для всех типов медиа-запросов.
Синтаксис
Медиа-запрос состоит из необязательного типа медиа и любого количества выражений свойств медиа, которые могут быть объединены различными способами с использованием логических операторов. Медиа-запросы нечувствительны к регистру.
-
Типы медиа определяют широкую категорию устройств, к которым применяется медиа-запрос:
all,print,screen.Тип необязателен (по умолчанию
all) за исключением использования логического оператораonly. -
Свойства медиа описывают определённую характеристику агента пользователя, устройства вывода или среды:
any-hoverany-pointeraspect-ratiocolorcolor-gamutcolor-index-
device-aspect-ratioУстаревший -
device-heightУстаревший -
device-widthУстаревший display-modedynamic-rangeforced-colorsgridheighthoverinverted-colorsmonochromeorientationoverflow-blockoverflow-inlinepointerprefers-color-schemeprefers-contrastprefers-reduced-motionprefers-reduced-transparencyresolutionscriptingupdatevideo-dynamic-range-
width.
Например, свойство
hoverпозволяет запросу проверить, поддерживает ли устройство наведение курсора на элементы. Выражения свойств медиа проверяют их наличие или значение и являются необязательными. Каждое выражение свойства медиа должно быть заключено в скобки. -
Логические операторы могут использоваться для составления сложного медиа-запроса:
not,and, иonly. Вы также можете объединить несколько медиа-запросов в одно правило, разделив их запятыми.
Медиа-запрос вычисляется как true тогда, когда тип медиа (если указан) соответствует устройству, на котором отображается документ, и все выражения свойств медиа вычисляются как true. Запросы с неизвестными типами медиа всегда ложны.
Примечание: Таблица стилей с медиа-запросом, прикреплённым к тегу <link>, все равно будет загружена, даже если запрос вернёт false. Загрузка произойдёт, но приоритет загрузки будет значительно ниже. Тем не менее, её содержимое не будет применено, пока результат запроса не изменится на true. Почему это происходит, можно прочитать в блоге Tomayac по ссылке Почему браузеры загружают таблицы стилей с несовпадающими медиа-запросами.
Нацеливание на типы медиа
Типы медиа описывают общую категорию данного устройства. Хотя веб-сайты обычно разрабатываются с учётом экранов, вы можете создавать стили, нацеленные на специальные устройства, такие как принтеры или аудио-скринридеры. Например, этот CSS нацелен на принтеры:
@media print {
/* … */
}
Вы также можете нацеливать на несколько устройств. Например, это @media правило использует два медиа-запроса для нацеливания на устройства как экрана, так и печати:
@media screen, print {
/* … */
}
Список доступных типов медиа см. в разделе типов медиа. Поскольку типы медиа описывают устройства очень общими терминами, большинство из первоначально определённых типов медиа были устаревшими, и остались только screen, print, и all. Для нацеливания на более специфические характеристики используйте свойства медиа.
Нацеливание на свойства медиа
Свойства медиа описывают специфические характеристики данного агента пользователя, устройства вывода или среды. Например, вы можете применять определённые стили к широкоформатным мониторам, компьютерам, использующим мышь, или устройствам, используемым в условиях низкой освещённости. В этом примере применяются стили, когда основной механизм ввода пользователя (например, мышь) может наводить курсор на элементы:
@media (hover: hover) {
/* … */
}
Свойства медиа бывают либо диапазонными, либо дискретными.
Дискретные свойства принимают значения из перечисленного набора возможных ключевых слов. Например, дискретное свойство orientation принимает значения landscape или portrait.
@media print and (orientation: portrait) {
/* … */
}
Многие диапазонные свойства могут быть префиксны "min-" или "max-" для выражения ограничений "минимального состояния" или "максимального состояния". Например, этот CSS будет применять стили только если ширина области просмотра браузера viewport равна или меньше 1250px:
@media (max-width: 1250px) {
/* … */
}
Это также можно записать как:
@media (width <= 1250px) {
/* … */
}
С диапазонными свойствами медиа вы можете использовать префиксы min- и max- или более краткие операторы диапазона <= и =>.
Следующие медиа-запросы эквивалентны:
@media (min-width: 30em) and (max-width: 50em) {
/* … */
}
@media (30em <= width <= 50em) {
/* … */
}
Вышеприведённые сравнения диапазонов включают граничное значение. Чтобы не включать граничное значение, используйте префиксы < и >.
@media (30em < width < 50em) {
/* … */
}
Если вы создаёте запрос свойства медиа без указания значения, вложенные стили будут использоваться, пока значение свойства не будет равно 0 или none. Например, этот CSS будет применяться к любому устройству с цветным экраном:
@media (color) {
/* … */
}
Если свойство не применяется к устройству, на котором работает браузер, выражения, включающие это свойство медиа, всегда ложны.
Дополнительные примеры свойств медиа см. на странице справки для каждого конкретного свойства.
Создание сложных запросов к медиа
Иногда вам может потребоваться создать запрос к медиа, зависящий от нескольких условий. Для этого используются логические операторы: not, and, и only. Кроме того, вы можете объединить несколько запросов к медиа в список, разделенный запятыми; это позволяет применять одни и те же стили в разных ситуациях.
В предыдущем примере мы видели оператор and для группировки типа медиа с параметром медиа. Оператор and также может объединять несколько параметров медиа в один запрос к медиа. Оператор not, в свою очередь, отменяет запрос к медиа, по сути, меняя его обычное значение. Оператор only предотвращает применение стилей в старых браузерах.
Примечание: В большинстве случаев тип медиа all используется по умолчанию, если другой тип не указан. Однако, если вы используете оператор only, вы должны явно указать тип медиа. Вы можете увидеть only screen или only print в целом.
Объединение нескольких типов или параметров
Ключевое слово and объединяет параметр медиа с типом медиа или другими параметрами медиа. В этом примере объединяются два параметра медиа, чтобы ограничить стили устройствами с ориентацией по горизонтали с шириной не менее 30 ems:
@media (min-width: 30em) and (orientation: landscape) {
/* … */
}
Чтобы ограничить стили устройствами со экраном, вы можете прицепить параметры медиа к типу медиа screen:
@media screen and (min-width: 30em) and (orientation: landscape) {
/* … */
}
Проверка на несколько запросов
Вы можете использовать список запросов к медиа, разделенных запятыми, чтобы применять стили, когда устройство пользователя соответствует любому из различных типов медиа, параметров или состояний.
Следующее правило содержит два запроса к медиа. Стиль блока будет применяться, если устройство пользователя имеет высоту 680px или более или если область просмотра браузера находится в портретном режиме (высота области просмотра больше ширины области просмотра):
@media (min-height: 680px), screen and (orientation: portrait) {
/* … */
}
В этом примере, если пользователь печатает в PDF-файл, а высота страницы составляет 800 пикселей, запрос к медиа возвращает true, потому что первый компонент запроса — который проверяет, имеет ли область просмотра высоту 680px или более — является истинным. Аналогично, если пользователь находится на смартфоне в портретном режиме с высотой области просмотра 480 пикселей, запрос к медиа возвращает true, потому что второй компонент запроса является истинным.
В списке запросов к медиа, разделенных запятыми, отдельные запросы к медиа заканчиваются запятой или, в случае последнего запроса в списке, открывающей скобкой ({).
Инвертирование значения запроса
Ключевое слово not инвертирует значение одного запроса к медиа. Например, стили CSS в этом запросе к медиа будут применяться ко всему, кроме печатных медиа:
@media not print {
/* … */
}
not инвертирует только запрос к медиа, к которому он применён. not, без скобок, отменяет все параметры внутри запроса к медиа, в котором он содержится. Это означает, что в списке запросов к медиа, разделенных запятыми, каждый not применяется к единственному запросу, в котором он находится, применяясь ко всем параметрам в этом единственном запросе. В этом примере not применяется к первому запросу к медиа, который заканчивается на первой запятой:
@media not screen and (color), print and (color) {
/* … */
}
Вышеприведённый запрос оценивается так:
@media (not (screen and (color))), print and (color) {
/* … */
}
Оба примера верны. Условия медиа могут быть сгруппированы, заключая их в скобки (()). Эти группы могут быть вложены в условие так же, как и одиночный запрос к медиа.
not оценивается последним в запросе к медиа, что означает, что он применяется ко всему запросу к медиа, а не к одному параметру внутри запроса, как если бы открывающая скобка была добавлена непосредственно после not и закрыта в конце запроса к медиа.
Следующий запрос:
@media not all and (monochrome) {
/* … */
}
оценивается так:
@media not (all and (monochrome)) {
/* … */
}
Он не оценивается так:
@media (not all) and (monochrome) {
/* … */
}
Чтобы отменить один параметр внутри запроса к медиа, используйте скобки. Охватывание not и параметра медиа в скобках ограничивает компоненты запроса, которые отменяются.
В этом примере мы отменяем параметр медиа hover, но не тип медиа all:
@media all and (not(hover)) {
/* … */
}
not(hover) соответствует, если у устройства нет возможности наведения. В данном случае, из-за скобок, not применяется к hover, но не к all.
Улучшение совместимости со старыми браузерами
Ключевое слово only предотвращает применение стилей в старых браузерах, которые не поддерживают запросы к медиа с параметрами медиа. В современных браузерах он не оказывает никакого влияния.
@media only screen and (color) {
/* … */
}
Проверка на несколько параметров с or
Вы можете использовать or для проверки соответствия среди нескольких параметров, разрешая true , если любой из параметров является истинным. Например, следующий запрос проверяет устройства, имеющие монохромный дисплей или возможность наведения:
@media (not (color)) or (hover) {
/* … */
}
См. также
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_media_queries/Using_media_queries