@Denis0313

Как добавить класс всем элементам при использовании querySelectroAll?

let element = document.querySelector('.advantages__item');

window.addEventListener('scroll',check, false);

function check () {
  if (window.scrollY > 300) {
    element.classList.add('show')
  }else{
    element.classList.remove('show')
  }
}


В таком исполнении код работает и присваивает класс, кому надо и когда надо. Но как только я меняю querySelector НА querySelectorAll (таких элементов 5 штук, всем надо добавить класс), всё, вылетает ошибка (Cannot read properties of undefined (reading 'remove').
  • Вопрос задан
  • 103 просмотра
Решения вопроса 2
scoffs
@scoffs
Frontend | C# | Student
Для понимания проблемы достаточно вывести element в консоль при querySelectorAll и понять, что это массив. Тогда для присвоения доп. класса надо пройти по этому массиву и добавить этот самый класс.

let elements = document.querySelectorAll('.advantages__item');

window.addEventListener('scroll', check, false);

function check() {
  if (window.scrollY > 300) {
    elements.forEach(function(element) {
      element.classList.add('show');
    });
  } else {
    elements.forEach(function(element) {
      element.classList.remove('show');
    });
  }
}

console.log() сила!
Ответ написан
Stalker_RED
@Stalker_RED
Код можно немного Семён Окулов, сократить, использовав classList.toggle() вместо add и remove.
let elements = document.querySelectorAll('.advantages__item');

window.addEventListener('scroll', check, false);

function check() {
    elements.forEach(el =>
      el.classList.toggle('show', window.scrollY > 300)
    );
}

А теперь добавьте все-таки console.log и посмотрте сколько раз вызывается эта функция при скролле, и вы каждый раз дергаете у этих элементов classList. Возможно стоит запоминать предыдущее состояние, и перебирать элементы только если оно изменилось.
И, возможно, стоит добавить throttle.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы