Slick Slider

Slick Slider — jQuery плагин, обеспечивающий большую часть стандартного функционала типичного слайдера в интерфейсе. Собрал в одном месте частые решения возникающих проблем, чтобы всегда было под рукой.

§ Инициализация слайдера

$(`.js-slider`).not(`.slick-initialized`).each(function () {
    const $this = $(this);

    $this.slick();
});

§ Скрыть слайдер до инициализации

.slick-slider {
    display: none;

    &.slick-initialized {
        display: block;
    }
}

Или по-другому, через свойство visibility:

.slick-slider {
    visibility: hidden; 

    &.slick-initialized {
        visibility: visible;
    }
}

§ Отступы между слайдами

:root {
  --slide-margin: 1.5rem;
}

.slick-list {
    margin-left: calc(-1 * var(--slide-margin));
    margin-right: calc(-1 * var(--slide-margin));
}

.slick-slide {
    margin-left: var(--slide-margin);
    margin-right: var(--slide-margin);
}

Демо на jsfiddle.

§ Слайды одинаковой высоты

.slick-track {
    display: flex;
}

.slick-slide {
    display: flex;
    height: auto;
}

§ Убрать обводку у слайдов

.slick-slide {
    outline: none;
}

§ Кастомная пагинация

Пример пагинации с тамбнейлами.

<div class="slider js-slider">
    <div class="slider__slide" data-slide-thumb="https://via.placeholder.com/100x70/000/FFF/">
        <img src="https://via.placeholder.com/600x450/" alt="" class="slider__img">
    </div>
    <div class="slider__slide" data-slide-thumb="https://via.placeholder.com/100x70/000/FFF/">
        <img src="https://via.placeholder.com/600x450/" alt="" class="slider__img">
    </div>
    <div class="slider__slide" data-slide-thumb="https://via.placeholder.com/100x70/000/FFF/">
        <img src="https://via.placeholder.com/600x450/" alt="" class="slider__img">
    </div>
</div>
{
    dots: true,
    customPaging: (slick, index) => {
        return `<button type="button" class="slider__thumb" style="background-image: url('${ $(slick.$slides[index]).data('slide-thumb') }');">${ index }</button>`;
    },
}

§ Вывод текущего и общего количества слайдов

<div class="slider js-slider">
    <div class="slider__inner js-slider-inner">
        <div class="slider__slide">
            <img src="https://via.placeholder.com/300x200" alt="" class="slider__img">
        </div>
        <div class="slider__slide">
            <img src="https://via.placeholder.com/300x200" alt="" class="slider__img">
        </div>
        <div class="slider__slide">
            <img src="https://via.placeholder.com/300x200" alt="" class="slider__img">
        </div>
        <div class="slider__slide">
            <img src="https://via.placeholder.com/300x200" alt="" class="slider__img">
        </div>
    </div>
    
    <footer class="slider__data js-slider-data"></footer>
</div>
$(`.js-slider-inner`).not(`.slick-initialized`).each(function () {
    const $this = $(this);
    const $slider = $this.closest(`.js-slider`);

    $this.on(`init reInit afterChange`, function (event, slick, currentSlide, nextSlide) {
        const i = (currentSlide ? currentSlide : 0) + 1;

        $slider.find(`.js-slider-data`).html(`${ i } / ${ slick.slideCount }`);
    });
});

Демо на jsfiddle.

§ Слайды с тенью

<div class="slider js-slider">
    <div class="slider__item">
        <img src="https://via.placeholder.com/300x200" alt="" class="slider__img">
    </div>

    <div class="slider__item">
        <img src="https://via.placeholder.com/300x200" alt="" class="slider__img">
    </div>

    <div class="slider__item">
        <img src="https://via.placeholder.com/300x200" alt="" class="slider__img">
    </div>
</div>
:root {
    --slide-margin: 3rem;
}

img {
    height: auto;
    max-width: 100%;
}

.slider {
    $self: &;
    
    display: none;
    margin-bottom: calc(-1 * var(--slide-margin));
    margin-left: calc(-1 * var(--slide-margin));
    margin-top: calc(-1 * var(--slide-margin));
    overflow: hidden;
    padding: var(--slide-margin);
    width: calc(100% + var(--slide-margin) * 2);
        
    &.slick-initialized {
        display: block;
    }
    
    &__item {
        border: 1px solid #dedede;
        margin-bottom: var(--slide-margin);
        margin-left: var(--slide-margin);
        margin-top: var(--slide-margin);
        
        &:hover {
            box-shadow: 0 0 1rem rgba(75, 105, 172, 0.5);
        }
    }

    &__img {
        width: 100%;
    }
    
    .slick-list {
        margin-left: calc(-1 * var(--slide-margin));
        overflow: visible;
    }
}

Демо на jsfiddle.

§ Баги

Баг с параметром rows

В версии 1.8.1 обнаружен баг в миницированной версии скрипта. Параметр rows не изменяется в настройках responsive. Следует использовать версию без минификации.

Проблемы внутри флекс родителя

Слайдер выполняет неправильный расчет размеров в блоке с флекс родителем. Для корректной работы родителю слайдера следует указать такие стили.

.flex-parent {
    min-height: 0;
    min-width: 0;
}