SebWeo.com
Якщо ви хочете додати на свій сайт можливість перемикання між світлим/темним режимом кольорового оформлення, тоді ви потрапили за адресою. Хоча така «фіча» може і не користуватися попитом, але з її наявністю у вас буде більш розширений функціонал. Тож, в цьому практичному уроці ми обговоримо, як реалізувати просту зміну колірної схеми (перемикання на світлий режим або темний режим) на вашому вебсайті з допомогою CSS змінних та лише кількох рядків JavaScript.
Додавання функціоналу перемикання режиму, по суті, зводиться до простої зміни стильового оформлення (CSS стилів) і навіть без необхідності зміни макету сайту. І за подібним принципом ви можете легко змінювати оформлення сайту і, наприклад, приурочити це до певної події, пори дня, певного свята, тощо.
Загалом принцип перемикання активується простою зміною класів та CSS стилів для кореневого елементу <html>
, або ж іншого (проте максимально вищого в DOM) елементі. Хоча бажано врахувати й інші важливі моменти:
Це основні вимоги, тепер давайте заглибимося в деталі та розглянемо практичні рішення!
Отже, зміна теми відбувається зі зміною класу кореневого елемента. Для прикладу я використовую дві кнопки з типом button
, при натисканні на які змінюється клас елемента <html>
на day/night
одним рядком коду JavaScript.
Ось так може виглядати приблизно подібний код:
<div class="switch-block"> <button aria-label="Оберіть світлу тему" type="button" class="theme-btn light" >
Деякі пояснення по коду:
Я використовую два атрибути доступності
ARIA
(Accessible Rich Internet Applications), які зроблять ці кнопки більш доступними для людей з обмеженими можливостями. Зміна кольорів може не мати значення для людей з порушеннями зору, але програма зчитування з екрану допоможе їм краще зорієнтуватися на сайті. Атрибутиaria-label
приховані від користувачів, але доступні допоміжним технологіям.За замовчуванням можна додати певний клас до кореневого
<html>
елементу.При натисканні на кнопки простий JavaScript змінює клас кореневого тега. А далі вже потрібно задіювати CSS стилі на основі цих класів.
Перемикання кольорових тем сайту — CSS стилі
В даному прикладі я використовую доволі просте рішення — зміну кольорової схеми сайту лише кількома найпростішими стилями. Також, врахував значення за замовчуванням, коли користувач не натискав кнопку вибору теми. При зміні кореневого класу тег
body
змінює значення стилів відповідно для змінних фонового кольору та кольору тексту.<style> :root, :root.day { --bg-color: #fff; --text-color: #0c0c0c; } :root.night { --bg-color: #121212; --text-color: #fff; } body { background-color: var(--bg-color); color: var(--text-color); } </style>
Як обрати тему автоматично в залежності від налаштувань користувача
В попередньому коді я прописав стилі для класів, що так чи інакше будуть обрані користувачем. Але щоб розширити даний функціонал, ми також можемо обирати світлий/темний режим на основі налаштувань системи користувача. Для цього можна використати медіа-запит
prefers-color-scheme
, — CSS функції, яка визначає використовувану тему в операційній системі. Приклад використання:<style> @media (prefers-color-scheme: dark) { :root { --bg-color: #121212; --text-color: #fff; } } </style>В цьому медіа-запиті я встановлюю для змінної
:root
бажані кольори для темного режиму. Функція медіа-запиту CSSprefers-color-scheme
може мати одне з трьох значень: світлий (light
), темний (dark
), без налаштувань (no-preference
).Іншим варіантом буде використання CSS функції
light-dark()
, яка приймає лише два аргументи і повертає один із них залежно від того, яку тему вибрав користувач:<style> body { color: light-dark(#121212, #ffffff); background-color: light-dark(#ffffff, #121212); } </style>Перше значення функція поверне, якщо у користувача встановлена світла тема (або тема не обрана), а друге, — якщо встановлена темна тема.
Щоб функція
light-dark()
запрацювала, потрібно прописати властивістьcolor-scheme
зі значеннямlight dark
. Зазвичай це роблять для псевдокласу:root
. Якщо цю властивість не прописати, то функція завжди повертатиме лише перше значення:<style> :root { color-scheme: light dark; } </style>
Як зберегти вибір користувачем теми в локальному сховищі
Коли відвідувач переходить зі сторінки на сторінку вашого сайту, обрана тема не повинна змінюватися. Одним із варіантів вирішення цього завдання буде збереження стану колірної теми сайту, щоб його можна було потім використати на інших сторінках сайту. Найкраще зберігати цей стан в локальному сховищі (
localStorage
) браузера. Щоразу, коли сторінка сайту буде завантажуватись, з локального сховища буде завантажуватись значення для обраної теми. Код для цього рішення може мати наступний вигляд:<script> const setColorScheme = (theme) => { document.documentElement.className = theme; // отримати значення поточної теми з розмітки localStorage.setItem('themeScheme', theme); // зберегти значення поточної теми до локального сховища } const getColorScheme = () => { const theme = localStorage.getItem('themeScheme'); // повернути значення поточної теми з локального сховища theme && setColorScheme(theme); // встановити поточну тему відповідно до локального сховища } getColorScheme(); // запуск функції щоразу при завантаженні сторінки </script>
Під час кожного відвідування сторінок сайту, перша функція буде зберігати вибрану користувачем тему кольорової схеми в локальному сховищі. Далі, щоразу буде викликатися друга функція, що буде синхронізувати дані з локального сховища та поточного налаштування.
Підтримка розглянутого функціоналу браузерами
Рішення, які я описав вище, покладаються на сучасні функції браузерів. За деякими статистичними даними, не підтримують новітні рішення в CSS/JS лише трохи більше за 10% браузерів. Відповідно, щоб все працювало гарно, — бажано використовувати найновіші браузери.
Замість висновку
Тож, в сьогоднішньому практичному уроці ми розглянули основні моменти по створенню простого перемикача кольорового оформлення сайту. З допомогою лише невеликого коду CSS та декількох рядків JavaScript. Щоб створити перемикач світла/темна тема, достатньо зробити 3 наступні кроки:
- Викликати JS функції через відповідні HTML елементи (наприклад, кнопки)
- Використовувати скрипт JavaScript, щоб змінювати клас кореневого елементу
<html>
. Додатково можна записувати поточний стан до локального сховища (localStorage
)- На основі класу встановити кольори теми для кореневого елементу
:root
(<html>
) за допомогою змінних CSSОсь і все на сьогодні, дякую за увагу!
Тебе визначають дві речі: твоє терпіння, коли у тебе нічого немає і твоя поведінка, коли…
Скільки б не було в людини друзів, вона все одно буде самотньою, якщо поруч із…
Найбільша з чеснот оратора — не лише сказати те, що потрібно, але і не сказати…
Ваша стратегія SEO просування повинна бути сильною та охоплювати практично всі грані цієї комплексної роботи,…
Я знаю світ: У ньому злодій дружить з шахраєм, І довбень завжди виграє у мудреця,…
Масиви не лише в JavaScript є фундаментальною структурою даних, але й практично у всіх мовах…