Медіа-запити
Last updated
Last updated
Медіа-запити (media queries) - це техніка веб-розробки, яка дозволяє стилізувати сторінку або веб-додаток на основі характеристик пристрою чи властивостей відображення, таких як ширина екрана, висота екрана, орієнтація, роздільна здатність екрана тощо. Медіа-запити дають змогу робити веб-сайти та додатки адаптивними та пристосованими до різних пристроїв і розмірів екрана.
Іншими словами відбувається застосування тих чи інших стилів у залежності від умови. Найчастіше ця умова - ширина екрана.
Як застосовуються медіазапити:
Розробник описує набір медіа-запитів і CSS-правил
Браузер відстежує зміну розміру в'юпорту
Браузер застосовує CSS-правила з медіа-запитів, що відповідають поточному розміру в'юпорту.
Медіа-запити виглядають так:
Ширший загальний синтаксис виглядає так:
Медіа-запит оголошують директивою @media. Після цього вказують тип пристрою (media-type) (опціонально, бо за замовчанням це screen) і медіа-функції (media-feature). Медіа-функція перевіряє якусь характеристику пристрою - зазвичай ширину в'юпорту. Медіа-функція приводиться до булевого значення - true і false. Якщо умова виконується, то застосовуються вказані стилі, якщо ні, то стилі ігноруються.
Наприклад, необхідно поміняти колір елемента з синього на жовтий при ширині в'юпорту 800px і ширше.
Умова перевірки буває різною. Здебільшого достатньо вказати медіа-тип пристрою (найчастіше screen), і перевірити тільки ширину в'юпорту.
Медіа-типи - це характеристики пристроїв чи середовища, на яких відображається сторінка в Інтернеті. При використанні медіа-запитів можна специфікувати різні медіа-типи, щоб змінювати стилі для різних умов перегляду.
all: Застосовується до всіх типів пристроїв.
screen: Застосовується до екранів та інших пристроїв з відображенням (комп'ютери, смартфони, планшети тощо).
print: Застосовується до сторінок, які видаються для друку.
speech: Застосовується до голосових синтезаторів (екранні читачі, програми для читання тексту тощо).
only: Вказує на конкретний медіа-тип та виключає всі інші типи.
Медіа-функції - дозволяють вказувати умови в медіа-запитах з більшою гнучкістю та точністю. Вони дозволяють перевіряти різні характеристики пристрою чи середовища та залежно від цих характеристик застосовувати різні стилі.
width() і height(): Перевіряють ширину або висоту екрану в пікселях або інших одиницях. Це - дві медіа-функції, які найчастіше використовують і вони дозволяють визначати ширину в'юпорту браузера - min-width і max-width. на яких будуть застосовуватися стилі.
orientation(): Перевіряє орієнтацію екрану (portrait або landscape).
aspect-ratio(): Перевіряє відношення сторін по ширині та висоті екрану.
hover() і pointer(): Перевіряють наявність можливості наведення курсору (hover) та типу введення (pointer).
resolution(): Перевіряє роздільну здатність екрану у DPI (dots per inch) або DPPX (dots per pixel).
Оскільки у переважній більшості використовують саме ці медіа-функції, приділимо саме їм особливу увагу. Розглянемо приклад:
Якщо представити ширину в'юпорту як пряму від 0 до нескінченності, то ми описуємо проміжок, на якому необхідно застосувати якісь стилі.
В нашому прикладі до 768px включно застосується червоний колір фону, а від 1024px включно - синій колір фону. У всіх інших випадках застосується загальний стиль (якщо він прописаний).
Щоб конкретно описати проміжок від якоїсь до якоїсь ширини вʼюпорту, наприклад від 769px до 1023px необхідно використовувати логічні оператори для складових медіа-функцій (будуть розглянуті далі).
Розмір в'юпорту, за якого вся верстка або її окремі частини змінюють свої стилі, тобто змінюється дизайн, називають точкою перелому (breakpoint). В нашому прикладі це 768px і 1024px.
Коли описуємо стилі у нас виникає цілий перелік селекторів у файлі стилів. Якщо при цьому ми ще застосовуємо медіа-запити, то виникає два підходи оформлення цих медіазапитів.
Можна створити загальний медіазапит і всередині описати селектори.
Можна в кожному селекторі описувати медіазапити.
На практиці все ж частіше застосовується другий спосіб. Але обирає розробник. Головне, щоб у всьому проєкті був однаковий спосіб оформлення медіа-запитів.
У медіа-запитах можна використовувати логічні оператори для комбінування умов і забезпечення більш точного вибору елементів, які відповідають певним характеристикам. Основні оператори: not, and, or(,) і only.
and: Логічний оператор "і". Використовується для вказання, що обидві умови повинні бути вірними.
Тобто цей медіа-запит застосується на всіх ширинах вʼюпорту від 769px до 1023px.
or: Логічний оператор "або". Використовується для вказання, що хоча б одна з умов повинна бути вірною. В записах замість ключового слова or використовують знак коми. У майбутніх редакціях CSS, оператор коми буде замінений на оператор or.
Медіа-запит застосується, якщо виконається хоча б одна умова. В даному прикладі застосується на ширині вʼюпорту до 768px включно і від 1024px включно.
Тобто фактично це ніби два окремі медіа-запити в одному виконанні.
not: Логічний оператор "не". Використовується для вказання, що умова не повинна бути вірною. Тобто фактично це скасування медіазапиту. Використовується дуже рідко, в якихось специфічних випадках.
Наприклад, умова за якої стилі повинні застосуватися скрізь, крім друку.
При використанні оператора not обов'язково потрібно вказувати тип носія, тому що за замовчуванням для нього буде встановлено значення all і вираз not all буде читатися буквально як «не всі», і медіа-запит ніколи не виконається.
До одного селектора можна застосовувати кілька медіа-запитів. Просто при досягненні певної умови стиль буде перевизначатися.
В розробці так і роблять - спочатку задають базовий стиль і потім по черзі перераховують медіа-запити і як буде перевизначатися стиль.
Браузер спочатку застосовує базовий стиль і переходить до перевірки медіа-запитів, якщо він задовольняє умову, перевизначає стиль і перевіряє наступний медіа-запит і так далі.
Як відбувається перевизначення стилів за медіа-запитами чудово видно в інструментах розробника.
Перевизначаються тільки однакові властивості, а не повністю все правило. Завдяки цьому, можна робити "листковий пиріг" зі стилів, не дублюючи попередні, які підходять і для поточного медіа-запиту.
Точки передому, на яких змінюється дизайн не беруть навмання. Розміри присторїв досить стандартизовані і налаштування медіа-запитів зазвичай дизайнери прописують виходячи із цих розмірів. Ці розміри наведено нижче.
Ось відповідні записи цих медіа-запитів. І обовʼязково починається прописування стилів з базового стилю.