Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Один скрипт для нескольких слайдеров (https://javascript.ru/forum/events/78018-odin-skript-dlya-neskolkikh-slajjderov.html)

DVV 14.07.2019 11:09

Один скрипт для нескольких слайдеров
 
Есть несколько одинаковых слайдеров карточек на сайте
https://viacheslavdemchenko.github.io/miushi_lp/
Попытался написать один общий скрипт для них, чтобы не писать под каждый слайдер отдельный. Но что-то не так все получилось, как хотелось. Понимаю, что есть ошибка с точками и слайдерами, но не могу понять, как правильно сделать. Кроме того, на первый взгляд все слайдеры нормально отрабатывают по клику на стрелки, но если нажать, например, два клика на одном, а потом на другом, то следующий начинает отрабатывать так, как будто кликали по нему (то есть как-будто у него ужа 2 слайда пролистали и он в текущий момент листает третий). Это касается и точек.
Скрипт слайдеров https://github.com/ViacheslavDemchen...ousel-cards.js

рони 14.07.2019 14:52

DVV,
строки 4 - 11 скрипта перенесите в цикл, заменив document на item.

рони 14.07.2019 17:33

DVV,
;(function () {

    let cardLists = document.querySelectorAll('.carousel'); // Список всех списков (слайдеров) карточек


    /* ПЕРЕБОР СПИСКА ВСЕХ СПИСКОВ (СЛАЙДЕРОВ) КАРТОЧЕК */
    cardLists.forEach( (item, index) => {
    let ul = item.querySelector('.card-list'),
        cards = item.querySelectorAll('.card-item'), // Список карточек внутри каждого слайдера
        dotsLists = item.querySelectorAll('.dots__item'), // Список всех списков точек
        prev = item.querySelector('.prev'), // Кнопка назад
        next = item.querySelector('.next'), // Кнопка вперед
        cardWidth = cards[0].scrollWidth + 29, // Ширина карточки
        cardCount = 4, // Количество карточек, листаемых за один клик
        position = 0, // Текущий сдвиг влево
        activeDot = 0; // Текущая активная точка
        function setDot(num)
        {
           dotsLists[activeDot].classList.remove('dots__item--active');
           activeDot = (dotsLists.length + activeDot + num) % dotsLists.length;
           dotsLists[activeDot].classList.add('dots__item--active');
           move(activeDot)
        }

        function move(num)
        {
           num = Math.min(num * cardCount, cards.length - cardCount);
           position = -num * cardWidth;
           ul.style.marginLeft = `${position}px`;
        }


        prev.addEventListener('click', () => {
            setDot(-1)
        });


        next.addEventListener('click', () => {
            setDot(1)
        });
    });




})();

DVV 16.07.2019 19:17

Все заработало. Спасибо большое!!!)


Часовой пояс GMT +3, время: 12:27.