Веб-приложения часто предоставляют пользователю возможность переключаться между темной и светлой темой, что делает интерфейс более удобным в зависимости от освещения или предпочтений пользователя. Это можно реализовать и в модальных окнах, созданных с помощью библиотеки BasicLightbox.
Для начала, стоит понять, что темная и светлая темы чаще всего представляют собой два разных набора стилей CSS, которые изменяют визуальные характеристики интерфейса. В контексте библиотеки BasicLightbox, где основной функционал заключается в создании модальных окон, возможность адаптировать внешний вид под обе темы значительно улучшает пользовательский опыт.
В BasicLightbox нет прямой поддержки тем, но библиотека предоставляет достаточно гибкости, чтобы вручную добавлять собственные стили и адаптировать модальные окна под нужды темной и светлой темы.
Для начала нужно создать два набора CSS-правил. Они будут применяться к модальному окну в зависимости от выбранной темы.
/* Стили для светлой темы */
.lightbox-light {
background-color: #fff;
color: #000;
}
.lightbox-dark {
background-color: #333;
color: #fff;
}
С помощью этих стилей можно управлять фоном и текстом модального окна. Цвета можно изменить в зависимости от предпочтений, но основной принцип остается таким: светлая тема использует светлые фоны и темные шрифты, а темная — темные фоны и светлые шрифты.
Динамическое переключение темы
Для переключения темы в реальном времени можно использовать JavaScript. Для этого необходимо добавить слушателя событий для кнопки переключения темы, который будет менять классы для модальных окон.
let themeToggleButton = document.querySelector('#theme-toggle'); // Кнопка для переключения темы
let lightbox = document.querySelector('.basicLightbox'); // Модальное окно
themeToggleButton.addEventListener('click', function() {
if (document.body.classList.contains('light-theme')) {
document.body.classList.remove('light-theme');
document.body.classList.add('dark-theme');
lightbox.classList.remove('lightbox-light');
lightbox.classList.add('lightbox-dark');
} else {
document.body.classList.remove('dark-theme');
document.body.classList.add('light-theme');
lightbox.classList.remove('lightbox-dark');
lightbox.classList.add('lightbox-light');
}
});
Здесь осуществляется переключение классов light-theme и
dark-theme для тела документа, а также для самого
модального окна, которое получает соответствующий стиль. Для начала
модального окна можно установить дефолтную тему, исходя из системных
настроек пользователя или текущего состояния.
Сохранение состояния темы
Часто бывает полезно сохранить состояние темы, чтобы при следующем открытии страницы пользователь видел свою предпочтительную настройку. Это можно реализовать с помощью localStorage.
// При загрузке страницы проверяем сохраненную тему
window.addEventListener('load', function() {
if (localStorage.getItem('theme') === 'dark') {
document.body.classList.remove('light-theme');
document.body.classList.add('dark-theme');
lightbox.classList.remove('lightbox-light');
lightbox.classList.add('lightbox-dark');
} else {
document.body.classList.remove('dark-theme');
document.body.classList.add('light-theme');
lightbox.classList.remove('lightbox-dark');
lightbox.classList.add('lightbox-light');
}
});
// Сохраняем тему в localStorage при переключении
themeToggleButton.addEventListener('click', function() {
if (document.body.classList.contains('dark-theme')) {
localStorage.setItem('theme', 'dark');
} else {
localStorage.setItem('theme', 'light');
}
});
При этом при каждом переключении темы сохраняется текущая настройка, а при следующем посещении страницы тема будет загружаться автоматически.
Для динамических изображений, которые могут изменяться в зависимости от темы, можно использовать медиа-запросы в CSS, чтобы адаптировать изображения под светлую и темную темы.
/* Светлая тема */
.lightbox-light img {
content: url('image-light-theme.jpg');
}
/* Темная тема */
.lightbox-dark img {
content: url('image-dark-theme.jpg');
}
Также можно использовать анимации, чтобы сделать переключение между темами более плавным. Например, добавив плавное изменение фона и текста при смене темы:
/* Плавное изменение цветов */
.basicLightbox {
transition: background-color 0.3s ease, color 0.3s ease;
}
@media (prefers-color-scheme: dark) {
.basicLightbox {
background-color: #333;
color: #fff;
}
}
@media (prefers-color-scheme: light) {
.basicLightbox {
background-color: #fff;
color: #000;
}
}
Этот подход позволит автоматически изменять стили в зависимости от того, использует ли пользователь темную или светлую тему на уровне операционной системы.
:root {
--background-light: #fff;
--text-light: #000;
--background-dark: #333;
--text-dark: #fff;
}
.basicLightbox {
background-color: var(--background-light);
color: var(--text-light);
}
body.dark-theme .basicLightbox {
background-color: var(--background-dark);
color: var(--text-dark);
}
С помощью такого подхода можно централизованно изменять цвета и другие параметры интерфейса, просто изменяя значения переменных в одном месте.
С помощью гибких настроек и кастомных стилей, библиотека BasicLightbox легко адаптируется к светлым и темным темам, что делает ее универсальным инструментом для создания модальных окон в современных веб-приложениях. Простое переключение тем с сохранением состояния, использование медиа-запросов для учета системных предпочтений и переменных CSS для централизованного управления стилями значительно улучшает пользовательский опыт.