JavaScript matchMedia() — медіазапит із JavaScript
Метод matchMedia() перевіряє медіазапит із JavaScript — той самий рядок, що й у CSS.
Загальний опис
Порівнювати innerWidth із числом — спокусливо й неправильно: CSS вважає ширину інакше (він враховує смугу прокрутки), тож JavaScript і стилі почнуть розходитись у відповіді на питання «це мобільний?». matchMedia() питає той самий движок, що застосовує CSS — розходження неможливе.
Повертає об'єкт зі властивістю matches (true/false) і подією change, яка спрацьовує лише в мить переходу через межу, а не на кожен піксель зміни розміру, як resize.
Ним же читають налаштування системи: темна тема (prefers-color-scheme) і вимкнені анімації (prefers-reduced-motion).
- Порада
-
Перед будь-якою анімацією з коду перевіряй
автор: NagarDprefers-reduced-motion— для людей із вестибулярними розладами зайвий рух буквально викликає нудоту.
Переглядачі
| Переглядач | ||||||
|---|---|---|---|---|---|---|
| matchMedia | 9+ | 6+ | 5.1+ | 12.1+ | 12+ | 10+ |
| Переглядач | ||||
|---|---|---|---|---|
| matchMedia | 3+ | yes | yes | 5+ |
Приклади
+ запропонувати свій приклад у пісочниці
Темна тема, межа макета й повага до вимкнених анімацій.
HTML
<div id="fade">Блок з анімацією появи</div>
JS
const element = document.getElementById('fade');
const dark = window.matchMedia('(prefers-color-scheme: dark)');
console.log(dark.matches); // true, якщо система в темній темі
// спрацює лише в мить перемикання, а не на кожен піксель
dark.addEventListener('change', event => {
console.log(event.matches ? 'темна' : 'світла');
});
// узгоджено з CSS, на відміну від innerWidth < 768
const desktop = window.matchMedia('(min-width: 768px)');
console.log('Широкий екран:', desktop.matches);
// не анімуємо, якщо людина попросила не рухати
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
element.animate([{ opacity: 0 }, { opacity: 1 }], 300);
}
Коментарі
Коментарів ще немає — будьте першим!