@ocheretnyi_1207

Почему не работает код JS?

Есть слайдер с картинками:
<div class="product-cards__slider slider slider--catalog">
  <div class="slider__wrap slider__wrap--catalog">
    <div class="slider__item slider__item--active">
      <picture>
        <source media="(min-width: 1440px)" srcset="img/slider/slider-img-graf-1-desktop-1.jpg">
        <img src="img/slider/slider-img-graf-1-mobile-1.jpg" alt="Пергола Граф 1">
      </picture>
    </div>
    <div class="slider__item">
      <picture>
        <source media="(min-width: 1440px)" srcset="img/slider/slider-img-graf-1-desktop-2.jpg">
        <img src="img/slider/slider-img-graf-1-mobile-2.jpg" alt="Пергола Граф 1">
      </picture>
    </div>
    <div class="slider__item">
      <picture>
        <source media="(min-width: 1440px)" srcset="img/slider/slider-img-graf-1-desktop-3.jpg">
        <img src="img/slider/slider-img-graf-1-mobile-3.jpg" alt="Пергола Граф 1">
      </picture>
    </div>
  </div>
  <button class="slider__btn slider__btn--prev slider__btn--catalog">Предыдущий слайд</button>
  <button class="slider__btn slider__btn--next slider__btn--catalog">Следующий слайд</button>
</div>

И есть его js реализация:
const btnPrevSlide = document.querySelector(".slider__btn--prev");
const btnNextSlide = document.querySelector(".slider__btn--next");
const slides = [... document.querySelectorAll(".slider__item")];

btnNextSlide.addEventListener("click", () => {
  slides.forEach((element) => {
    element.classList.remove("slider__item--active")
  })

  slides.push(slides.shift());
  slides[0].classList.add("slider__item--active");
})

btnPrevSlide.addEventListener("click", () => {
  slides.forEach((element) => {
    element.classList.remove("slider__item--active")
  })
  slides.unshift(slides.pop());
  slides[0].classList.add("slider__item--active");
})


Этот код работает когда один слайдер на странице. Если слайдеров несколько начинается бардак.
Я попробовал переписать код таким образом, чтобы найти таргетный слайдер и его кнопку и на нем вызвать функцию смены слайдов. Но кнопка срабатывает только один раз и я не могу понять почему?

const nextSlide = (arr) => {
  arr.forEach((element) => {
    element.classList.remove("slider__item--active")
  })
  arr.push(arr.shift());
  arr[0].classList.add("slider__item--active");
}

document.addEventListener("click", (evt) => {
  const target = evt.target;
  const slider = target.parentNode

  if (target.classList.contains("slider__btn--next")) {
    nextSlide([... slider.querySelectorAll(".slider__item")])
  }
})
  • Вопрос задан
  • 109 просмотров
Решения вопроса 1
Kentavr16
@Kentavr16
long cold winter
const nextSlide = (arr) => {
    let ind = 0;
    arr.forEach((element, index) => {
        if (element.classList.contains("slider__item--active")) {
            ind = index + 1
        }
        element.classList.remove("slider__item--active")
    })
    if (ind >= arr.length) { ind = 0 }
    arr[ind].classList.add("slider__item--active")

}

document.addEventListener("click", (evt) => {
    const target = evt.target;
    const slider = target.parentNode
    if (target.classList.contains("slider__btn--next")) {
        nextSlide([...slider.querySelectorAll(".slider__item")])
    }
})


Код не работает потому что вы проводите манипуляции с arr,который в каждом клике определяется как новый - каждый раз в итоге вы перелистываете с 1 на второй элемент.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Anonymous_toaster
А он подключен?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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