@SeeYou1ater

Как следующему элементу добавлять/удалять класс?

Есть галерея выполненная с помощью слик слайдера, как при нажатии стрелок влево или вправо добавить или удалить класс слайдам (соответственно нажал вправо и следующему элементу, следующему слайду, добавился класс 'opened') в обратном направлении та же ситуация. Скинул код от которого пока что отталкиваюсь. Возникает проблема как отталкиваться от слайда, на котором я сейчас. Так же добавлю, что при клике с мышки все нормально, просто для практики захотелось добавить работу со стрелок.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="css/style.min.css">
</head>
<body>
    <div class="slider">
        <div class="slider__item">
            <img class="slider__image" src="../images/1.jpg" alt="#">
        </div>
        <div class="slider__item">
            <img class="slider__image" src="../images/2.jpg" alt="#">
        </div>
        <div class="slider__item">
            <img class="slider__image" src="../images/3.jpg" alt="#">
        </div>
        <div class="slider__item">
            <img class="slider__image" src="../images/4.jpg" alt="#">
        </div>
        <div class="slider__item">
            <img class="slider__image" src="../images/5.jpg" alt="#">
        </div>
        <div class="slider__item">
            <img class="slider__image" src="../images/6.jpg" alt="#">
        </div>
        <div class="slider__item">
            <img class="slider__image" src="../images/7.jpg" alt="#">
        </div>
        <div class="slider__item">
            <img class="slider__image" src="../images/8.jpg" alt="#">
        </div>
        <div class="slider__item">
            <img class="slider__image" src="../images/9.jpg" alt="#">
        </div>
    </div>
    <div class="slider-bg">
        <div class="slider__item">
            <img class="slider__image" src="../images/1.jpg" alt="#">
        </div>
        <div class="slider__item">
            <img class="slider__image" src="../images/2.jpg" alt="#">
        </div>
        <div class="slider__item">
            <img class="slider__image" src="../images/3.jpg" alt="#">
        </div>
        <div class="slider__item">
            <img class="slider__image" src="../images/4.jpg" alt="#">
        </div>
        <div class="slider__item">
            <img class="slider__image" src="../images/5.jpg" alt="#">
        </div>
        <div class="slider__item">
            <img class="slider__image" src="../images/6.jpg" alt="#">
        </div>
        <div class="slider__item">
            <img class="slider__image" src="../images/7.jpg" alt="#">
        </div>
        <div class="slider__item">
            <img class="slider__image" src="../images/8.jpg" alt="#">
        </div>
        <div class="slider__item">
            <img class="slider__image" src="../images/9.jpg" alt="#">
        </div>
    </div>
<script src="js/main.min.js"></script>
</body>
</html>


@import "reset.scss";
@import "slick.scss";

body {
    color: #ffffff;
    overflow: hidden;
    background-color: #000000;
}
.slider {
    z-index: 1;
    transform: rotate(15deg);
    top: 10vh;
}

.slider-bg {
    z-index: 0;
    transform: rotate(-15deg);
    top: -85vh;
    opacity: 0.15;
    filter: blur(120px) saturate(10);    
}
.slick-list {
    overflow: visible;
}

.slider__item.opened {
    z-index: 2;
    overflow: visible;
    transform: rotate(-15deg) translateX(-70%) translateY(5%);
    box-shadow: rgb(0 0 0 / .75) 0 0 0 5000px;
}

.slider-bg .slider__item{
    height: 100vh;
}
.slider__item{
    height: 75vh;
    margin: 0 20px;
    overflow: hidden;
    transition: all 0.4s;
}

.slider__image {
    height: 100%;
    width: auto;
    transition: 0.5s;
}


const removeClasses = (slide) => {
    document.querySelectorAll('.slider__item').forEach((item) => {
        item == slide ? null : item.classList.remove('opened');
});
}

document.querySelectorAll('.slider__item').forEach((item) => {
    item.addEventListener('click', (event) => {

        const currentItem = event.target.closest('.slider__item');
        currentItem.classList.toggle('opened');
        removeClasses(currentItem);
    });
});

document.querySelectorAll('.slider__item').forEach((item) => {
    item.addEventListener('keydown', (event) => {
        if (event.key === 'ArrowRight') {
        const currentItem = event.target.closest('.slider__item')
        currentItem.classList.toggle('opened')
        removeClasses(currentItem);
        }
    });
});
  • Вопрос задан
  • 263 просмотра
Решения вопроса 1
ArturMavlidov
@ArturMavlidov
Вот код, который нужно добавить/изменить уже имеющийся

let count;

document.querySelectorAll(".slider__item").forEach((item) => {
  item.addEventListener("click", (event) => {
    const currentItem = event.target.closest(".slider__item");

    count = currentItem.dataset.slickIndex; // Новая строка
    currentItem.classList.toggle("opened");
    removeClasses(currentItem);
  });
});

document.addEventListener("keydown", (e) => {
  if (count === undefined) return;

  if (e.key === 'ArrowLeft') {
    const currentSlide = document.querySelector(`[data-slick-index='${count}']`);
    const nextSlide = document.querySelector(`[data-slick-index='${+count - 1}']`);

    currentSlide.classList.remove("opened");
    nextSlide.classList.add('opened')

    count--;

  } else if (e.key === 'ArrowRight') {
      const currentSlide = document.querySelector(`[data-slick-index='${count}']`);
      const nextSlide = document.querySelector(`[data-slick-index='${+count + 1}']`);

      currentSlide.classList.remove("opened");
      nextSlide.classList.add('opened')

      count++;
  }
});


Создали переменную count, теперь при клике по какому-либо слайду в неё записывается порядковый номер кликнутого слайда. Дальше на документе лежит обработчик события keydown. В его двух условиях повторяющаяся логика, которую можно уместить в одну функцию и дальше уже вызывать с каким-либо аргументом, но у меня не вышло, потому что в сборке аргументы функции неожиданно трактуются как нечто совсем отличное от переданного аргумента.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
01 мая 2024, в 11:20
5000 руб./за проект
01 мая 2024, в 10:55
3000 руб./за проект
01 мая 2024, в 10:55
3000 руб./за проект