Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Замена стилей (https://javascript.ru/forum/dom-window/83998-zamena-stilejj.html)

vitalso78 10.05.2022 15:57

Замена стилей
 
Здравствуйте. Хочу реализовать переключатель со светлой темы на тёмную. Пытаюсь подключить стили вот таким способом

<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>, то стили ломают светлую тему и всё тогда нормально. Как мне подключить тёмную тему шаблона через кнопку ?

рони 10.05.2022 15:59

vitalso78,
меняйте class body.

vitalso78 10.05.2022 16:01

А можно по подробней пожайлуста, с примером. А то я дуб дубом.

рони 10.05.2022 16:08

vitalso78,
https://javascript.ru/forum/css-html...tml#post531438

https://javascript.ru/forum/misc/809...tml#post528629

https://javascript.ru/forum/dom-wind...tml#post498169

vitalso78 10.05.2022 16:28

Ну как бы понятно, но не совсем. В примере меняеться лишь один фон. А как сделлать ссылкой на файл css ? У меня css более 210777 строк. Вы предстовляете как будет выглядеть страница html ,?

рони 10.05.2022 17:25

vitalso78,
при клике записывайте название файла в localStorage, перезагружайте страницу, и грузите то что записали.

Nexus 10.05.2022 18:06

Можно так сделать:

/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;
});

vitalso78 11.05.2022 09:32

Смотрите. Я нашол выход из положения. Но к сожалению при переключении стилей они не сохраняются - они сохроняются до перезагрузки страница, далее нужно опять нажимать кнопку. Как мне сделать, что дописать, что бы новые стили сохронялись после перезагрузки страницы, до нажатия кнопки в обратное состояние старых стилей ? Тоесть. Включил я тёмный цвет, походил по страницам сайта, и потом опять переключил на светлый.

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);
  });
 
});

ksa 11.05.2022 09:57

Цитата:

Сообщение от vitalso78
Как мне сделать, что дописать, что бы новые стили сохронялись после перезагрузки страницы, до нажатия кнопки в обратное состояние старых стилей ?

Если у тебя на сайте есть некая регистрация, т.е. ты можешь как-то определить пользователя - можешь в некой БД на сервере запоминать какая тема была выбрана.
Если таковой регистрации нет - можно записать в localStorage, потом читать от туда и правильно устанавливать тему...

vitalso78 11.05.2022 10:00

У меня регистрация есть. Мне нужно и с регистрацией и без. Ну вот я дал коды.Что мне нужно изменить ?

рони 11.05.2022 10:46

смена темы оформления страницы с запоминанием выбора
 
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>

vitalso78 11.05.2022 11:03

Вот в этот код как воткнуть сохранение ?

window.onload = function() {
    document.getElementById('SuperButton').onclick = function()
    {
        if(document.body.className != 'new_class')
        {
            document.body.className = 'new_class';
        }
        else
        {
            document.body.className = '';
        }
    }
}

рони 11.05.2022 11:53

Цитата:

Сообщение от vitalso78
Вот в этот код как воткнуть сохранение ?

зачем? грузите ваши css, как показано выше #11, и не мучайтесь с body.

vitalso78 11.05.2022 11:57

заменв стилей
 
Цитата:

Сообщение от рони (Сообщение 545281)
зачем? грузите ваши css, как показано выше #11, и не мучайтесь с body.

У меняя не работает ваша конструкция, не полностью подгружает стили. Можно сказать, что вообще не подгружает. Если не трудно, помогите мне в мой код воткнуть сохранение.

vitalso78 11.05.2022 12:06

Вот я поставил ваше https://delivery.foodsonic.ru/ Вообще работает не поймёш как

рони 11.05.2022 12:09

Цитата:

Сообщение от vitalso78
Вообще работает не поймёш как

прекрасно работает, что не так?

рони 11.05.2022 12:12

счас перекинем с кнопок, на ваш div

vitalso78 11.05.2022 12:20

Фиг знает, у меня не пашет. Один раз переключаеш, потом всё, триндец, не работают кнопки

рони 11.05.2022 12:22

vitalso78,
верните id!!! id="SuperButton" и замрите)))

рони 11.05.2022 12:28

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>

рони 11.05.2022 12:33

vitalso78,
$('.switch-btn').click -- это уберите

vitalso78 11.05.2022 12:42

Вот пощёлкайте , чот как то не коректно работает https://delivery.foodsonic.ru/ Спасибо огромное. Это лучше намного чем было.

рони 11.05.2022 12:49

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);
            })
        });

рони 11.05.2022 12:50

vitalso78,
обновите эту страницу и скопируйте #23

vitalso78 11.05.2022 12:53

А так переключатель становиться не активным

рони 11.05.2022 12:53

Цитата:

Сообщение от vitalso78
А так переключатель становиться не активным

Цитата:

Сообщение от рони
обновите эту страницу и скопируйте #23

:-?

vitalso78 11.05.2022 12:58

Спасибо вам огромное, здорово помогли. Я неделю уже мучаюсь. А как по умолчанию сделать светлый ? А то в данный момент по умолчанию тёмный

рони 11.05.2022 13:04

Цитата:

Сообщение от vitalso78
А как по умолчанию сделать светлый ?

<link rel="stylesheet" href="light.css" id="theme-css-file" />
<div class="switch-btn switch-on" id="SuperButton" name="SuperButton">SuperButton</div> убрать зачёркнутое и вписать светлую тему в link

рони 11.05.2022 13:10

vitalso78,
это строки 47 и 84 на вашей странице

vitalso78 11.05.2022 13:15

Ещё раз огромнейшее спасибо. Отлчно !!!

рони 11.05.2022 13:20

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>

рони 11.05.2022 13:24

обновить и скопировать )))

Nexus 11.05.2022 13:25

рони, а зачем div'у в 39-й строке атрибут name?

рони 11.05.2022 13:37

Цитата:

Сообщение от Nexus
зачем div'у в 39-й строке атрибут name?

))) видимо при рождении div был input-ом, можно убрать, если нет подвязок css на этот селектор.

vitalso78 11.05.2022 16:44

Вообщем вот что у меня получилось https://delivery.foodsonic.ru/, благодаря вам конечно

рони 11.05.2022 17:24

vitalso78,
смотрите #31, "лишняя" подгрузка стилей в начале, должна исчезнуть.

vitalso78 11.05.2022 17:38

Цитата:

Сообщение от рони (Сообщение 545309)
vitalso78,
смотрите #31, "лишняя" подгрузка стилей в начале, должна исчезнуть.

Чот я не найду. что именно удалить ?

рони 11.05.2022 17:44

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>

vitalso78 11.05.2022 17:47

Ага, спасибо

vitalso78 12.05.2022 10:32

Забыл вчера рассказать. Так как сайт на Битриксе,- изложил проблему у них на форуме. С начала неделю ждал, тишина, вообще никого. Потом всё таки кто то ответил. Изложил такую инструкцию,- охиреешь. Что бы сделать вот такой переключатель , надо обернуться вокруг себя три раза, свистнуть 28 раз, подпрыгнуть 234 раза, и стучать в бубен пока не заработает код. Даже пример не привели. Геморой страшный. У вас же сделал за 30 минут.


Часовой пояс GMT +3, время: 01:09.