Как одновременно поменять цвет множества блоков в css через JS

У меня есть множество блоков у которых один цвет и при нажатии на кнопку они должны разом меняться на другой цвет. Как сделать удобнее и быстрее без кучи querySelector. Надо учесть что у некоторых блоков не надо менять цвет.

#chang {
    background-color: #fde4c6;
}
const Col = document.querySelectorAll('#chang').style;
const btn1 = document.querySelector('.btn-lazuli');

btn1.addEventListener('click', () => {
    Col = 'background-color: #0000ff';
})

Вот такая ошибка вылезет


Ответы (4 шт):

Автор решения: novvember

Найти все блоки через querySelectorAll, а потом в цикле у них поменять фон:

const blocksToChange = document.querySelectorAll('.block_colored');
const button = document.querySelector('.button');

function changeBackgroundColor(blocksToChange, color) {
  blocksToChange.forEach(block => block.style.backgroundColor = color);
}

button.addEventListener('click', () => changeBackgroundColor(blocksToChange, 'grey'));
<div class="block">1</div>
<div class="block block_colored">2</div>
<div class="block block_colored">3</div>
<div class="block block_colored">4</div>
<div class="block">5</div>
<div class="block">6</div>
<div class="block block_colored">7</div>
<button type="button" class="button">Кнопка</button>

→ Ссылка
Автор решения: Проста Miha

Наверное вот так )

function changeColor() {
  let changeColorBlock = document.querySelectorAll('.change-color');

  for (elem of changeColorBlock) {
    elem.style.backgroundColor = 'green';
  }
}
div {
  width: 150px;
  height: 150px;
  background-color: red;
  display: inline-block;
  margin: 15px;
}
<button onclick="changeColor()">Click</button><br>
<div class="change-color"></div>
<div class="change-color"></div>
<div class="change-color"></div>
<div class="no-change-color"></div>
<div class="no-change-color"></div>
<div class="change-color"></div>
<div class="change-color"></div>
<div class="change-color"></div>

→ Ссылка
Автор решения: De.Minov

Как вариант можно использовать CSS переменные, поставить нужным блокам класс и классу выдать цвет, который просто передавать в style как переменную.

Данный вариант относительно удобен тем, что не нужно перебирать все блоки, даже если их тысячи.

let grid = document.querySelector('.grid');

for(let i = 0; i < 20; i++) {
  grid.innerHTML += `<div class="grid__item${Math.random() < .5 ? ' color-change' : ''}"></div>`
}

document.querySelectorAll('button').forEach(function(e) {
  e.addEventListener('click', function(e) {
    grid.style.setProperty('--color', e.target.innerText);
  });
});
.grid {
  display: grid;
  grid-template-columns: repeat(10, 1fr);
  grid-gap: 10px;
  width: 100%;
  --color: blue;
  margin-bottom: 10px;
}

.grid__item {
  display: block;
  width: 100%;
  background-color: #ccc;
}

.grid__item::before {
  content: '';
  display: block;
  width: 100%;
  height: 0;
  padding-top: 100%;
}

.color-change {
  background: var(--color);
}
<div class="grid"></div>

<button>red</button>
<button>#000</button>
<button>green</button>
<button>linear-gradient(45deg, #09f, red)</button>

→ Ссылка
Автор решения: De.Minov

Вы изменили свой вопрос, добавив решение в котором присутствуют ошибки.

#chang {
    background-color: #fde4c6;
}

Значение атрибута id должно быть единственным на странице.


Данная запись не верна.

const Col = document.querySelectorAll('#chang').style;
const btn1 = document.querySelector('.btn-lazuli');

btn1.addEventListener('click', () => {
    Col = 'background-color: #0000ff';
})
const Col = document.querySelectorAll('.chang'); // это набор элементов, по сути массив
                                                 // И как я написал выше, нужно использовать 
                                                 // для этих элементов атрибут `class` вместо `id`
const btn1 = document.querySelector('.btn-lazuli');

btn1.addEventListener('click', () => {
  Col.forEach(function(e) { // Т.к. это набор, вы должны пройтись по нему, для этого можно
                            // использовать метод forEach
    e.style.backgroundColor = '#0000ff'; // А background-color назначается через
                                         // метод .style.backgroundColor
  });
})
→ Ссылка