• Slick, как определить направление перелистывания слайдеров?

    Возникла необходимость определить листанице в slick slider. Не все так просто, как кажется.
    Поэтому дополню от себя.

    Во-первых, событие 'swipe' — срабатывает когда только свайпаешь, если используется листание стрелками, то данное событие, которое это дело удобно показывает уже использовать не получится.

    Во-вторых, событе 'edge', довольно специфично в использование и вряд ли понадобится. Подробнее можно посмотреть здесь https://stackoverflow.com/questions/31432293/slick...

    Остается 'beforeChange', есть еще 'afterChange', но оно не содержит аргумента nextSlide.
    Поэтому в своем случае остановился на 'beforeChange'.

    По аргументам currentSlide, nextSlide и опции slick.options.slidesToShow - нужно определить куда происходит пролистывание.
    Сделал это следующим образом для случая, когда пролистывается более одного элемента за раз:

    Направление листания и дельта = currentSlide — nextSlide

    Right
    0 → 4 4-0=4
    4 → 8 8-4=4
    8 → 0 0-8=-8

    Left
    0 → 8 8-0=8
    8 → 4 4-8=-4
    4 → 0 0-4=-4

    Строим функцию:

    slickBeforeChange(slick, currentSlide, nextSlide) {
            this.currentSlide = currentSlide;
            this.nextSlide = nextSlide;
            this.slidesToShow = slick.options.slidesToShow;
            this.changePagination();
        }
    
    changePagination() {
            let delta = this.nextSlide - this.currentSlide,
                position;
            if (delta > 0) {
                if (delta === this.slidesToShow) {
                    position = 'right';
                } else {
                    position = 'left';
                }
            } else {
                if (Math.abs(delta) ===this.slidesToShow) {
                    position = 'left';
                } else {
                    position = 'right';
                }
            }
            this.setDirection(position);
        }


    P.S. Универсальный вариант для разных разрещений (так как currentSlide, nextSlide будут разные). Необходимо, чтобы было загружено как минимум три пролистывания. Для вариант когда пролистывается более одного элемента за раз. Если есть вариант проще для события 'beforeChange' хотелось бы посмотреть.

    Полный код в виде класса:
    const ssDirection = $("#sliderLastDirection"); // скрытий инпут куда записываю текущее листание для последующего использования
    
    class AjaxSlider {
    
        getDirection() {
            return ssDirection.val();
        }
    
        setDirection(value) {
            ssDirection.val(value);
        }
    
        get currentSlide() {
            return parseInt(this._currentSlide, 10);
        }
    
        set currentSlide(value) {
            this._currentSlide = value;
        }
    
        get nextSlide() {
            return parseInt(this._nextSlide, 10);
        }
    
        set nextSlide(value) {
            this._nextSlide = value;
        }
    
        get slidesToShow() {
            return parseInt(this._slidesToShow, 10);
        }
    
        set slidesToShow(value) {
            this._slidesToShow = value;
        }
    
        changePagination() {
            let delta = this.nextSlide - this.currentSlide,
                position;
            if (delta > 0) {
                if (delta === this.slidesToShow) {
                    position = 'right';
                } else {
                    position = 'left';
                }
            } else {
                if (Math.abs(delta) ===this.slidesToShow) {
                    position = 'left';
                } else {
                    position = 'right';
                }
            }
            this.setDirection(position);
        }
    
        slickBeforeChange(slick, currentSlide, nextSlide) {
            this.currentSlide = currentSlide;
            this.nextSlide = nextSlide;
            this.slidesToShow = slick.options.slidesToShow;
            this.changePagination();
        }
    }
    Ответ написан
    Комментировать
  • Как придумать имя боту в телеграме?

    Еще может быть баг, что на любое имя возвращает: "Sorry, this username is already taken. Please try something different." В этом случае перезапустите создания нового бота /newbot
    Ответ написан
    Комментировать
  • Как открывать несколько окон PhpStorm с разными проектами?

    Дополню для PhpStorm 2021.3.3
    File->Settings→Appearance & Behavior →System Settings →”Project” → “Reopen projects on startup: Open project in”
    Ответ написан
    1 комментарий