Замена стилей
Здравствуйте. Хочу реализовать переключатель со светлой темы на тёмную. Пытаюсь подключить стили вот таким способом
<a href="#" oncl ick="changeCSS('/dark.css', 0);">тёмный</a> | <a href="#" oncl ick="changeCSS('/template_styles.css', 0);">светлый</a> function changeCSS(cssFile, cssLinkIndex) { var oldlink = document.getElementsByTagName("link").item(cssLinkIndex); var newlink = document.createElement("link"); newlink.setAttribute("rel", "stylesheet"); newlink.setAttribute("type", "text/css"); newlink.setAttribute("href", cssFile); document.getElementsByTagName("head").item(0).replaceChild(newlink, oldlink); } Но к сожалению стили подключаются частично. Если же я прописываю стили напрямую в шаблоне <link rel="stylesheet" href="/dark.css"> в <head>, то стили ломают светлую тему и всё тогда нормально. Как мне подключить тёмную тему шаблона через кнопку ? |
vitalso78,
меняйте class body. |
А можно по подробней пожайлуста, с примером. А то я дуб дубом.
|
|
Ну как бы понятно, но не совсем. В примере меняеться лишь один фон. А как сделлать ссылкой на файл css ? У меня css более 210777 строк. Вы предстовляете как будет выглядеть страница html ,?
|
vitalso78,
при клике записывайте название файла в localStorage, перезагружайте страницу, и грузите то что записали. |
Можно так сделать:
/index.html <!DOCTYPE html> <html> <head> <title>Parcel Sandbox</title> <meta charset="UTF-8" /> <link rel="stylesheet" href="/src/dark.css" id="theme-css-file" /> <script src="/src/index.js"></script> </head> <body> <div>Switch theme:</div> <button type="button" data-set-theme-file="/src/light.css">Light</button> <button type="button" data-set-theme-file="/src/dark.css">Dark</button> </body> </html> /src/dark.css body { background: #333; color: #fff; } /src/light.css body { background: #eee; color: #333; } /src/index.js window.addEventListener("click", function (e) { const selector = "[data-set-theme-file]"; let target = e.target; if ( !target || !target.matches || (!target.matches(selector) && !(target = target.closest(selector))) ) { return; } const newCssFilePath = target.getAttribute("data-set-theme-file"); const styleElement = document.querySelector("#theme-css-file"); if (!newCssFilePath || !styleElement) { return; } styleElement.href = newCssFilePath; }); |
Смотрите. Я нашол выход из положения. Но к сожалению при переключении стилей они не сохраняются - они сохроняются до перезагрузки страница, далее нужно опять нажимать кнопку. Как мне сделать, что дописать, что бы новые стили сохронялись после перезагрузки страницы, до нажатия кнопки в обратное состояние старых стилей ? Тоесть. Включил я тёмный цвет, походил по страницам сайта, и потом опять переключил на светлый.
window.onload = function() { document.getElementById('SuperButton').onclick = function() { if(document.body.className != 'new_class') { document.body.className = 'new_class'; } else { document.body.className = ''; } } } $(function(){ $('.switch-btn').click(function (e, changeState) { if (changeState === undefined) { $(this).toggleClass('switch-on'); } if ($(this).hasClass('switch-on')) { $(this).trigger('on.switch'); } else { $(this).trigger('off.switch'); } }); $('.switch-btn').on('on.switch', function(){ console.log('Кнопка переключена в состояние on'); }); $('.switch-btn').on('off.switch', function(){ console.log('Кнопка переключена в состояние off'); }); $('.switch-btn').each(function(){ $(this).triggerHandler('click', false); }); }); |
Цитата:
Если таковой регистрации нет - можно записать в localStorage, потом читать от туда и правильно устанавливать тему... |
У меня регистрация есть. Мне нужно и с регистрацией и без. Ну вот я дал коды.Что мне нужно изменить ?
|
смена темы оформления страницы с запоминанием выбора
vitalso78,
<!DOCTYPE html> <html> <head> <title>css localStorage</title> <meta charset="UTF-8" /> <link rel="stylesheet" href="dark.css" id="theme-css-file" /> <script> document.addEventListener("DOMContentLoaded", function() { const styleElement = document.querySelector("#theme-css-file"); const buttons = document.querySelectorAll("[data-set-theme-file]"); let CssFilePath = localStorage.getItem("CssFilePath"); if (CssFilePath) styleElement.href = CssFilePath; buttons.forEach(function(button) { let href = button.dataset.setThemeFile; button.addEventListener("click", function() { styleElement.href = href; localStorage.setItem("CssFilePath", href); }) }) }); </script> </head> <body> <div>Switch theme:</div> <button type="button" data-set-theme-file="light.css">Light</button> <button type="button" data-set-theme-file="dark.css">Dark</button> </body> </html> |
Вот в этот код как воткнуть сохранение ?
window.onload = function() { document.getElementById('SuperButton').onclick = function() { if(document.body.className != 'new_class') { document.body.className = 'new_class'; } else { document.body.className = ''; } } } |
Цитата:
|
заменв стилей
Цитата:
|
Вот я поставил ваше https://delivery.foodsonic.ru/ Вообще работает не поймёш как
|
Цитата:
|
счас перекинем с кнопок, на ваш div
|
Фиг знает, у меня не пашет. Один раз переключаеш, потом всё, триндец, не работают кнопки
|
vitalso78,
верните id!!! id="SuperButton" и замрите))) |
vitalso78,
<!DOCTYPE html> <html> <head> <title>css localStorage</title> <meta charset="UTF-8" /> <base href="https://delivery.foodsonic.ru/" /> <link rel="stylesheet" href="https://delivery.foodsonic.ru/dark.css" id="theme-css-file" /> <script> document.addEventListener("DOMContentLoaded", function() { const styleElement = document.querySelector("#theme-css-file"); const button = document.querySelector("#SuperButton"); let CssFilePath = localStorage.getItem("CssFilePath"); if (CssFilePath) styleElement.href = CssFilePath; button.addEventListener("click", function() { let href = "https://delivery.foodsonic.ru/light.css"; button.classList.toggle("switch-on"); if(button.classList.contains("switch-on")) href = "https://delivery.foodsonic.ru/dark.css"; styleElement.href = href; localStorage.setItem("CssFilePath", href); }) }); </script> </head> <body> <div>Switch theme:</div> <div class="switch-btn switch-on" id="SuperButton" name="SuperButton">click me SuperButton</div> </body> </html> |
vitalso78,
$('.switch-btn').click -- это уберите |
Вот пощёлкайте , чот как то не коректно работает https://delivery.foodsonic.ru/ Спасибо огромное. Это лучше намного чем было.
|
vitalso78,
так сделайте document.addEventListener("DOMContentLoaded", function() { const styleElement = document.querySelector("#theme-css-file"); const button = document.querySelector("#SuperButton"); let CssFilePath = localStorage.getItem("CssFilePath"); if (CssFilePath) { if (CssFilePath.indexOf("dark.css") !==-1) button.classList.add("switch-on"); else button.classList.remove("switch-on"); styleElement.href = CssFilePath; } button.addEventListener("click", function() { let href = "https://delivery.foodsonic.ru/light.css"; button.classList.toggle("switch-on"); if (button.classList.contains("switch-on")) href = "https://delivery.foodsonic.ru/dark.css"; styleElement.href = href; localStorage.setItem("CssFilePath", href); }) }); |
vitalso78,
обновите эту страницу и скопируйте #23 |
А так переключатель становиться не активным
|
Цитата:
Цитата:
|
Спасибо вам огромное, здорово помогли. Я неделю уже мучаюсь. А как по умолчанию сделать светлый ? А то в данный момент по умолчанию тёмный
|
Цитата:
<div class="switch-btn |
vitalso78,
это строки 47 и 84 на вашей странице |
Ещё раз огромнейшее спасибо. Отлчно !!!
|
vitalso78,
и такой вариант строка 8 href оставить пустым строка 9 ставить сразу после link строка 16 в любое место. строка 39 убрать class switch-on <!DOCTYPE html> <html> <head> <title>css localStorage</title> <meta charset="UTF-8" /> <base href="https://delivery.foodsonic.ru/" /> <link rel="stylesheet" href="" id="theme-css-file" /> <script> let CssFilePath = localStorage.getItem("CssFilePath")||"https://delivery.foodsonic.ru/light.css"; const styleElement = document.querySelector("#theme-css-file"); styleElement.href = CssFilePath; </script> <script> document.addEventListener("DOMContentLoaded", function() { const styleElement = document.querySelector("#theme-css-file"); const button = document.querySelector("#SuperButton"); let CssFilePath = localStorage.getItem("CssFilePath"); if (CssFilePath) { if (CssFilePath.indexOf("dark.css") !== -1) button.classList.add("switch-on"); else button.classList.remove("switch-on"); } button.addEventListener("click", function() { let href = "https://delivery.foodsonic.ru/light.css"; button.classList.toggle("switch-on"); if (button.classList.contains("switch-on")) href = "https://delivery.foodsonic.ru/dark.css"; styleElement.href = href; localStorage.setItem("CssFilePath", href); }) }); </script> </head> <body> <div>Switch theme:</div> <div class="switch-btn" id="SuperButton" name="SuperButton">SuperButton</div> </body> </html> |
обновить и скопировать )))
|
рони, а зачем div'у в 39-й строке атрибут name?
|
Цитата:
|
Вообщем вот что у меня получилось https://delivery.foodsonic.ru/, благодаря вам конечно
|
vitalso78,
смотрите #31, "лишняя" подгрузка стилей в начале, должна исчезнуть. |
Цитата:
|
vitalso78,
строка 43 <link rel="stylesheet" href="/light.css" id="theme-css-file" /> выделенное удалить должно стать так <link rel="stylesheet" href="" id="theme-css-file" /> <script> let CssFilePath = localStorage.getItem("CssFilePath")||"/light.css"; const styleElement = document.querySelector("#theme-css-file"); styleElement.href = CssFilePath; </script> </head> |
Ага, спасибо
|
Забыл вчера рассказать. Так как сайт на Битриксе,- изложил проблему у них на форуме. С начала неделю ждал, тишина, вообще никого. Потом всё таки кто то ответил. Изложил такую инструкцию,- охиреешь. Что бы сделать вот такой переключатель , надо обернуться вокруг себя три раза, свистнуть 28 раз, подпрыгнуть 234 раза, и стучать в бубен пока не заработает код. Даже пример не привели. Геморой страшный. У вас же сделал за 30 минут.
|
Часовой пояс GMT +3, время: 01:09. |