JavaScript matchMedia() — медіазапит із JavaScript


Метод matchMedia() перевіряє медіазапит із JavaScript — той самий рядок, що й у CSS.

автор: NagarD

Загальний опис

Порівнювати innerWidth із числом — спокусливо й неправильно: CSS вважає ширину інакше (він враховує смугу прокрутки), тож JavaScript і стилі почнуть розходитись у відповіді на питання «це мобільний?». matchMedia() питає той самий движок, що застосовує CSS — розходження неможливе.

Повертає об'єкт зі властивістю matches (true/false) і подією change, яка спрацьовує лише в мить переходу через межу, а не на кожен піксель зміни розміру, як resize.

Ним же читають налаштування системи: темна тема (prefers-color-scheme) і вимкнені анімації (prefers-reduced-motion).

автор: NagarD

Порада

Перед будь-якою анімацією з коду перевіряй prefers-reduced-motion — для людей із вестибулярними розладами зайвий рух буквально викликає нудоту.

автор: NagarD

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
matchMedia 9+ 6+ 5.1+ 12.1+ 12+ 10+
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
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);
}
автор: NagarD

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Пропозиція правки

Ваша версія — : після перевірки замінить чинну. Нова порада чи нотатка — з'явиться на сторінці після перевірки.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія секції «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія опису «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Зворотний зв'язок
Вхід