@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.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 05:01
999999 руб./за проект
19 апр. 2024, в 03:52
1000 руб./за проект
19 апр. 2024, в 03:01
1000 руб./за проект