Как правильно реализовать смену на тёмную тему?
Есть код смены на тёмное оформление, которое задействуется после нажатия соответствующей кнопки. Так-то реализовал через php, могу сделать через javascript. Проблема в том, что нужно также менять метатег.
<meta name="theme-color" content="#ff0000">
как лучше всего это сделать?
через js делал, даже без jquery, но наблюдается проблема мерцания, скрипт срабатывает не сразу и не важно, где его размещать, в начале или в конце, только кеш cms спасает. других вариантов нет? Можно на пхп, сделать, тогда мерцаний не будет.
php
$dark_mode_auto = false; if( preg_match('#auto-dark-mode|#i', $member_id['xfields']) ) { $dark_mode_auto = true; } if( $dark_mode_auto ) { $a_hour = langdate( "G", $_TIME ); if( $a_hour >= 0 AND ($a_hour > 20 OR $a_hour < 6) ) { $theme_class = 'darkstyle'; } else $theme_class = ''; $tpl->set_block ( "'\[dark-mode-auto\](.*?)\[/dark-mode-auto\]'si", "" ); } else { if( isset($_COOKIE['theme-class']) AND $_COOKIE['theme-class'] == 'darkstyle' ) { $theme_class = totranslit($_COOKIE['theme-class']); $night_mode = " checked"; } else { $theme_class = ""; $night_mode = ""; } $tpl->set ( '{night-mode}', $night_mode ); $tpl->set( '[dark-mode-auto]', "" ); $tpl->set( '[/dark-mode-auto]', "" ); } $tpl->set ( '{theme-class}', $theme_class ); |
$dark_mode_auto = false; if( preg_match('#auto-dark-mode|#i', $member_id['xfields']) ) { $dark_mode_auto = true; } if( $dark_mode_auto ) { $a_hour = langdate( "G", $_TIME ); if( $a_hour >= 0 AND ($a_hour > 20 OR $a_hour < 6) ) { $theme_class = 'darkstyle'; } else $theme_class = ''; $tpl->set_block ( "'\[dark-mode-auto\](.*?)\[/dark-mode-auto\]'si", "" ); } else { if( isset($_COOKIE['theme-class']) AND $_COOKIE['theme-class'] == 'darkstyle' ) { $theme_class = totranslit($_COOKIE['theme-class']); $night_mode = " checked"; } else { $theme_class = ""; $night_mode = ""; } $tpl->set ( '{night-mode}', $night_mode ); $tpl->set( '[dark-mode-auto]', "" ); $tpl->set( '[/dark-mode-auto]', "" ); } $tpl->set ( '{theme-class}', $theme_class );
js
const mtThemeColor = document.querySelector('meta[name="theme-color"]'); if(document.cookie.includes("theme-class=darkstyle")){ mtThemeColor.setAttribute('content', '#1a1e29'); } function changeTheme() { setTimeout(function(){ if( $('body').hasClass('darkstyle') ) { $('body').removeClass('darkstyle'); setcookie('theme-class', 'light'); mtThemeColor.setAttribute('content', '#29a075'); } else { $('body').addClass('darkstyle'); setcookie('theme-class', 'darkstyle'); mtThemeColor.setAttribute('content', '#1a1e29'); } }, 16); } |
const mtThemeColor = document.querySelector('meta[name="theme-color"]'); if(document.cookie.includes("theme-class=darkstyle")){ mtThemeColor.setAttribute('content', '#1a1e29'); } function changeTheme() { setTimeout(function(){ if( $('body').hasClass('darkstyle') ) { $('body').removeClass('darkstyle'); setcookie('theme-class', 'light'); mtThemeColor.setAttribute('content', '#29a075'); } else { $('body').addClass('darkstyle'); setcookie('theme-class', 'darkstyle'); mtThemeColor.setAttribute('content', '#1a1e29'); } }, 16); }
Дополнительно:
собственно, где код ?
вообще, вы довольно странным способом взялись менять тему.
meta theme-color не для этого. попробуйте воспроизвести мерцание в песочнице
пхп же наоборот позволяет сделать всё гладко, но мне не хотелось бы ради одног метатега делать это на стороне бэка. да и смена темы через пхп весьма хороша, чего тут странного. довольно просто и эффективно)
а что такое setcookie? точно не нативная js-функция
проблема только в этом
const mtThemeColor = document.querySelector('meta[name="theme-color"]'); if(document.cookie.includes("theme-class=darkstyle")){ mtThemeColor.setAttribute('content', '#1a1e29'); } |
const mtThemeColor = document.querySelector('meta[name="theme-color"]'); if(document.cookie.includes("theme-class=darkstyle")){ mtThemeColor.setAttribute('content', '#1a1e29'); }
я Вас не пойму... у меня с пхп нет проблем, там всё работет. мне просто нужно в метатеги менять цвет панельки браузера при смене на тёмную тему. всё это работает, но когда я обновляю страницу, то код не сразу срабатывает от того можно на долю секунды видеть светлый цвет панельки браузера. зайдите сюда с смартфона, смените на тёмную тему и пообновляйте страницу и увидете проблему.
Если прям очень хочется на js, то самый быстрый вариант это инлайново прямо в шапке задать условие во время чтения документа, что-то вроде этого:
<script> if (cookie === "bla-bla-bla") { document.write('<meta name="theme-color" content="#fff" />'); } else { document.write('<meta name="theme-color" content="#000" />'); } </script> |
<script> if (cookie === "bla-bla-bla") { document.write('<meta name="theme-color" content="#fff" />'); } else { document.write('<meta name="theme-color" content="#000" />'); } </script>
<? $cookieColor = isset($_COOKIE['theme']) ? $_COOKIE['theme'] : '#000'; // но вам стоит проверять $_COOKIE['theme'] какой-либо регуляркой дабы быть беспечным :) ?> <meta name="theme-color" content="<?=$cookieColor?>" /> |
<? $cookieColor = isset($_COOKIE['theme']) ? $_COOKIE['theme'] : '#000'; // но вам стоит проверять $_COOKIE['theme'] какой-либо регуляркой дабы быть беспечным :) ?> <meta name="theme-color" content="<?=$cookieColor?>" />
сделайте чтение из куки до создания этого мета тега и если кука есть, проверьте ее на php далее ее значение подставляйте в тег. Будет вам счастье. Кривой пример на подумать:
<? $cookieColor = isset($_COOKIE['theme']) ? intval($_COOKIE['theme']) : 0; // ожидает передачи в куку theme - числа $colorTheme = $cookieColor < 1 ? '#000' : '#fff'; ?> <meta name="theme-color" content="<?=$colorTheme?>" /> |
<? $cookieColor = isset($_COOKIE['theme']) ? intval($_COOKIE['theme']) : 0; // ожидает передачи в куку theme - числа $colorTheme = $cookieColor < 1 ? '#000' : '#fff'; ?> <meta name="theme-color" content="<?=$colorTheme?>" />
- всё проще) немного доработал код в этой части (точнее в двух). но всё равно спасибо, отмечу решением за проявленное внимание
if( $a_hour >= 0 AND ($a_hour > 20 OR $a_hour < 6) ) { $theme_class = 'darkstyle'; $theme_color = '#000000'; } else { $theme_class = ''; $theme_color = '#29a075'; }
if( $a_hour >= 0 AND ($a_hour > 20 OR $a_hour < 6) ) { $theme_class = 'darkstyle'; $theme_color = '#000000'; } else { $theme_class = ''; $theme_color = '#29a075'; }
- $cookieColor = intval($_COOKIE['theme'] ?? 0);
Ну или кстати в одну строку
$colorTheme = empty($_COOKIE['theme']) ? '#000' : '#fff'; - Aison, святая вера в то, что все пользователи живут в одном часовом поясе )))
- Ипатьев, можно и тернарные операторы заюзать) но мне и мой вариант норм. да почему, я и до вечера мог подождать и даже до следующего дня) вряд ли что-то особое предложат. сделал вот через пхп и всё прекрасно)
- Ипатьев, нет, что у них закат и рассвет в одинаковое время
- Aison,
$init_c = $a_hour >= 0 && ($a_hour > 20 || $a_hour < 6) ? 1 : 0; $theme_class = $init_c>0 ? 'darkstyle' : ''; $theme_color = $init_c>0 ? '#000000' : '#29a075';
$init_c = $a_hour >= 0 && ($a_hour > 20 || $a_hour < 6) ? 1 : 0; $theme_class = $init_c>0 ? 'darkstyle' : ''; $theme_color = $init_c>0 ? '#000000' : '#29a075';
- Aison, при чем здесь подождать до следующего дня? Пользователи вашего сайта
- Ипатьев, да я хз вообще о чём речь...
- Aison, вы вообще в курсе, что такое часовой пояс? А что пользователи сайта могут жить в разных частях земного шара?
- Aison, у тебя смена темы зависит от времени сервера.
И если на твой сайт зайдет человек с другим часовым поясом, то у них это все будет работать не корректно.
Это я так, просто объяснил, что тебе выше пытаются донести - Wispik, это просто возможный вариант использование кода. т.е. это как бы плагин для cms. я использую вторую часть кода, где тема меняется по требованию, а это нажатие на кнопку смены.
- Ипатьев, я в курсе)
- Aison, и какую тему увидит пользователь из Хабаровска, когда в датацентре в Москве будет ночь?
- Ипатьев, какая стоит по умолчанию, а если ему нужна будет тёмная, то нажатием кнопки изменит на тёмную
- Wispik, и я не оч понимаю, зачем это делать, если вопрос был в другом... это не совсем мой код, но я знаю, что там происходит). я всё равно его уже переписал... ответы я тоже получил. и вопрос решён, но спасибо. можно было просто сразу сказать, а не намёками... я бы тогда сразу сказал, что всё ок и не стоит переживать) я ж мог просто скинуть заготовку кода, который не совсем готов.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для реализации смены на тёмную тему на веб-сайте можно использовать CSS и JavaScript. Вот пример того, как это можно сделать:
1. Создайте два набора стилей для светлой и тёмной темы:
/* Стили для светлой темы */ body { background-color: #ffffff; color: #000000; } /* Стили для тёмной темы */ .dark-mode body { background-color: #333333; color: #ffffff; }
2. Добавьте кнопку или переключатель, который будет отвечать за смену темы:
<button>Сменить тему</button>
3. Напишите JavaScript функцию для переключения темы:
function toggleDarkMode() { const body = document.querySelector('body'); body.classList.toggle('dark-mode'); }
4. Для сохранения выбранной пользователем темы можно использовать Local Storage:
// Проверяем, есть ли сохранённая тема в Local Storage if (localStorage.getItem('theme') === 'dark') { document.querySelector('body').classList.add('dark-mode'); } // Обновляем тему при смене function toggleDarkMode() { const body = document.querySelector('body'); body.classList.toggle('dark-mode'); // Сохраняем выбранную тему в Local Storage if (body.classList.contains('dark-mode')) { localStorage.setItem('theme', 'dark'); } else { localStorage.setItem('theme', 'light'); } }
Таким образом, пользователь сможет переключать темы на вашем сайте, а их предпочтения будут сохранены даже после обновления страницы.