style.setProperty изменяет переменные css в элементе html, но стиль элементов, использующих эти переменные, не меняется

#css #reactjs #css-variables

Вопрос:

Я использую document.documentElement.style.setProperty(«x», «y») для изменения значений переменных css, и по какой-то причине это на самом деле их не меняет. Когда я проверяю приложение с помощью инструментов разработки, переменные меняются вверху, но не внизу, и я не уверен, почему.

введите описание изображения здесь

Вот файл с переменными css в публичном репо:
https://github.com/Neidz/fm_social-media-dashboard/blob/master/src/components/styles/variables.scss
А вот файл react, который изменяет переменные css:
https://github.com/Neidz/fm_social-media-dashboard/blob/master/src/components/topPart.tsx

Я пытаюсь изменить все значения переменных, начиная с ct, на переменные с тем же именем, но начиная с lt

 * {  --ctBackground: var(--dtBackground);  --ctTopBgPattern: var(--dtTopBgPattern);  --ctCardBg: var(--dtCardBg);  --ctText1: var(--dtText1);  --ctText2: var(--dtText2);  --ctToggle: var(--dtToggle);   // light theme  --ltBackground: hsl(0, 0%, 100%);  --ltTopBgPattern: hsl(225, 100%, 98%);  --ltCardBg: hsl(227, 47%, 96%);  --ltText1: hsl(228, 12%, 44%);  --ltText2: hsl(230, 17%, 14%);  --ltToggle: hsl(230, 22%, 74%);   // dark theme  --dtBackground: hsl(230, 17%, 14%);  --dtTopBgPattern: hsl(232, 19%, 15%);  --dtCardBg: hsl(228, 28%, 20%);  --dtText1: hsl(228, 34%, 66%);  --dtText2: hsl(0, 0%, 100%);  --dtToggle: var(--dtTopBgPattern); }  

Я делаю это с помощью элемента ввода

 lt;input type="checkbox" className="modeInput" onChange={() =gt; setDarkMode(!darkMode)} /gt;  

что вызывает эффект использования, потому что состояние меняется

 useEffect(() =gt; {  if (darkMode) {  document.documentElement.style.setProperty("--ctBackground", "var(--dtBackground)");  document.documentElement.style.setProperty("--ctTopBgPattern", "var(--dtTopBgPattern)");  document.documentElement.style.setProperty("--ctCardBg", "var(--dtCardBg)");  document.documentElement.style.setProperty("--ctText1", "var(--dtText1)");  document.documentElement.style.setProperty("--ctText2", "var(--dtText2)");  document.documentElement.style.setProperty("--ctToggle", "var(--dtToggle)");  } else if (!darkMode) {  document.documentElement.style.setProperty("--ctBackground", "var(--ltBackground)");  document.documentElement.style.setProperty("--ctTopBgPattern", "var(--ltTopBgPattern)");  document.documentElement.style.setProperty("--ctCardBg", "var(--ltCardBg)");  document.documentElement.style.setProperty("--ctText1", "var(--ltText1)");  document.documentElement.style.setProperty("--ctText2", "var(--ltText2)");  document.documentElement.style.setProperty("--ctToggle", "var(--ltToggle)");  }  }, [darkMode]);  

Нет никаких проблем с эффектом использования, потому что, если я попытаюсь утешить.войдите в то место, где переменные должны измениться, это работает просто отлично.

Комментарии:

1. Пожалуйста, вставьте свой код в свой вопрос — в частности, мы не можем сказать из вашего описания, какие переменные вы изменяете, как и на каких элементах с помощью JS.

2. @AHaworth Готово, спасибо за предложение

Ответ №1:

Проблема решается, когда я определяю переменную css в :root вместо*, поэтому правильный css выглядит так:

 :root {  --ctBackground: var(--dtBackground);  --ctTopBgPattern: var(--dtTopBgPattern);  --ctCardBg: var(--dtCardBg);  --ctText1: var(--dtText1);  --ctText2: var(--dtText2);  --ctToggle: var(--dtToggle); }  

React/javascript остается точно таким же