Привет! У меня есть реализованный переключатель тем, который позволяет менять фон с черного на белый и обратно. В целом, все работает корректно, вот стили: <br/><br/> У элемента body есть определенный класс: если он присутствует, применяются одни стили, если его нет — другие. <br/><br/> Однако возникла небольшая проблема: во время начальной отрисовки сайта, пока не появится элемент body, JavaScript не может добавить к нему нужный класс темы. Это приводит к тому, что если я, например, нахожусь на белой теме, на несколько секунд отображается черная тема, так как она установлена по умолчанию в случае отсутствия класса у body. Затем, когда JavaScript срабатывает и класс добавляется, тема меняется на белую. Таким образом, при каждой перезагрузке происходит переключение темы с черной на белую, что создает неприятный визуальный эффект. <br/><br/> Я пытался загрузить JavaScript в самом начале, но это не решает проблему, так как body еще не существует, и класс некуда привязать. <br/><br/> Вот ссылка на сайт: <a href="http://smirno.temp.swtest.ru/" rel="nofollow">smirno.temp.swtest.ru</a> <br/><br/> Вот код JavaScript: <br/><pre><code>function setTheme(themeName) {
localStorage.setItem('theme', themeName);
document.body.className = themeName;
// Переключение лого и текста
var logoDark = document.querySelectorAll('#logo-dark');
var logoWhite = document.querySelectorAll('#logo-white');
var switchTextDark = document.querySelectorAll('#switch__text-dark');
var switchTextLight = document.querySelectorAll('#switch__text-light');
if (themeName === 'root') {
logoWhite.forEach(function(logo) {
logo.style.display = 'none';
});
logoDark.forEach(function(logo) {
logo.style.display = 'block';
});
switch...
Чтобы решить проблему с переходом между темами и устранить временное отображение некорректной темы на момент загрузки страницы, вы можете применить несколько методов. Вот несколько шагов, которые помогут вам это сделать:
1. **Сохранение настроек темы в `localStorage`**: Это уже сделано в вашем коде. Проверьте, сохраняется ли тема при переключениях и загружайте ее при старте.
2. **Установка темы при загрузке страницы**: Вы можете использовать JavaScript для установки темы на этапе загрузки страницы. Это можно сделать, добавив соответствующий код в `<head>`, чтобы предотвратить визуальный "мигание" темы.
Вот пример того, как может выглядеть ваш код:
```html
<script>
// Установите тему во время загрузки страницы
document.addEventListener("DOMContentLoaded", function() {
const theme = localStorage.getItem('theme') || 'root'; // Замените 'root' на 'dark' или 'light' по умолчанию
document.body.className = theme;
});
</script>
```
3. **Скрытие содержимого до применения темы**: Можно скрыть содержимое страницы до применения темы с помощью CSS. Например:
```css
body {
visibility: hidden;
}
body.theme-loaded {
visibility: visible;
}
```
Затем добавьте класс `theme-loaded` к `body` после того, как тема будет установлена в скрипте:
```javascript
document.body.className = theme;
document.body.classList.add('theme-loaded');
```
4. **Переключение темы**: Убедитесь, что ваш скрипт для переключения тем работает корректно и обновляет класс `body` и логотипы.
Пример полного кода для темы:
```html
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Смена темы</title>
<style>
body {
visibility: hidden; /* Скрыть содержимое до загрузки темы */
}
body.theme-loaded {
visibility: visible; /* Показать содержимое после загрузки темы */
}
/* Пример стилей для тем */
body.root {
background-color: white;
color: black;
}
body.dark {
background-color: black;
color: white;
}
</style>
<script>
document.addEventListener("DOMContentLoaded", function() {
const theme = localStorage.getItem('theme') || 'root';
document.body.className = theme;
document.body.classList.add('theme-loaded'); // Показать содержимое
});
function setTheme(themeName) {
localStorage.setItem('theme', themeName);
document.body.className = themeName;
document.body.classList.add('theme-loaded'); // Показать содержимое при переключении
}
</script>
</head>
<body>
<!-- Ваш контент здесь -->
</body>
</html>
```
Эти изменения помогут устранить визуальное мигание при переключении тем, и пользователи увидят корректно установленную тему сразу после загрузки страницы.
Все что нужно для переключения темы: <br/> <br/> Инициализация при загрузке, максимально короткий скрипт. При желании можно добавить проверку на пользовательские предпочтения prefer-color-theme <br/> <pre><code class="html"><head>
<script>
const theme = localStorage.getItem('color-theme') === 'dark' ? 'dark' : 'light';
document.documentElement.setAttribute('data-color-theme', theme);
</script></code></pre> <br/> <br/> Код переключателя <br/> <br/> <pre><code class="javascript">document.querySelectorAll('.theme-toggle').forEach(el => {
el.addEventListener('click', () => {
const theme = document.documentElement.getAttribute('data-color-theme') === 'dark' ? 'light' : 'dark';
document.documentElement.setAttribute('data-color-theme', theme);
localStorage.setItem('color-theme', theme);
});
});</code></pre> <br/> <br/> И стили <br/> <br/> <pre><code class="css">:root {
--body-bg: white;
}
[data-color-theme="dark"] {
-body-bg: black;
}</code></pre> <br/> <br/> Разумеется, вместо атрибута можно вешать класс <br/> <pre><code>document.documentElement.classList.add('dark-theme');
:root {
--body-bg: white;
}
html.dark-theme {
-body-bg: black;
}</code></pre>