Что будем делать
Систему позволяющую создавать разные цветовые темы на сайте.
Зачем
Многие сайты сейчас имеют разные цветовые темы для удобства использования при разном освещение(обычно).
Что нам понадобится
Знание HTML
Знание CSS
Знание JS
Начнем
Создадим разметку нашего сайта. Пока все слишком сыро, но это пока.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Темы на сайте</title>
</head>
<body>
<div class="text">
Themes sait
</div>
</body>
</html>
Создадим и подключим CSS файл со следующим кодом.
html, body {
margin: 0;
padding: 0;
}
.text {
position: fixed;
font-size: 100px;
width: 100%;
height: 100%;
justify-content: center;
align-items: center;
display: flex;
}
Далее создадим black.css.
:root {
--textColor: white;
--background: black;
}
И создадим white.css.
:root {
--textColor: black;
--background: white;
}
А теперь подробнее
Что же такое ":root"? И что это за параметры?
":root" - Это псевдокласс применяемый к корневому элементу на сайте, обычно это <html></html>.
Параметры - Это переменные работающие только в указанном элементе, в нашем случаи это "root". Чтобы назначить переменную перед ее названием надо поставить два тире("--"). Чтобы считать переменную используйте var(--Название_переменной).
Продолжим
Давайте добавим значения из переменных в наш основной код.
html, body {
margin: 0;
padding: 0;
background: var(--background);
}
.text {
color: var(--textColor);
position: fixed;
font-size: 100px;
width: 100%;
height: 100%;
justify-content: center;
align-items: center;
display: flex;
}
Если сейчас мы запустим сайт, то ничего не поменяется. Что бы все работало нам надо подключить CSS файлы. Но подключать надо не случайный файл, а один, какой-то определенный, и как же понять, что надо пользователю? Для этого я предлагаю использовать GET параметры(Все параметры переданные в URL после знака вопроса("https://domain.com?var=1")). По умолчанию будет "темная тема", а по нужде пользователя - "белая". Что бы использовать "белую тему" понадобится передать параметр "white" с любым значением("https://domain.com?white=true").
Создадим JS скрипт и подключим его.
function $_GET(key) {
let p = window.location.search;
p = p.match(new RegExp(key + "=([^&=]+)"));
return p ? Boolean(p[1]) : false;
}
function color() {
let head = document.getElementsByTagName("head")[0];
let link = document.createElement("link");
link.id = "css";
link.rel = "stylesheet";
link.type = "text/css";
link.media = "all";
if($_GET("white")) {
link.href = "./white.css";
} else {
link.href = "./black.css";
}
head.appendChild(link);
}
Осталось в конце кода страницы вызвать метод "color".
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Темы на сайте</title>
<link rel="stylesheet" href="style.css">
<script src="index.js"></script>
</head>
<body>
<div class="text">
Themes sait
</div>
</body>
<script>color()</script>
</html>
Заключение
Вот так легко и быстро можно создать сайт с двумя темами, но ведь на двух темах можно не останавливать и сделать больше. Все спасибо за внимание.
Проект на gitHub.
EvilGenius18
Переключать тему с помощью URL это уже перебор… что если пользователи сайта не захотят указывать все ваши костюмные атрибуты при вводе URL сайта, тогда что у них половина пользовательских настроек будет сбрасываться на дефолтные при каждом открывании сайта?
Можно ведь намного проще:
1. Создаем 2 различные темы:
2. Даем пользователю возможность изменить значение атрибута theme с помощью переключателя.
Ilya-cmd Автор
1. Это был как пример
2. Я хочу поделиться с аудиторией, что мне нужно было самому
3. Что вам мешает на сайте сделать ссылку?
krundetz
EvilGenius18 другое имеет в виду. Хотя и не дает развернутого пояснения. Ссылку переключения темы сделать можно, хотя не обязательно. В вашем варианте проблема в том что должны быть сделаны:
1. все ссылки на самом сайте
2. все ссылки на внешних сайтах
так чтобы не ломать работу цветовой схемы.
Если первое возможно, хотя затраты на него могут быть и не маленькими, все зависит от архитектуры сайта. То как сделать второе?
Мне как пользователю будет неприятно перейти на сайт и увидеть что выбранная мной тема слетела. Ведь их может быть не 2, а больше (пример gmail.com).
А слетит она потому что в вашем коде нет сохранение пользовательских настроек.
kahi4
Добавлю prefers-color-scheme (который в js можно вытянуть через window.matchMedia