Проверить значение CSS в javascript

Я хочу, чтобы JavaScript проверял мой код CSS и возвращал меня, если цвет фона = # 222327, он изменит цвет фона на # 29fd53. Но если старый цвет фона = # 29fd53, он изменит цвет фона на # 222327.

Мой Js-код

function changeBgC(){
var body = document.getElementsByTagName("body")[0];

var computedStyle = window.getComputedStyle(body)

var bodyBackgroundValue = computedStyle.getPropertyValue("background-color")
console.info(bodyBackgroundValue);
if (bodyBackgroundValue == "#222327") {
    document.querySelector('body').style.backgroundColor = "#29fd53"
  } else {
    document.querySelector('body').style.backgroundColor = "#222327"
  }
}
.body{
    width: 100%;
    height: 100vh;
    min-height: 100vh;
    background: #222327;
}
<div class = "box">
<button onclick = "changeBgC()" class = "menuButton">≣</button>
</div>
          

Я просто пытаюсь использовать i++ (я использую onclick в своем html-коде), но он только меняет цвет фона на # 29fd53. При повторном нажатии на кнопку ничего не происходит.

Вот что я пытаюсь

function changeBgC(){
    var i = 0
    if (i % 2 === 0){
        document.querySelector('.body').style.backgroundColor = "#29fd53"
        console.info(i);
        i+=1
    }else{
        document.querySelector('.body').style.backgroundColor = "#222327"
        i+=1
    }
}

вы повторно объявляете i как 0 при каждом вызове функции, чтобы он никогда не увеличивался. Также вы меняете стиль body или какой-то элемент с class = "body"?

pilchard 31.03.2023 13:58

Проверьте значение, которое возвращает getComputedStyle(), скорее всего, это значение rgb(), а не шестнадцатеричный код.

Teemu 31.03.2023 14:01
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
112
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Ваша проблема заключается в установке переменной i внутри области действия функции. Поэтому каждый раз, когда вы вызываете changeBgC(), он устанавливает i = 0.

Объявите i вне функции, и это должно работать

let i = 0;
function changeBgC(){
    if (i % 2 === 0){
        document.querySelector('.body').style.backgroundColor = "#29fd53"
        console.info(i);
        i+=1
    }else{
        document.querySelector('.body').style.backgroundColor = "#222327"
        i+=1
    }
}

Этого можно добиться, используя class вместо function. Таким образом, переменная i может быть инкапсулирована. Я использовал закрытые члены (#), так как они не требуются вне класса.

class backg {

#i=0;
#elem=document.body.style;

change() {
  this.#i=!this.#i;
  this.#elem.backgroundColor = this.#i?"#29fd53":"#222327";
 }
}

bkg=new backg();
.body{
    width: 100%;
    height: 100vh;
    min-height: 100vh;
    background: #222327;
}
<div class = "box">
<button onclick = "bkg.change();" class = "menuButton">≣</button>
</div>
          

как упоминалось выше @Teemu getComputedStyle() возвращает значение rgb() поэтому, чтобы получить HEX-код, вы можете использовать переменную css, а не писать функцию для преобразования из RGB в HEX,

функция обрезки, используемая для удаления конечных пробелов

function changeBgC(){
  let bgColor = getComputedStyle(document.body).getPropertyValue('--bg-color').trim();
  if (bgColor == "#222327"){
    document.body.style.setProperty('--bg-color', '#29fd53');
  } else {
    document.body.style.setProperty('--bg-color', '#222327');
  }
}
body{
   --bg-color: #222327;
    width: 100%;
    height: 100vh;
    min-height: 100vh;
    background-color: var(--bg-color);
}
<div class = "box">
  <button onclick = "changeBgC()" class = "menuButton">≣</button>
</div>

Вы не должны использовать JavaScript для прямого изменения стилей элементов с целью переключения тем.

Однако лучшим решением для переключения тем является использование переменных CSS вместо прямого изменения стилей элементов с помощью JavaScript.

Этот подход имеет несколько преимуществ, включая более высокую производительность, более простое обслуживание и большую гибкость. Вот пример того, как вы можете использовать переменные CSS для переключения между светлой и темной темами:

  1. Используйте переменные CSS для изменения цвета:
.theme-light {
  --bg-primary: #29fd53;
}

.theme-dark {
  --bg-primary: #222327;
}

body {
  background: var(--bg-primary);
}
  1. Переключение между темами:
function switchTheme() {
    let themes = ['theme-light', 'theme-dark'];
    let currentTheme = [...document.body.classList].find(c => themes.includes(c)) ?? themes[0]
    let nextTheme = themes[themes.indexOf(currentTheme)+1] ?? themes[0]
    document.body.classList.remove(...themes) // removes all theme classes, including the current one
    document.body.classList.add(nextTheme)
}
  1. Фрагмент HTML:
<div class = "box">
  <button onclick = "switchTheme()" class = "menuButton">≣</button>
</div>
  1. Не забудьте добавить начальный класс для тела с одной из тем:
<body class = "theme-light">
<body class = "theme-dark">

Другие вопросы по теме