Записи с меткой "Слайдер"
Slick Slider - установка, настройка и примеры
Для начала подключаем файлы стилей к проекту
<!-- Добавляем стили из CDN -->
<link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/gh/kenwheeler/slick@1.9.0/slick/slick.css"/>
<!-- Добавляем тему по умолчанию из CDN -->
<link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/gh/kenwheeler/slick@1.9.0/slick/slick-theme.css"/>
Подключаем сам плагин. Данный код должен быть в самом конце, перед закрывающим тегом <body>
<script type="text/javascript" src="//cdn.jsdelivr.net/gh/kenwheeler/slick@1.9.0/slick/slick.min.js"></script>
ПРИМЕРЫ КОДА
Одиночный слайд
//Иницилизируем слайдер с параметрами по умолчанию
$('.single-item').slick();
Несколько слайдов
//Указываем что будем выводить по 3 слайда на экран
$('.multiple-items').slick({
infinite: true,
slidesToShow: 3, // настраивается здесь - указывается количество слайдов, которое будет видно на странице, а остальные скрыты
slidesToScroll: 3
});
Адаптивный слайдер
//Настройки по выводу слайдов в зависимости от разрешения экрана
$('.responsive').slick({
dots: true,
infinite: false,
speed: 300,
slidesToShow: 4,
slidesToScroll: 4,
responsive: [ // настраивается здесь - указываются точки адаптации
{
breakpoint: 1024,
settings: {
slidesToShow: 3,
slidesToScroll: 3,
infinite: true,
dots: true
}
},
{
breakpoint: 600,
settings: {
slidesToShow: 2,
slidesToScroll: 2
}
},
{
breakpoint: 480,
settings: {
slidesToShow: 1,
slidesToScroll: 1
}
}
]
});
Различная ширина слайдов
$('.variable-width').slick({
dots: true,
infinite: true,
speed: 300,
slidesToShow: 1,
centerMode: true,
variableWidth: true // настраивается здесь - true или false (по умолчанию)
});
Различная высота слайдов
$('.one-time').slick({
dots: true,
infinite: true,
speed: 300,
slidesToShow: 1,
adaptiveHeight: true
});
Настройка с Data атрибутом
Начиная с Slick 1.5 можно добавлять настройки, используя атрибут data-slick .Нужно вызвать $(element).slick() , чтобы инициализировать Slick на элементе.
<div data-slick='{"slidesToShow": 4, "slidesToScroll": 4}'>
<div><h3>1</h3></div>
<div><h3>2</h3></div>
<div><h3>3</h3></div>
<div><h3>4</h3></div>
<div><h3>5</h3></div>
<div><h3>6</h3></div>
</div>
Режим центрирования слайда
Если используются два зависимых слайдеры, то включать режим центрирования нужно на обоих.
$('.center').slick({
centerMode: true, // настраивается здесь - true или false (по умолчанию)
centerPadding: '60px',
slidesToShow: 3,
responsive: [
{
breakpoint: 768,
settings: {
arrows: false,
centerMode: true,
centerPadding: '40px',
slidesToShow: 3
}
},
{
breakpoint: 480,
settings: {
arrows: false,
centerMode: true,
centerPadding: '40px',
slidesToShow: 1
}
}
]
});
Ленивая загрузка
// Используйте леневую загрузку устаноиви ее в data-lazy атрибудет
// В нем укажите источник к файлу в место SRC
<img data-lazy="img/lazyfonz1.png"/>
$('.lazy').slick({
lazyLoad: 'ondemand',
slidesToShow: 3,
slidesToScroll: 1
});
Автоматическая прокрутка
$('.autoplay').slick({
slidesToShow: 3,
slidesToScroll: 1,
autoplay: true,
autoplaySpeed: 2000,
});
Смена слайдов размытием Fade
$('.fade').slick({
dots: true,
infinite: true,
speed: 500,
fade: true,
cssEase: 'linear'
});
Добавление и удаление слайдов
$('.add-remove').slick({
dots: true,
slidesToShow: 3,
speed: 500,
slidesToScroll: 3
});
var slideIndex = 1;
$('.js-add-slide').on('click', function() {
slideIndex++;
$('.add-remove').slick('slickAdd','<div><h3>' + slideIndex + '</h3></div>');
});
$('.js-remove-slide').on('click', function() {
$('.add-remove').slick('slickRemove',slideIndex - 1);
if (slideIndex !== 0){
slideIndex--;
}
});
Фильтрация слайдов
$('.filtering').slick({
slidesToShow: 4,
slidesToScroll: 4
});
var filtered = false;
$('.js-filter').on('click', function(){
if (filtered === false) {
$('.filtering').slick('slickFilter',':even');
$(this).text('Unfilter Slides');
filtered = true;
} else {
$('.filtering').slick('slickUnfilter');
$(this).text('Filter Slides');
filtered = false;
}
});
Синхронизация слайдеров
$('.slider-for').slick({ // слайдер больших изображений
slidesToShow: 1,
slidesToScroll: 1,
arrows: false,
fade: true,
asNavFor: '.slider-nav'
});
$('.slider-nav').slick({ // слайдер превью
slidesToShow: 3,
slidesToScroll: 1,
asNavFor: '.slider-for',
dots: true,
centerMode: true,
focusOnSelect: true
});
Справа налево
$('.single-item-rtl').slick({
rtl: true
});
НАСТРОЙКИ
| Setting | Type | Default | Description |
|---|---|---|---|
| accessibility | boolean | true | Включает вкладки и навигацию по клавишам со стрелками |
| adaptiveHeight | boolean | false | Обеспечивает адаптивную высоту для односкатных горизонтальных каруселей. |
| autoplay | boolean | false | Включает автоигру |
| autoplaySpeed | Int (мс) | 3000 | Автоигра Скорость в миллисекундах |
| arrows | boolean | true | Предыдущая / Следующая Стрелки |
| asNavFor | string | ноль | Установите ползунок для навигации по другому ползунку (имя класса или идентификатора) |
| appendArrows | string | $(element) | Изменить место прикрепления навигационных стрелок (Selector, htmlString, Array, Element, jQuery object) |
| appendDots | string | $(element) | Изменить местоположение точек навигации (Selector, htmlString, Array, Element, object jQuery) |
| prevArrow | string (html | jQuery селектор) | объект (узел DOM | объект jQuery) | <button type = "button" class = "slick-prev"> Предыдущая </ button> | Позволяет выбрать узел или настроить HTML-код для стрелки «Назад». |
| nextArrow | string (html | jQuery селектор) | объект (узел DOM | объект jQuery) | <button type = "button" class = "slick-next"> Next </ button> | Позволяет выбрать узел или настроить HTML-код для стрелки «Далее». |
| centerMode | boolean | false | Включает центрированный вид с частичными предыдущими / следующими слайдами. Используйте с нечетным номером слайдов ToShow. |
| centerPadding | string | '50px' | Боковые отступы в центральном режиме (px или %) |
| cssEase | string | 'ease' | CSS3 Animation Easing |
| customPaging | function | n/a | Пользовательские шаблоны подкачки. Смотрите источник для примера использования. |
| dots | boolean | false | Показать точечные индикаторы |
| dotsClass | string | 'slick-dots' | Класс для контейнера точек индикатора слайда |
| draggable | boolean | true | Включить перетаскивание мышью |
| fade | boolean | false | Включить затухание |
| focusOnSelect | boolean | false | Включить фокус на выбранный элемент (нажмите) |
| easing | string | 'linear' | Добавьте ослабление для jQuery animate. Использовать с библиотеками замедления или методами по умолчанию |
| edgeFriction | integer | 0,15 | Сопротивление при смахивании краев бесконечной карусели |
| infinite | boolean | true | Бесконечный цикл скольжения |
| initialSlide | integer | 0 | Слайд, чтобы начать |
| LazyLoad | string | 'ondemand' | Установите ленивую технику загрузки. Принимает «по требованию» или «прогрессивный» |
| mobileFirst | boolean | false | Адаптивные настройки используют мобильный первый расчет |
| pauseOnFocus | boolean | true | Пауза автозапуска на фокусе |
| pauseOnHover | boolean | true | Пауза автозапуска при наведении |
| pauseOnDotsHover | boolean | false | Приостановка автозапуска при наведении точки |
| respondTo | string | 'window' | Ширина, на которую реагирует реагирующий объект. Может быть «окно», «слайдер» или «мин» (меньшее из двух) |
| responsive | object | none | Объект, содержащий точки останова и объекты настроек (см. Демонстрацию). Включает настройки для заданной ширины экрана. Установите настройки «unlick» вместо объекта, чтобы отключить slick в заданной точке останова. |
| rows | int | 1 | Установка более 1 инициализирует режим сетки. Используйте slidesPerRow, чтобы установить, сколько слайдов должно быть в каждой строке. |
| slide | element | '' | Элемент запроса для использования в качестве слайда |
| slidesPerRow | int | 1 | С режимом сетки, инициализированным с помощью опции строк, это устанавливает, сколько слайдов в каждой строке сетки. Дверь |
| slidesToShow | int | 1 | Количество слайдов для показа |
| slidesToScroll | int | 1 | Количество слайдов для прокрутки |
| speed | Int (мс) | 300 | Скорость анимации скольжения / затухания |
| swipe | boolean | true | Включить смахивание |
| swipeToSlide | boolean | false | Разрешить пользователям перетаскивать или проводить пальцем прямо к слайду независимо от слайдов ToScroll |
| TouchMove | boolean | true | Включить движение слайдов одним касанием |
| touchThreshold | int | 5 | Для продвижения слайдов пользователь должен провести пальцем по длине (1 / touchThreshold) * ширина слайдера |
| useCSS | boolean | true | Включить / отключить CSS-переходы |
| useTransform | boolean | true | Включить / отключить CSS-преобразования |
| variableWidth | boolean | false | Слайды переменной ширины |
| вертикальный | boolean | false | Режим вертикального скольжения |
| verticalSwiping | boolean | false | Режим вертикальной прокрутки |
| rtl | boolean | false | Измените направление ползунка, чтобы стать справа налево |
| waitForAnimate | boolean | true | Игнорирует запросы на продвижение слайда во время анимации |
| zIndex | number | 1000 | Установите значения zIndex для слайдов, полезно для IE9 и ниже |
События
| Событие | Аргументы | Описание |
|---|---|---|
| afterChange | slick, currentSlide | Пожары после смены слайдов |
| beforeChange | slick, текущий слайд, следующий слайд | Пожары перед сменой слайдов |
| breakpoint | событие, slick, точка останова | Пожары после достижения точки останова. |
| destroy | событие, slick | Когда слайдер уничтожен или не скользит. |
| edge | slick, направление | Запускается, когда ребро прокручивается в бесконечном режиме. |
| init | slick | Срабатывает после первой инициализации. |
| reInit | slick | Срабатывает после каждой повторной инициализации |
| SetPosition | slick | Пожары после изменения положения / размера |
| swipe | slick, направление | Пожары после удара / перетаскивания |
| lazyLoaded | событие, slick, изображение, imageSource | Срабатывает после загрузки изображения лениво |
| lazyLoadError | событие, slick, изображение, imageSource | Срабатывает после того, как изображение не загружается |
Методы
| Метод | Аргументы | Описание |
|---|---|---|
| slickCurrentSlide | none | Возвращает текущий индекс слайда |
| slickGoTo | int: номер слайда, логическое значение: не анимировать | Переходит к слайду по индексу |
| slickNext | none | Переходит к следующему слайду |
| slickPrev | none | Переходит к предыдущему слайду |
| slickPause | none | Паузы автовоспроизведения |
| slickPlay | none | Запускает автозапуск |
| slickAdd | HTML или DOM объект, индекс, addBefore | объект |
| slickRemove | index, removeBefore | Если для removeBefore задано значение false, удалите указатель, следующий за слайдом, или последний слайд, если индекс не установлен. |
| slickFilter | Селектор или функция | Фильтрует слайды, используя jQuery .filter () |
| slickUnfilter | index | Удаляет примененную фильтрацию |
| slickGetOption | опция: string | Получает индивидуальное значение параметра. |
| slickSetOption | опция: string, значение: зависит от опции, refresh: логическое значение | Установите для параметра true значение true, если это обновление пользовательского интерфейса. |
| unslick | none | Разрушает slick |
| getSlick | none | Получить гладкий объект |
JavaScript / jQuery
* SLICK SLIDER 1.9.0 slick.min.js
*
Стили CSS
.slick-slider
{
position: relative;
box-sizing: border-box;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-khtml-user-select: none;
-ms-touch-action: pan-y;
touch-action: pan-y;
-webkit-tap-highlight-color: transparent;
}
{
position: relative;
overflow: hidden;
padding: 0;
}
.slick-list:focus
{
outline: none;
}
.slick-list.dragging
{
cursor: pointer;
cursor: hand;
}
.slick-slider .slick-list
{
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
-o-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
{
position: relative;
top: 0;
left: 0;
margin-left: auto;
margin-right: auto;
}
.slick-track:before,
.slick-track:after
{
display: table;
}
.slick-track:after
{
clear: both;
}
.slick-loading .slick-track
{
visibility: hidden;
}
{
display: none;
float: left;
min-height: 1px;
}
[dir='rtl'] .slick-slide
{
float: right;
}
.slick-slide img
{
display: block;
}
.slick-slide.slick-loading img
{
display: none;
}
.slick-slide.dragging img
{
pointer-events: none;
}
.slick-initialized .slick-slide
{
display: block;
}
.slick-loading .slick-slide
{
visibility: hidden;
}
.slick-vertical .slick-slide
{
display: block;
}
.slick-arrow.slick-hidden {
display: none;
}
position: relative;
display: block;
box-sizing: border-box;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-ms-touch-action: pan-y;
touch-action: pan-y;
-webkit-tap-highlight-color: transparent;
}
.slick-list {
position: relative;
overflow: hidden;
display: block;
margin: 0;
padding: 0;
outline: none;
}
cursor: pointer;
cursor: hand;
}
}
.slick-slider .slick-track,
.slick-slider .slick-list {
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
-o-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
position: relative;
left: 0;
top: 0;
display: block;
margin-left: auto;
margin-right: auto;
&:after {
content: "";
display: table;
}
clear: both;
}
visibility: hidden;
}
}
.slick-slide {
float: left;
height: 100%;
min-height: 1px;
[dir="rtl"] & {
float: right;
}
img {
display: block;
}
&.slick-loading img {
display: none;
}
pointer-events: none;
}
display: block;
}
visibility: hidden;
}
display: block;
height: auto;
border: 1px solid transparent;
}
}
.slick-arrow.slick-hidden {
display: none;
}
/* Slider */
.slick-loading .slick-list
{
background: #fff url('./ajax-loader.gif') center center no-repeat;
}
@font-face
{
font-family: 'slick';
font-weight: normal;
font-style: normal;
font-display: swap;
src: url('./fonts/slick.eot?#iefix') format('embedded-opentype'), url('./fonts/slick.woff') format('woff'), url('./fonts/slick.ttf') format('truetype'), url('./fonts/slick.svg#slick') format('svg');
}
/* Arrows */
.slick-prev,
.slick-next
{
font-size: 0;
line-height: 0;
top: 50%;
height: 20px;
padding: 0;
-webkit-transform: translate(0, -50%);
-ms-transform: translate(0, -50%);
transform: translate(0, -50%);
border: none;
outline: none;
background: transparent;
}
.slick-prev:hover,
.slick-prev:focus,
.slick-next:hover,
.slick-next:focus
{
color: transparent;
outline: none;
background: transparent;
}
.slick-prev:hover:before,
.slick-prev:focus:before,
.slick-next:hover:before,
.slick-next:focus:before
{
opacity: 1;
}
.slick-prev.slick-disabled:before,
.slick-next.slick-disabled:before
{
opacity: .25;
}
.slick-next:before
{
font-family: 'slick';
font-size: 20px;
line-height: 1;
color: white;
-moz-osx-font-smoothing: grayscale;
}
{
left: -25px;
}
[dir='rtl'] .slick-prev
{
right: -25px;
left: auto;
}
.slick-prev:before
{
content: '←';
}
[dir='rtl'] .slick-prev:before
{
content: '→';
}
{
right: -25px;
}
[dir='rtl'] .slick-next
{
right: auto;
left: -25px;
}
.slick-next:before
{
content: '→';
}
[dir='rtl'] .slick-next:before
{
content: '←';
}
.slick-dotted.slick-slider
{
margin-bottom: 30px;
}
{
position: absolute;
bottom: -25px;
padding: 0;
margin: 0;
}
.slick-dots li
{
position: relative;
height: 20px;
margin: 0 5px;
padding: 0;
}
.slick-dots li button
{
font-size: 0;
line-height: 0;
height: 20px;
padding: 5px;
border: 0;
outline: none;
background: transparent;
}
.slick-dots li button:hover,
.slick-dots li button:focus
{
outline: none;
}
.slick-dots li button:hover:before,
.slick-dots li button:focus:before
{
opacity: 1;
}
.slick-dots li button:before
{
font-family: 'slick';
font-size: 6px;
line-height: 20px;
top: 0;
left: 0;
height: 20px;
text-align: center;
color: black;
-moz-osx-font-smoothing: grayscale;
}
.slick-dots li.slick-active button:before
{
opacity: .75;
color: black;
}
// "\2190" outputs ascii character "←"
// "\2192" outputs ascii character "→"
// "\2022" outputs ascii character "•"
$slick-font-family: "slick" !default;
$slick-loader-path: "./" !default;
$slick-arrow-color: white !default;
$slick-dot-color: black !default;
$slick-dot-color-active: $slick-dot-color !default;
$slick-prev-character: "\2190" !default;
$slick-next-character: "\2192" !default;
$slick-dot-character: "\2022" !default;
$slick-dot-size: 6px !default;
$slick-opacity-default: 0.75 !default;
$slick-opacity-on-hover: 1 !default;
$slick-opacity-not-active: 0.25 !default;
@if function-exists(image-url) {
@return image-url($url);
}
@else {
@return url($slick-loader-path + $url);
}
}
@if function-exists(font-url) {
@return font-url($url);
}
@else {
@return url($slick-font-path + $url);
}
}
.slick-loading & {
background: #fff slick-image-url("ajax-loader.gif") center center no-repeat;
}
}
@if $slick-font-family == "slick" {
@font-face {
font-family: "slick";
src: slick-font-url("slick.eot");
src: slick-font-url("slick.eot?#iefix") format("embedded-opentype"), slick-font-url("slick.woff") format("woff"), slick-font-url("slick.ttf") format("truetype"), slick-font-url("slick.svg#slick") format("svg");
font-weight: normal;
font-style: normal;
}
}
.slick-next {
position: absolute;
display: block;
height: 20px;
width: 20px;
line-height: 0px;
font-size: 0px;
cursor: pointer;
background: transparent;
color: transparent;
top: 50%;
-webkit-transform: translate(0, -50%);
-ms-transform: translate(0, -50%);
transform: translate(0, -50%);
padding: 0;
border: none;
outline: none;
&:hover, &:focus {
outline: none;
background: transparent;
color: transparent;
&:before {
opacity: $slick-opacity-on-hover;
}
}
&.slick-disabled:before {
opacity: $slick-opacity-not-active;
}
&:before {
font-family: $slick-font-family;
font-size: 20px;
line-height: 1;
color: $slick-arrow-color;
opacity: $slick-opacity-default;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
}
left: -25px;
[dir="rtl"] & {
left: auto;
right: -25px;
}
&:before {
content: $slick-prev-character;
[dir="rtl"] & {
content: $slick-next-character;
}
}
}
right: -25px;
[dir="rtl"] & {
left: -25px;
right: auto;
}
&:before {
content: $slick-next-character;
[dir="rtl"] & {
content: $slick-prev-character;
}
}
}
margin-bottom: 30px;
}
position: absolute;
bottom: -25px;
list-style: none;
display: block;
text-align: center;
padding: 0;
margin: 0;
width: 100%;
li {
position: relative;
display: inline-block;
height: 20px;
width: 20px;
margin: 0 5px;
padding: 0;
cursor: pointer;
button {
border: 0;
background: transparent;
display: block;
height: 20px;
width: 20px;
outline: none;
line-height: 0px;
font-size: 0px;
color: transparent;
padding: 5px;
cursor: pointer;
&:hover, &:focus {
outline: none;
&:before {
opacity: $slick-opacity-on-hover;
}
}
&:before {
position: absolute;
top: 0;
left: 0;
content: $slick-dot-character;
width: 20px;
height: 20px;
font-family: $slick-font-family;
font-size: $slick-dot-size;
line-height: 20px;
text-align: center;
color: $slick-dot-color;
opacity: $slick-opacity-not-active;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
}
&.slick-active button:before {
color: $slick-dot-color-active;
opacity: $slick-opacity-default;
}
}
}
Slick Slider в модальном окне Bootstrap
Чтобы решить эту проблему добавляем небольшой код на jQuery, который инициализирует Slick Slider в момент открытия модального окна и наоборот, отменит инициализацию после закрытия окна.
$('#modal').on('shown.bs.modal', function() { // запускаем модальное окно
$('#modal .slick-slider').not('.slick-initialized').slick(); // если slick slider не инициализирован, то делаем это
$('#modal .slick-slider').slick('refresh');
});
$('#modal').on('hidden.bs.modal', function() { // закрываем модальное окно
$('#modal .slick-slider').slick('unslick').empty(); // после закрытия модального окна отменяем инициализацию slick slider
});
Swiper API
Полный HTML-макет Swiper
<!-- Slider main container -->
<div class="swiper">
<!-- Additional required wrapper -->
<div class="swiper-wrapper">
<!-- Slides -->
<div class="swiper-slide">Slide 1</div>
<div class="swiper-slide">Slide 2</div>
<div class="swiper-slide">Slide 3</div>
...
</div>
<!-- If we need pagination -->
<div class="swiper-pagination"></div>
<!-- If we need navigation buttons -->
<div class="swiper-button-prev"></div>
<div class="swiper-button-next"></div>
<!-- If we need scrollbar -->
<div class="swiper-scrollbar"></div>
</div>
Стили
Пакет Swiper содержит различные наборы стилей CSS, Less и SCSS:
Стили CSS
Стили CSS для версии пакета:
swiper-bundle.css— все стили Swiper, включая стили всех модулей (например, навигации, постраничной навигации и т. д.)swiper-bundle.min.css- такой же, как предыдущий, но уменьшенный
Стили CSS для версии пакета (импорт пакета):
swiper/css— все стили Swiper, включая стили всех модулей (например, навигации, постраничной навигации и т. д.)swiper/css/bundle- такой же, как предыдущий, но уменьшенный
Стили CSS для базовой версии и модулей (импорт пакетов):
swiper/css- только основные стили Swiperswiper/css/a11y- стили, необходимые для модуля A11yswiper/css/autoplay- стили, необходимые для модуля автозапускаswiper/css/controller- стили, необходимые для модуля контроллераswiper/css/effect-cards- стили, необходимые для модуля Cards Effectswiper/css/effect-coverflow- стили, необходимые для модуля Coverflow Effectswiper/css/effect-creative- стили, необходимые для модуля Creative Effectswiper/css/effect-cube- стили, необходимые для модуля Cube Effectswiper/css/effect-fade- стили, необходимые для модуля эффекта затуханияswiper/css/effect-flip- стили, необходимые для модуля Flip Effectswiper/css/free-mode- стили, необходимые для модуля свободного режимаswiper/css/grid- стили, необходимые для модуля Gridswiper/css/hash-navigation- стили, необходимые для модуля навигации по хэшуswiper/css/history- стили, необходимые для модуля Историиswiper/css/keyboard- стили, необходимые для модуля клавиатурыswiper/css/manipulation- стили, необходимые для модуля манипулированияswiper/css/mousewheel- стили, необходимые для модуля Mousewheelswiper/css/navigation- стили, необходимые для навигационного модуляswiper/css/pagination- стили, необходимые для модуля разбивки на страницыswiper/css/parallax- стили, необходимые для модуля Parallaxswiper/css/scrollbar- стили, необходимые для модуля полосы прокруткиswiper/css/thumbs- стили, необходимые для модуля Thumbsswiper/css/virtual- стили, необходимые для виртуального модуляswiper/css/zoom- стили, необходимые для модуля масштабирования
Меньше стилей
Меньшие стили - это отдельные стили для базовой версии и модулей (импорт пакетов):
swiper/less- только основные стили Swiperswiper/less/bundle— все стили Swiper, включая стили всех модулей (например, навигации, постраничной навигации и т. д.)swiper/less/a11y- стили, необходимые для модуля A11yswiper/less/autoplay- стили, необходимые для модуля автозапускаswiper/less/controller- стили, необходимые для модуля контроллераswiper/less/effect-cards- стили, необходимые для модуля Cards Effectswiper/less/effect-coverflow- стили, необходимые для модуля Coverflow Effectswiper/less/effect-creative- стили, необходимые для модуля Creative Effectswiper/less/effect-cube- стили, необходимые для модуля Cube Effectswiper/less/effect-fade- стили, необходимые для модуля эффекта затуханияswiper/less/effect-flip- стили, необходимые для модуля Flip Effectswiper/less/free-mode- стили, необходимые для модуля свободного режимаswiper/less/grid- стили, необходимые для модуля Gridswiper/less/hash-navigation- стили, необходимые для модуля навигации по хэшуswiper/less/history- стили, необходимые для модуля Историиswiper/less/keyboard- стили, необходимые для модуля клавиатурыswiper/less/manipulation- стили, необходимые для модуля манипулированияswiper/less/mousewheel- стили, необходимые для модуля Mousewheelswiper/less/navigation- стили, необходимые для навигационного модуляswiper/less/pagination- стили, необходимые для модуля разбивки на страницыswiper/less/parallax- стили, необходимые для модуля Parallaxswiper/less/scrollbar- стили, необходимые для модуля полосы прокруткиswiper/less/thumbs- стили, необходимые для модуля Thumbsswiper/less/virtual- стили, необходимые для виртуального модуляswiper/less/zoom- стили, необходимые для модуля масштабирования
Стили SCSS
Стили SCSS также являются отдельными стилями для основной версии и модулей (импортируемых пакетов):
swiper/scss- только основные стили Swiperswiper/scss/bundle— все стили Swiper, включая стили всех модулей (например, навигации, постраничной навигации и т. д.)swiper/scss/a11y- стили, необходимые для модуля A11yswiper/scss/autoplay- стили, необходимые для модуля автозапускаswiper/scss/controller- стили, необходимые для модуля контроллераswiper/scss/effect-cards- стили, необходимые для модуля Cards Effectswiper/scss/effect-coverflow- стили, необходимые для модуля Coverflow Effectswiper/scss/effect-creative- стили, необходимые для модуля Creative Effectswiper/scss/effect-cube- стили, необходимые для модуля Cube Effectswiper/scss/effect-fade- стили, необходимые для модуля эффекта затуханияswiper/scss/effect-flip- стили, необходимые для модуля Flip Effectswiper/scss/free-mode- стили, необходимые для модуля свободного режимаswiper/scss/grid- стили, необходимые для модуля Gridswiper/scss/hash-navigation- стили, необходимые для модуля навигации по хэшуswiper/scss/history- стили, необходимые для модуля Историиswiper/scss/keyboard- стили, необходимые для модуля клавиатурыswiper/scss/manipulation- стили, необходимые для модуля манипулированияswiper/scss/mousewheel- стили, необходимые для модуля Mousewheelswiper/scss/navigation- стили, необходимые для навигационного модуляswiper/scss/pagination- стили, необходимые для модуля разбивки на страницыswiper/scss/parallax- стили, необходимые для модуля Parallaxswiper/scss/scrollbar- стили, необходимые для модуля полосы прокруткиswiper/scss/thumbs- стили, необходимые для модуля Thumbsswiper/scss/virtual- стили, необходимые для виртуального модуляswiper/scss/zoom- стили, необходимые для модуля масштабирования
Инициализировать Swiper
Теперь, когда у нас есть HTML-код Swiper, нам нужно инициализировать его с помощью следующей функции:
новый Swiper (swiperContainer, параметры) - инициализирует swiper с помощью опций
- swiperContainer — HTMLElement или строка (с CSS-селектором) HTML-элемента контейнера свипера. Обязательно.
- параметры - объект - объект с параметрами Swiper. Необязательно.
- Метод возвращает инициализированный экземпляр Swiper
Например:
const swiper = new Swiper('.swiper', {
speed: 400,
spaceBetween: 100,
});
Послеинициализации Swiper можно получить доступ к экземпляру Swiper в его HTMLElement. Этоswiperсвойство HTML-элемента контейнера Swiper:
const swiper = document.querySelector('.swiper').swiper;
// Now you can use all slider methods like
swiper.slideNext();
Параметры
Давайте посмотрим на список всех доступных параметров:
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
| a11y | Любой |
Объект с параметрами a11y или логический
|
|
| allowSlideNext | логическое значение | верно |
Установите значение |
| allowSlidePrev | логическое значение | верно |
Установите значение |
| Разрешить касание | логическое значение | верно |
Если |
| Автоматический рост | логическое значение | ложь |
Задайте значение |
| автоматическое воспроизведение | Любой |
Объект с параметрами автозапуска или логическим значением
|
|
| точки останова | объект |
Позволяет задавать разные параметры для разных точек останова (размеров экрана). Не все параметры можно изменить в точках останова, только те, которые не требуют другого макета и логики, например
|
|
| База контрольных точек | «контейнер»|«окно» | "окно" |
База для точек останова (бета-версия). Может быть |
| Эффект карты | Любой |
Объект с картами-параметры эффекта
|
|
| Центрирующие оползни | логическое значение | ложь |
Если этот параметр включен, слайды центрируются, если количество слайдов меньше |
| центрироВанные оползни | логическое значение | ложь |
Если |
| Центрированные скользящие границы | логическое значение | ложь |
Если |
| containerModifierClass | строка | "swiper-" |
Начало CSS-класса модификатора, который можно добавить в контейнер Swiper в зависимости от различных параметров |
| контроллер | Любой |
Объект с параметрами контроллера или логическим значением
|
|
| Эффект coverflowEffect | Любой |
Объект с параметрами эффекта Coverflow.
|
|
| createElements | логическое значение | ложь |
При включении Swiper автоматически обернет слайды элементом swiper-wrapper и создаст необходимые элементы для навигации, разбивки на страницы и полосы прокрутки, если они включены (с соответствующим объектом параметров или с логическим значением |
| Творческий эффект | Любой |
Объект с параметрами креативного эффекта
|
|
| cssMode | логическое значение | ложь |
При включении он будет использовать современный CSS Scroll Snap API. Он поддерживает не все функции Swiper, но потенциально может значительно повысить производительность в простых конфигурациях. Это то, что не поддерживается, когда оно включено:
Если вы используете его с другими эффектами, особенно с 3D-эффектами, необходимо обернуть содержимое слайда элементом
|
| Эффект куба | Любой |
Объект с параметрами кубического эффекта
|
|
| направление | «по горизонтали»|«по вертикали» | "горизонтальный" |
Может быть |
| Обнаружение кромки | строка|логическое значение | ложь |
Включите события Swiper для работы с возвратом свайпом в приложении. Если установлено значение |
| edgeSwipeThreshold | номер | 20 |
Область (в пикселях) от левого края экрана для отпускания сенсорных событий при свайпе назад в приложении |
| эффект | строка | "слайд" |
Эффект перехода. Может быть |
| включен | логическое значение | верно |
Независимо от того, был ли Swiper изначально включен. Если Swiper отключен, он скроет все элементы навигации и не будет реагировать на какие-либо события и взаимодействия |
| eventsPrefix | строка | `swiper` |
Префикс имени события для всех событий DOM, генерируемых элементом Swiper (веб-компонентом) |
| Эффект затухания | Любой |
Объект с параметрами эффекта затухания
|
|
| flipEffect | Любой |
Объект с параметрами эффекта переворота
|
|
| Фокусируемые элементы | строка | «ввод, выбор, опция, текстовое поле, кнопка, видео, метка» |
Селектор CSS для элементов, на которые можно навести курсор. Свайпинг будет отключен для таких элементов, если они «наведены» |
| followFinger | логическое значение | верно |
Если функция отключена, то ползунок будет анимироваться только при отпускании, он не будет двигаться, пока вы удерживаете на нём палец |
| Бесплатный режим | Любой |
Включает функции бесплатного режима. Объект с параметрами бесплатного режима или логическое значение
|
|
| grabCursor | логическое значение | ложь |
Эта опция может немного улучшить удобство использования Swiper на компьютере. Если |
| сетка | Любой |
Объект с параметрами сетки для включения ползунка «многострочный».
|
|
| Хэшнавигация | Любой |
Включает навигацию по хэш-ссылкам для слайдов. Объект с параметрами хэш-навигации или логическое значение
|
|
| высота | нулевой|номер | null |
Высота Swiper (в пикселях). Параметр позволяет задать высоту Swiper. Полезно только в том случае, если вы инициализируете Swiper, когда он скрыт, а также в средах SSR и Test для правильной инициализации Swiper
|
| история | Любой |
Включает функцию сохранения состояния истории, при которой у каждого слайда будет свой URL-адрес. В этом параметре необходимо указать URL-адрес основного слайда, например Объект с параметрами навигации по истории или логическим значением
|
|
| инициализация | логическое значение | верно |
Следует ли инициализировать Swiper автоматически при создании экземпляра. Если эта функция отключена, то вам нужно инициализировать Swiper вручную, вызвав |
| initialSlide | номер | 0 |
Порядковый номер начального слайда. |
| Инжектные стили | строка[] |
Внедрите стили текста в теневой DOM. Только для использования с элементом Swiper |
|
| injectStylesUrls | строка[] |
Внедрите стили |
|
| клавиатура | Любой |
Позволяет перемещаться по слайдам с помощью клавиатуры. Объект с параметрами клавиатуры или логическое значение
|
|
| lazyPreloadPrevNext | номер | 0 |
Количество следующих и предыдущих слайдов для предварительной загрузки. Применимо только при использовании отложенной загрузки. |
| Класс lazyPreloaderClass | строка | "swiper-ленивый предварительный загрузчик" |
Имя CSS-класса ленивого предварительного загрузчика |
| Длинные наконечники | логическое значение | верно |
Установите значение |
| longSwipesMs | номер | 300 |
Минимальная продолжительность (в миллисекундах) для перехода к следующему/предыдущему слайду при длительном смахивании |
| Стратегия длинных свайпов | номер | 0.5 |
Соотношение для перехода к следующему / предыдущему слайду при длительном пролистывании |
| цикл | логическое значение | ложь |
Установите значение Из-за особенностей работы режима цикла (он меняет порядок слайдов) общее количество слайдов должно быть:
|
| loopAddBlankSlides | логическое значение | верно |
Автоматически добавляет пустые слайды, если вы используете сетку или |
| loopAdditionalSlides | номер | 0 |
Позволяет увеличить количество закольцованных слайдов |
| loopPreventsSliding | логическое значение | верно |
Если эта функция включена, то кнопки «Далее» и «Назад» не будут работать, пока слайдер анимируется в режиме цикла |
| maxBackfaceHiddenSlides | номер | 10 |
Если общее количество слайдов меньше указанного здесь значения, то Swiper включит
|
| модули | любой[] |
Массив с модулями Swiper
|
|
| колесо мыши | Любой |
Позволяет перемещаться по слайдам с помощью колёсика мыши. Объект с параметрами колёсика мыши или логическое значение
|
|
| навигация | Любой |
Объект с параметрами навигации или логическим значением
|
|
| вложенный | логическое значение | ложь |
Установите |
| Промывка носа | логическое значение | верно |
Включать / отключать прокрутку элементов, соответствующих классу, указанному в |
| noSwipingClass | строка | "swiper-без пролистывания" |
Укажите |
| noSwipingSelector | строка |
Может использоваться вместо |
|
| normalizeSlideIndex | логическое значение | верно |
Нормализует индекс слайда. |
| Наблюдаем за родителями | логическое значение | ложь |
Установите значение |
| Наблюдает за детьми | логическое значение | ложь |
Установите значение |
| наблюдатель | логическое значение | ложь |
Задайте значение |
| вкл . | объект |
Регистрация обработчиков событий |
|
| На любом | функция(обработчик) |
Добавьте прослушиватель событий, который будет запускаться при всех событиях
|
|
| oneWayMovement | логическое значение | ложь |
Если эта функция включена, слайды будут прокручиваться только вперёд (в одну сторону) независимо от направления прокрутки |
| разбивка на страницы | Любой |
Объект с параметрами разбивки на страницы или логическим значением
|
|
| параллакс | Любой |
Объект с параметрами параллакса или boolean
|
|
| Пассивные прослушиватели | логическое значение | верно |
По умолчанию для повышения производительности прокрутки на мобильных устройствах будут использоваться пассивные слушатели событий. Но если вам нужно использовать |
| Предотвращение щелчков | логическое значение | верно |
Установите значение |
| Предотвращение распространения Clicksprop | логическое значение | верно |
Установите значение |
| Предотвращение взаимодействия при переходе | логическое значение | ложь |
Если эта функция включена, она не позволит менять слайды с помощью свайпа или кнопок навигации/пагинации во время перехода |
| сопротивление | логическое значение | верно |
Установите значение |
| Сопротивление | номер | 0.85 |
Эта опция позволяет вам контролировать коэффициент сопротивления |
| Сервер изменения размера | логическое значение | верно |
Если эта функция включена, она будет использовать ResizeObserver (если поддерживается браузером) для контейнера Swiper, чтобы определять изменение размера контейнера (вместо отслеживания изменения размера окна) |
| перемотка назад | логическое значение | ложь |
Установите значение
|
| Длина круга | логическое значение | ложь |
Задайте |
| runCallbacksOnInit | логическое значение | верно |
При инициализации свипера запускаются события Transition/SlideChange/Start/End. Такие события будут запускаться при инициализации, если ваш initialSlide не равен 0 или вы используете режим цикла |
| полоса прокрутки | Любой |
Объект с параметрами полосы прокрутки или логическим значением
|
|
| setWrapperSize | логическое значение | ложь |
Если вы включите эту опцию, плагин установит ширину/высоту оболочки Swiper, равную общему размеру всех слайдов. В основном эту опцию следует использовать в качестве запасного варианта совместимости для браузеров, которые плохо поддерживают макет flexbox |
| Короткие замахи | логическое значение | верно |
Установите значение |
| simulateTouch | логическое значение | верно |
Если |
| slideActiveClass | строка | "swiper-slide-активный" |
Имя CSS-класса текущего активного слайда
|
| slideBlankClass | строка | "swiper-slide-пустой" |
Имя CSS-класса пустого слайда, добавляемого в режиме цикла (при включении
|
| slideClass | строка | "swiper-слайд" |
Имя CSS-класса слайда
|
| slideFullyVisibleClass | строка | "swiper-слайд-полностью-виден" |
Имя CSS-класса для полностью (когда весь слайд находится в области просмотра) видимого слайда
|
| slideNextClass | строка | "swiper-slide-next" |
Имя CSS-класса слайда, которое находится сразу после текущего активного слайда
|
| slidePrevClass | строка | 'swiper-slide-предыдущий' |
CSS-класс slide, который находится прямо перед текущим активным слайдом
|
| slideToClickedSlide | логическое значение | ложь |
Установите значение |
| slideVisibleClass | строка | "видимый слайд swiper" |
Имя CSS-класса текущего / частично видимого слайда
|
| slidesoffset после | номер | 0 |
Добавьте (в пикселях) дополнительное смещение слайда в конце контейнера (после всех слайдов) |
| slidesOffsetBefore | номер | 0 |
Добавьте (в пикселях) дополнительное смещение слайда в начале контейнера (перед всеми слайдами) |
| slidesPerGroup | номер | 1 |
Задайте количество слайдов для определения и включения группового скольжения. Полезно использовать с slidesPerView > 1 |
| slidesPerGroupAuto | логическое значение | ложь |
Этот параметр предназначен для использования только с |
| slidesPerGroupSkip | номер | 0 |
Параметр работает следующим образом: Если Если |
| Просмотр слайдов | номер|"авто" | 1 |
Количество слайдов на один просмотр (количество слайдов, одновременно отображаемых в контейнере слайдера).
|
| Расстояние между | строка|номер | 0 |
Расстояние между слайдами в пикселях.
|
| Скорость | номер | 300 |
Продолжительность перехода между слайдами (в мс) |
| Манипулятор прокрутки | Любой | null |
Строка с CSS-селектором или HTML-элементом контейнера с разбивкой на страницы, которая будет работать как единственный доступный обработчик для прокрутки |
| swiperElementNodeName | строка | "SWIPER-КОНТЕЙНЕР" |
Имя узла элемента swiper; используется для определения рендеринга веб-компонента |
| пороговое значение | номер | 5 |
Пороговое значение в пикселях. Если «расстояние касания» будет меньше этого значения, то свиппер не будет перемещаться |
| большие пальцы | Любой |
Объект с параметрами компонента thumbs
|
|
| Touchangle'а | номер | 45 |
Допустимый угол (в градусах) для запуска сенсорного перемещения |
| touchEventsTarget | 'контейнер'|'обёртка' | "оболочка" |
Целевой элемент для прослушивания событий касания. Может быть |
| touchMoveStopPropagation | логическое значение | ложь |
Если эта функция включена, то распространение события «касание» будет остановлено |
| Сенсорное управЛение | номер | 1 |
Коэффициент соприкосновения |
| touchReleaseOnEdges | логическое значение | ложь |
Включите отработку событий касания в крайних положениях ползунка (начало, конец), чтобы обеспечить дальнейшую прокрутку страницы. Эта функция работает только с событиями касания (а не с событиями указателя), поэтому она будет работать на устройствах iOS/Android и не будет работать на устройствах Windows с событиями указателя. Также |
| touchStartForcePreventDefault | логическое значение | ложь |
Принудительно всегда предотвращать событие по умолчанию для |
| touchStartPreventDefault | логическое значение | верно |
Если он отключен, |
| Уникальные возможности | логическое значение | верно |
Если включено (по умолчанию) и параметры элементов навигации передаются в виде строки (например, |
| Обновите размер окна | логическое значение | верно |
Swiper будет пересчитывать положение слайдов при изменении размера окна (ориентации) |
| url | нулевая|строка | null |
Требуется для активного обнаружения слайдов при рендеринге на стороне сервера и включенной истории |
| Пользовательский агент | нулевая|строка | null |
строка userAgent. Требуется для определения браузера/устройства при рендеринге на стороне сервера |
| виртуальный | Любой |
Включает функцию виртуальных слайдов. Объект с параметрами виртуальных слайдов или логическое значение
|
|
| Виртуальный перевод | логическое значение | ложь |
Если вы включите эту опцию, слайдер будет работать как обычно, за исключением того, что он не будет перемещаться, а значения реального перемещения на обёртке не будут заданы. Полезно, если вам нужно создать собственный переход слайдов |
| watchOverflow | логическое значение | верно |
При включении Swiper будет отключён и скроет кнопки навигации, если для скольжения недостаточно слайдов. |
| watchSlidesProgress | логическое значение | ложь |
Включите эту функцию, чтобы рассчитать прогресс и видимость каждого слайда (слайды в области просмотра будут иметь дополнительный класс видимости) |
| ширина | нулевой|номер | null |
Ширина Swiper (в пикселях). Параметр позволяет задать ширину Swiper. Полезно только в том случае, если вы инициализируете Swiper, когда он скрыт, а также в средах SSR и Test для правильной инициализации Swiper
|
| КЛАСС -оболочка | строка | "swiper-оболочка" |
Имя CSS-класса оболочки слайдов
|
| масштабирование | Любой |
Включает функцию масштабирования. Объект с параметрами масштабирования или логическое значение
|
Методы и свойства
После инициализации Slider мы получаем его инициализированный экземпляр в переменной (например, переменнаяswiperв приведённом выше примере) с полезными методами и свойствами:
Мероприятия
Swiper содержит множество полезных событий, которые вы можете прослушать. События можно назначать двумя способами:
-
Использование
onпараметра при инициализации swiper:const swiper = new Swiper('.swiper', { // ... on: { init: function () { console.log('swiper initialized'); }, }, }); -
Использование
onметода после инициализации swiper.const swiper = new Swiper('.swiper', { // ... }); swiper.on('slideChange', function () { console.log('slide changed'); });
thisключевое слово в обработчике событий всегда указывает на экземпляр Swiper| Имя | Аргументы | Описание |
|---|---|---|
| activeIndexChange | (swiper) |
Событие будет срабатывать при активном изменении индекса |
| afterInit | (swiper) |
Событие будет запущено сразу после инициализации |
| beforeDestroy | (swiper) |
Событие будет запущено непосредственно перед уничтожением Swiper |
| Перед запуском | (swiper) |
Событие будет запущено непосредственно перед инициализацией |
| beforeLoopFix | (swiper) |
Событие будет запущено непосредственно перед "исправлением цикла" |
| Перед обработкой | (swiper) |
Событие будет запущено перед обработчиком изменения размера |
| beforeSlideChangeStart | (swiper) |
Событие будет запущено до начала перехода к смене слайда |
| Перед началом перехода | (swiper, скорость, внутренний) |
Событие будет запущено до начала перехода |
| точка останова | (swiper, параметры точки останова) |
Событие будет запущено при изменении точки останова |
| Измененное направление | (swiper) |
Событие будет запущено при изменении направления |
| нажмите | (swiper, событие) |
Событие будет запущено, когда пользователь нажмёт/коснётся Swiper. Получает |
| уничтожить | (swiper) |
Событие будет запущено при уничтожении swiper |
| Двойной щелчок | (swiper, событие) |
Событие будет запущено, когда пользователь дважды щелкнет по Swiper |
| Двойной щелчок | (swiper, событие) |
Событие будет запущено, когда пользователь дважды коснётся контейнера Swiper. Получает |
| fromEdge | (swiper) |
Событие будет запущено, когда Swiper перейдет из начальной или конечной позиции |
| инициализация | (swiper) |
Сработал сразу после инициализации Swiper.
|
| блокировка | (swiper) |
Событие будет запущено, когда swiper заблокирован (когда |
| Исправление цикла | (swiper) |
Событие будет запущено после "исправления цикла" |
| Мгновенный скачок | (swiper) |
Событие будет запущено при отскоке импульса |
| Обновление наблюдения | (swiper) |
Событие будет запущено, если observer включен и он обнаруживает мутации DOM |
| изменение ориентации | (swiper) |
Событие будет запущено при изменении ориентации (например, альбомная -> портретная) |
| прогресс | (swiper, прогресс) |
Событие будет запущено при изменении прогресса Swiper. В качестве аргументов оно получает прогресс, который всегда находится в диапазоне от 0 до 1 |
| Начало работы | (swiper) |
Событие будет запущено, когда Swiper достигнет своего начала (начальной позиции) |
| reachEnd | (swiper) |
Событие будет запущено, когда Swiper достигнет последнего слайда |
| Реальный обмен данными | (swiper) |
Событие будет запущено при реальном изменении индекса |
| изменение размера | (swiper) |
Событие будет запущено при изменении размера окна непосредственно перед обработкой Swiper onresize |
| setTransition | (swiper, переход) |
Событие будет срабатывать каждый раз, когда свиппер запускает анимацию. Получает в качестве аргумента текущую продолжительность перехода (в миллисекундах) |
| setTranslate | (swiper, перевести) |
Событие будет запущено, когда обёртка Swiper изменит своё положение. Получает текущее значение перевода в качестве аргумента |
| Изменение слайдов | (swiper) |
Событие будет запущено при изменении текущего активного слайда |
| slideChangeTransitionEnd | (swiper) |
Событие будет запущено после анимации другого слайда (следующего или предыдущего). |
| slideChangeTransitionStart | (swiper) |
Событие будет запущено в начале перехода на другой слайд (следующий или предыдущий). |
| slideNextTransitionEnd | (swiper) |
То же, что и «slideChangeTransitionEnd», но только для направления «вперёд» |
| slideNextTransitionStart | (swiper) |
То же, что и «slideChangeTransitionStart», но только для направления «вперёд» |
| slidePrevTransitionEnd | (swiper) |
То же, что и «slideChangeTransitionEnd», но только для «обратного» направления |
| slidePrevTransitionStart | (swiper) |
То же, что и «slideChangeTransitionStart», но только в направлении «назад» |
| slideResetTransitionEnd | (swiper) |
Событие будет запущено в конце анимации при переходе на следующий слайд |
| slideResetTransitionStart | (swiper) |
Событие будет запущено в начале анимации перехода на текущий слайд |
| sliderFirstMove | (swiper, событие) |
Событие будет запущено при первом касании / перетаскивании |
| sliderMove | (swiper, событие) |
Событие будет запущено, когда пользователь коснётся Swiper и проведёт по нему пальцем. Получает |
| slidesGridLengthChange | (swiper) |
Событие будет запущено при изменении сетки слайдов |
| Изменение длины слайда | (swiper) |
Событие будет запущено при изменении количества слайдов |
| Обновлено слайд-шоу | (swiper) |
Событие будет запущено после того, как слайды и их размеры будут рассчитаны и обновлены |
| snapGridLengthChange | (swiper) |
Событие будет запущено при изменении привязки сетки |
| snapIndexChange | (swiper) |
Событие будет запущено при изменении индекса привязки |
| нажмите | (swiper, событие) |
Событие будет запущено, когда пользователь нажмёт/коснётся Swiper. Получает |
| toEdge | (swiper) |
Событие будет запущено, когда Swiper перейдет в начальную или конечную позицию |
| touchEnd | (swiper, событие) |
Событие будет запущено, когда пользователь отпустит Swiper. Получает |
| touchMove | (swiper, событие) |
Событие будет запущено, когда пользователь коснётся Swiper и проведёт по нему пальцем. Получает |
| touchMoveOpposite | (swiper, событие) |
Событие будет запущено, когда пользователь коснётся Swiper и проведёт пальцем в направлении, противоположном параметру направления. Получает |
| Сенсорный запуск | (swiper, событие) |
Событие будет запущено, когда пользователь коснётся Swiper. Получает |
| Завершение перехода | (swiper) |
Событие будет запущено после перехода. |
| Начало перехода | (swiper) |
Событие будет запущено в начале перехода. |
| разблокировать | (swiper) |
Событие будет запущено, когда swiper будет разблокирован (когда |
| Обновить | (swiper) |
Событие будет запущено после вызова swiper.update() |
Модули
Параметры навигации
Методы навигации
Навигационные события
Пользовательские свойства CSS Навигации
{
--swiper-navigation-size: 44px;
--swiper-navigation-top-offset: 50%;
--swiper-navigation-sides-offset: 10px;
--swiper-navigation-color: var(--swiper-theme-color);
}
Параметры разбивки на страницы
Методы разбивки на страницы
События разбивки на страницы
Пользовательские свойства CSS Разбиения на страницы
{
--swiper-pagination-color: var(--swiper-theme-color);
--swiper-pagination-left: auto;
--swiper-pagination-right: 8px;
--swiper-pagination-bottom: 8px;
--swiper-pagination-top: auto;
--swiper-pagination-fraction-color: inherit;
--swiper-pagination-progressbar-bg-color: rgba(0, 0, 0, 0.25);
--swiper-pagination-progressbar-size: 4px;
--swiper-pagination-bullet-size: 8px;
--swiper-pagination-bullet-width: 8px;
--swiper-pagination-bullet-height: 8px;
--swiper-pagination-bullet-inactive-color: #000;
--swiper-pagination-bullet-inactive-opacity: 0.2;
--swiper-pagination-bullet-opacity: 1;
--swiper-pagination-bullet-horizontal-gap: 4px;
--swiper-pagination-bullet-vertical-gap: 6px;
}
Параметры полосы прокрутки
Методы полосы прокрутки
События полосы прокрутки
Пользовательские свойства CSS полосы прокрутки
{
--swiper-scrollbar-border-radius: 10px;
--swiper-scrollbar-top: auto;
--swiper-scrollbar-bottom: 4px;
--swiper-scrollbar-left: auto;
--swiper-scrollbar-right: 4px;
--swiper-scrollbar-sides-offset: 1%;
--swiper-scrollbar-bg-color: rgba(0, 0, 0, 0.1);
--swiper-scrollbar-drag-bg-color: rgba(0, 0, 0, 0.5);
--swiper-scrollbar-size: 4px;
}
Параметры автозапуска
Методы автозапуска
Автоматическое воспроизведение событий
Параметры свободного режима
Параметры сетки
Модуль манипуляций добавляет полезные методы Swiper для управления слайдами. Его имеет смысл использовать только с версией Swiper Core, он не предназначен для использования с Swiper React или Vue.
Методы манипулирования
Swiper поддерживает эффекты перехода с эффектом параллакса для вложенных элементов swiper/slides. Поддерживаются два типа элементов с эффектом параллакса:
- Прямые дочерние элементы
swiper. Эффект параллакса для таких элементов будет зависеть от общего положения ползунка. Полезно для параллакс-фонов - Вложенные элементы слайдов. Эффект параллакса для таких элементов будет зависеть от хода слайда
Чтобы включить эффект параллакса, необходимо инициализировать Swiper с помощью переданного параметраparallax:trueи добавить один из следующих (или их сочетание) атрибутов к нужным элементам:
data-swiper-parallax- включить преобразование-перевод параллаксного перехода. Этот атрибут может принимать:number- значение в пикселях (как для заголовка, подзаголовка в примере выше) для перемещения элемента в зависимости от прогресса. В этом случае такой элемент будет перемещён на ± это значение в пикселях в зависимости от положения слайда (следующий или предыдущий)percentage- (как для «параллакс-фона») для перемещения элемента в зависимости от прогресса и его размера. В этом случае такой элемент будет перемещён на ± этот процент от его размера (ширины в горизонтальном направлении и высоты в вертикальном направлении) в зависимости от положения слайда (следующий или предыдущий). Таким образом, если ширина элемента составляет 400 пикселей, а вы указали data-swiper-parallax = «50%», то он будет перемещён на ± 200 пикселей
data-swiper-parallax-xто же самое, но для направления по оси xdata-swiper-parallax-yто же самое, но для направления по оси ydata-swiper-parallax-scale— коэффициент масштабирования элемента параллакса, когда он находится в «неактивном» (не на активном слайде) состоянииdata-swiper-parallax-opacity— непрозрачность элемента параллакса, когда он находится в «неактивном» (не на активном слайде) состоянииdata-swiper-parallax-duration- настраиваемая продолжительность перехода для элементов parallax
<div class="swiper">
<!-- Parallax background element -->
<div
class="parallax-bg"
style="background-image:url(path/to/image.jpg)"
data-swiper-parallax="-23%"
></div>
<div class="swiper-wrapper">
<div class="swiper-slide">
<!-- Each slide has parallax title -->
<div class="title" data-swiper-parallax="-100">Slide 1</div>
<!-- Parallax subtitle -->
<div class="subtitle" data-swiper-parallax="-200">Subtitle</div>
<!-- And parallax text with custom transition duration -->
<div
class="text"
data-swiper-parallax="-300"
data-swiper-parallax-duration="600"
>
<p>Lorem ipsum dolor sit amet, ...</p>
</div>
<!-- Opacity parallax -->
<div data-swiper-parallax-opacity="0.5">I will change opacity</div>
<!-- Scale parallax -->
<div data-swiper-parallax-scale="0.15">I will change scale</div>
</div>
...
</div>
</div>
Параметры Параллакса
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
| включен | логическое значение | ложь |
Включите, если вы хотите использовать «параллаксовые» элементы внутри слайдера |
Начиная с версии 9 у Swiper нет специального API для отложенной загрузки, так как он полагается на встроенную функцию отложенной загрузки браузера. Чтобы использовать отложенную загрузку, нам нужно просто установитьloading="lazy"для изображений и добавить элемент предварительной загрузки:
<div class="swiper">
<div class="swiper-wrapper">
<!-- Lazy image -->
<div class="swiper-slide">
<img src="path/to/picture-1.jpg" loading="lazy" />
<div class="swiper-lazy-preloader"></div>
</div>
<!-- Lazy image with srcset -->
<div class="swiper-slide">
<img
src="path/to/logo-small.png"
srcset="path/to/logo-large.png 2x"
loading="lazy"
/>
<div class="swiper-lazy-preloader"></div>
</div>
</div>
</div>
Как вы видите:
- Ленивое изображение должно иметь
loading="lazy"атрибут - Добавьте на слайд анимированный индикатор загрузки, который будет удалён автоматически после загрузки изображения:
<div class="swiper-lazy-preloader"></div>
Или белый для темного макета:
<div class="swiper-lazy-preloader swiper-lazy-preloader-white"></div>
Чтобы это сработало, убедитесь, что параметрeffectустановлен на'fade'
crossFadeследует заменить наtrue, чтобы не видеть содержимое позади или под ним.Параметры эффекта затухания
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
| Перекрестное затухание | логическое значение | ложь |
Позволяет слайдам перекрестно исчезать |
Чтобы это сработало, убедитесь, что параметрeffectустановлен на'coverflow'
Параметры эффекта Coverflow
Чтобы это сработало, убедитесь, что параметрeffectустановлен на'flip'
Параметры эффекта переворота
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
| Ограничение скорости | логическое значение | верно |
Ограничение вращения краевых слайдов |
| Тени для слайдов | логическое значение | верно |
Позволяет создавать тени на слайдах |
Чтобы это сработало, убедитесь, что параметрeffectустановлен на'cube'
Параметры эффекта куба
Чтобы это сработало, убедитесь, что параметрeffectустановлен на'cards'
Параметры эффекта карт
Чтобы это сработало, убедитесь, что параметрeffectустановлен на'creative'
Параметры креативного эффекта
В дополнение к компонентуControllerSwiper поставляется с компонентом Thumbs, который предназначен для более корректной работы с дополнительным свайпером Thumbs, чем компонент Controller, используемый для синхронизации двух свайперов.
Параметры Thumbs
Методы Thumbs
| Свойства | ||
|---|---|---|
| swiper.swiper | Любой |
Swiper экземпляр thumbs swiper |
| Методы | ||
| swiper.init() |
Инициализировать большие пальцы |
|
| swiper.обновление (начальное) |
Обновите thumbs |
|
Swiper поддерживает функцию масштабирования изображений (аналогичную той, что вы видите в iOS при просмотре одной фотографии), когда вы можете увеличить изображение с помощью жеста сжатия или уменьшить/увеличить его двойным нажатием. В этом случае требуется дополнительная настройка:
<div class="swiper">
<div class="swiper-wrapper">
<div class="swiper-slide">
<div class="swiper-zoom-container">
<img src="path/to/image1.jpg" />
</div>
</div>
<div class="swiper-slide">
<div class="swiper-zoom-container">
<img src="path/to/image2.jpg" />
</div>
</div>
<div class="swiper-slide">Plain slide with text</div>
<div class="swiper-slide">
<!-- Override maxRatio parameter -->
<div class="swiper-zoom-container" data-swiper-zoom="5">
<img src="path/to/image1.jpg" />
</div>
</div>
</div>
</div>
- Все изображения, которые можно увеличивать, должны быть заключены в элемент div с классом
swiper-zoom-container. - По умолчанию предполагается, что вы увеличиваете масштаб одного из элементов
img,pictureилиcanvas. Если вы хотите увеличить масштаб какого-то другого пользовательского элемента, просто добавьте к нему классswiper-zoom-target. Например:<div class="swiper"> <div class="swiper-wrapper"> <div class="swiper-slide"> <div class="swiper-zoom-container"> <!-- custom zoomable element --> <div class="swiper-zoom-target" style="background-image: url(...)" ></div> </div> </div> </div> </div> - Вы можете переопределить параметр
maxRatioдля конкретных слайдов, используя атрибутdata-swiper-zoomв контейнере масштабирования.
Параметры масштабирования
Методы масштабирования
Масштабирование событий
| Имя | Аргументы | Описание |
|---|---|---|
| Изменение масштаба | (swiper, масштабирование, imageEl, slideEl) |
Событие будет запущено при изменении масштаба |
Параметры управления клавиатурой
Методы управления клавиатурой
| Свойства | ||
|---|---|---|
| swiper.включен | логическое значение |
Включено ли управление с клавиатуры |
| Методы | ||
| swiper.отключить() |
Отключить управление с клавиатуры |
|
| swiper.enable() |
Включить управление с клавиатуры |
|
События клавиатуры
| Имя | Аргументы | Описание |
|---|---|---|
| Нажатие клавиши | (swiper, ключевой код) |
Событие будет запущено при нажатии клавиши |
Параметры управления колесиком мыши
Методы управления колесиком мыши
| Свойства | ||
|---|---|---|
| swiper.включен | логическое значение |
Включено ли управление колесиком мыши |
| Методы | ||
| swiper.отключить() |
Отключить управление колесиком мыши |
|
| swiper.enable() |
Включить управление колесиком мыши |
|
События Колеса мыши
Модуль «Виртуальные слайды» позволяет хранить в DOM только необходимое количество слайдов. Это очень полезно с точки зрения производительности и проблем с памятью, если у вас много слайдов, особенно слайдов с тяжёлым деревом DOM или изображениями.
slidesPerView: 'auto'Параметры виртуальных слайдов
Методы виртуальных слайдов
Виртуальные слайды Dom
Начиная с версии 9, виртуальные слайды Swiper могут работать со слайдами, изначально отображаемыми в DOM. При инициализации они удаляются из DOM, кэша, а затем повторно используются те, которые необходимы:
<div class="swiper">
<div class="swiper-wrapper">
<div class="swiper-slide">Slide 1</div>
<div class="swiper-slide">Slide 2</div>
...
<div class="swiper-slide">Slide 100</div>
</div>
</div>
<script>
const swiper = new Swiper('.swiper', {
virtual: {
enabled: true,
},
});
</script>
Хэш-навигация предназначена для создания ссылки на конкретный слайд, которая позволяет загрузить страницу с открытым конкретным слайдом.
Чтобы это работало, вам нужно включить его, передав параметрhashNavigation:trueи добавив хэши слайдов в атрибутdata-hash:
<div class="swiper">
<div class="swiper-wrapper">
<div class="swiper-slide" data-hash="slide1">Slide 1</div>
<div class="swiper-slide" data-hash="slide2">Slide 2</div>
<div class="swiper-slide" data-hash="slide3">Slide 3</div>
<div class="swiper-slide" data-hash="slide4">Slide 4</div>
<div class="swiper-slide" data-hash="slide5">Slide 5</div>
...
</div>
</div>
const swiper = new Swiper('.swiper', {
//enable hash navigation
hashNavigation: true,
});
Параметры хэш-навигации
Хэширование событий Навигации
| Имя | Аргументы | Описание |
|---|---|---|
| Хэш-обмен | (swiper) |
Событие будет запущено при изменении хэша окна |
| Набор хэшей | (swiper) |
Событие будет запущено, когда swiper обновит хэш |
История Параметров навигации
Параметры контроллера
Методы контроллера
| Свойства | ||
|---|---|---|
| swiper.control | Любой |
Передайте сюда другой экземпляр Swiper или массив с экземплярами Swiper, которыми должен управлять этот Swiper |
Параметры доступности
Пользовательская сборка
У вас есть два варианта создания пользовательской версии Swiper.
Использование модулей JS
Если вы используете в своём проекте сборщик с поддержкой модулей JS, вы можете импортировать только те модули, которые вам нужны:
// Import Swiper and modules
import Swiper from 'swiper';
import { Navigation, Pagination, Scrollbar } from 'swiper/modules';
// Now you can use Swiper
const swiper = new Swiper('.swiper', {
// Install modules
modules: [Navigation, Pagination, Scrollbar],
speed: 500,
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
// ...
});
Экспортируются следующие модули:
Virtual- Модуль виртуальных слайдовKeyboard- Модуль управления клавиатуройMousewheel- Модуль управления колесиком мышиNavigation- Навигационный модульPagination- Модуль разбиения на страницыScrollbar- Модуль полосы прокруткиParallax- Модуль ПараллаксаFreeMode- Модуль Свободного режимаGrid- Модуль сеткиManipulation- Модуль управления слайдами (только для базовой версии)Zoom- Модуль масштабированияController- Модуль контроллераA11y- Модуль специальных возможностейHistory- Модуль навигации по историиHashNavigation- Модуль навигации по хэшуAutoplay- Модуль автозапускаEffectFade- Модуль эффекта затуханияEffectCube- Модуль эффекта кубаEffectFlip- Модуль эффекта переворотаEffectCoverflow- Модуль эффекта CoverflowEffectCards- Модуль эффектов картEffectCreative- Модуль создания креативных эффектовThumbs- Модуль Thumbs
Использование скрипта сборки
Swiper поставляется с конструктором gulp, который позволяет создавать пользовательские версии библиотек, включающие только необходимые модули. Нам нужно следующее:
-
Загрузите и распакуйтерепозиторий Swiper GitHubв локальную папку
-
Установить Node.js (если не установлен)
-
Теперь нам нужно установить необходимые зависимости. Перейдите в папку с загруженным и распакованным репозиторием Swiper и выполните в терминале:
$ npm install -
Открыть
scripts/build-config.jsфайл:module.exports = { // remove modules you don't need modules: [ 'virtual', 'keyboard', 'mousewheel', 'navigation', 'pagination', 'scrollbar', 'parallax', 'zoom', 'controller', 'a11y', 'history', 'hash-navigation', 'autoplay', 'thumbs', 'free-mode', 'grid', 'manipulation', 'effect-fade', 'effect-cube', 'effect-flip', 'effect-coverflow', 'effect-creative', 'effect-cards', ], }; -
Теперь мы готовы создать пользовательскую версию Swiper:
$ npm run build:prod -
Вот и всё. Сгенерированные файлы CSS и JS и их сжатые версии будут доступны в папке
dist/
Определения TypeScript
Swiper полностью типизирован, он экспортируетSwiperиSwiperOptionsтипы:
// main.ts
import Swiper from 'swiper';
import { SwiperOptions } from 'swiper/types';
const swiperParams: SwiperOptions = {
slidesPerView: 3,
spaceBetween: 50,
};
const swiper = new Swiper('.swiper', swiperParams);
Вы также можете просмотреть автоматически сгенерированныеопределения TypeScriptдля всех типов, параметров, свойств и методов.
Карточка услуги с вертикальным слайдером на основе Swiper

XSL
<?xml version="1.0" encoding="utf-8"?>
JavaScript / jQuery
* Swiper 9.0.2
* Most modern mobile touch slider and framework with hardware accelerated transitions
* https://swiperjs.com
*
* Copyright 2014-2023 Vladimir Kharlampidi
*
* Released under the MIT License
*
* Released on: February 3, 2023
*/
//# sourceMappingURL=swiper-bundle.min.js.map
Стили CSS
* Swiper 8.4.4
* Most modern mobile touch slider and framework with hardware accelerated transitions
* https://swiperjs.com
*
* Copyright 2014-2022 Vladimir Kharlampidi
*
* Released under the MIT License
*
* Released on: October 12, 2022
*/
Слайдер для карточки товара slick slider
<script type="text/javascript" src="//code.jquery.com/jquery-3.5.1.min.js"></script>Плагин Slick Slider
<link rel="stylesheet" type="text/css" href="slick/slick.css"/><link rel="stylesheet" type="text/css" href="slick/slick-theme.css"/><link rel="stylesheet" type="text/css" href="slick/slick-theme.css"/>Плагин FancyBox
<link rel="stylesheet" href="/fancybox/jquery.fancybox-1.3.4.css" type="text/css" media="screen" /><script type="text/javascript" src="/fancybox/jquery.easing-1.4.pack.js"></script>Механизм работы галереи
<div class="main-slider">
<div>Контент слайда 1 </div>
<div>Контент слайда 2 </div>
…
<div>Контент слайда 3 </div>
</div>
<div class="thumb-slider">
<div>Контент слайда 1 </div>
<div>Контент слайда 2 </div>
…
<div>Контент слайда 3 </div>
</div>
$('.main-slider').slick({
infinite: true,
slidesToShow: 1,
slidesToScroll: 1,
initialSlide: 1,
arrows: true,
nextArrow: '<span class="arrow-next"></span>',
prevArrow: '<span class="arrow-prev"></span>',
asNavFor: '.thumb-slider'
});
$('.thumb-slider').slick({
infinite: true,
slidesToShow: 3,
slidesToScroll: 1,
arrows: false,
focusOnSelect: false,
asNavFor: '.main-slider',
responsive: [
{
breakpoint: 768,
settings: {
swipe: true
}
}
]
});
Слайдер для сайта Owl Carousel 2
Установка
Чтобы начать работу с owl, следует загрузить следующие CSS файлы в свой проект: owl.carousel.min.css и owl.theme.default.min.css. Файл owl.carousel.css обязателен и должен быть подключен перед любыми другими *.js файлами.
<link rel="stylesheet" href="css/owl.carousel.min.css">
<link rel="stylesheet" href="css/owl.theme.default.min.css">
Если не подключена jQuery, то добавьте с помощью CDN, например или скачайте и подключите owl.carousel.min.js
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="js/owl.carousel.min.js"></script>
Разметка HTML
<div class="owl-carousel owl-theme" id="slider">
<!--Слайд 1-->
<div class="slide" style="background-image: url('slide-1.jpg')">
<h2 class="slide__title">Заголовок слайда</h2>
<a href="#" class="slide__link">Кнопка</a>
</div>
<!--Остальные слайды-->
...
</div>
Вызов плагина (без настроек)
$(document).ready(function(){
$("#slider").owlCarousel();
});
Owl Carousel 2 имеет дополнительные опции, которые помогут вам кастомизировать ваш слайдер. Давайте разберем самые популярные из них:
Вот несколько примеров того, как можно кастомизировать слайдер.
$(document).ready(function(){
const slider = $("#slider").owlCarousel({
loop:true,
margin:10,
nav:true,
responsive:{
0:{
items:1
},
600:{
items:3
},
1000:{
items:5
}
}
});
});
$(document).ready(function(){
const slider = $("#slider").owlCarousel({
center: true,
items:2,
loop:false,
margin:10,
responsive:{
600:{
items:4
}
}
});
});
JavaScript / jQuery . owl.carousel.min.js
/**
* Owl Carousel v2.3.4
* Copyright 2013-2018 David Deutsch
* Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE
*/
!function(a,b,c,d){function e(b,c){this.settings=null,this.options=a.extend({},e.Defaults,c),this.$element=a(b),this._handlers={},this._plugins={},this._supress={},this._current=null,this._speed=null,this._coordinates=[],this._breakpoint=null,this._width=null,this._items=[],this._clones=[],this._mergers=[],this._widths=[],this._invalidated={},this._pipe=[],this._drag={time:null,target:null,pointer:null,stage:{start:null,current:null},direction:null},this._states={current:{},tags:{initializing:["busy"],animating:["busy"],dragging:["interacting"]}},a.each(["onResize","onThrottledResize"],a.proxy(function(b,c){this._handlers[c]=a.proxy(this[c],this)},this)),a.each(e.Plugins,a.proxy(function(a,b){this._plugins[a.charAt(0).toLowerCase()+a.slice(1)]=new b(this)},this)),a.each(e.Workers,a.proxy(function(b,c){this._pipe.push({filter:c.filter,run:a.proxy(c.run,this)})},this)),this.setup(),this.initialize()}e.Defaults={items:3,loop:!1,center:!1,rewind:!1,checkVisibility:!0,mouseDrag:!0,touchDrag:!0,pullDrag:!0,freeDrag:!1,margin:0,stagePadding:0,merge:!1,mergeFit:!0,autoWidth:!1,startPosition:0,rtl:!1,smartSpeed:250,fluidSpeed:!1,dragEndSpeed:!1,responsive:{},responsiveRefreshRate:200,responsiveBaseElement:b,fallbackEasing:"swing",slideTransition:"",info:!1,nestedItemSelector:!1,itemElement:"div",stageElement:"div",refreshClass:"owl-refresh",loadedClass:"owl-loaded",loadingClass:"owl-loading",rtlClass:"owl-rtl",responsiveClass:"owl-responsive",dragClass:"owl-drag",itemClass:"owl-item",stageClass:"owl-stage",stageOuterClass:"owl-stage-outer",grabClass:"owl-grab"},e.Width={Default:"default",Inner:"inner",Outer:"outer"},e.Type={Event:"event",State:"state"},e.Plugins={},e.Workers=[{filter:["width","settings"],run:function(){this._width=this.$element.width()}},{filter:["width","items","settings"],run:function(a){a.current=this._items&&this._items[this.relative(this._current)]}},{filter:["items","settings"],run:function(){this.$stage.children(".cloned").remove()}},{filter:["width","items","settings"],run:function(a){var b=this.settings.margin||"",c=!this.settings.autoWidth,d=this.settings.rtl,e={width:"auto","margin-left":d?b:"","margin-right":d?"":b};!c&&this.$stage.children().css(e),a.css=e}},{filter:["width","items","settings"],run:function(a){var b=(this.width()/this.settings.items).toFixed(3)-this.settings.margin,c=null,d=this._items.length,e=!this.settings.autoWidth,f=[];for(a.items={merge:!1,width:b};d--;)c=this._mergers[d],c=this.settings.mergeFit&&Math.min(c,this.settings.items)||c,a.items.merge=c>1||a.items.merge,f[d]=e?b*c:this._items[d].width();this._widths=f}},{filter:["items","settings"],run:function(){var b=[],c=this._items,d=this.settings,e=Math.max(2*d.items,4),f=2*Math.ceil(c.length/2),g=d.loop&&c.length?d.rewind?e:Math.max(e,f):0,h="",i="";for(g/=2;g>0;)b.push(this.normalize(b.length/2,!0)),h+=c[b[b.length-1]][0].outerHTML,b.push(this.normalize(c.length-1-(b.length-1)/2,!0)),i=c[b[b.length-1]][0].outerHTML+i,g-=1;this._clones=b,a(h).addClass("cloned").appendTo(this.$stage),a(i).addClass("cloned").prependTo(this.$stage)}},{filter:["width","items","settings"],run:function(){for(var a=this.settings.rtl?1:-1,b=this._clones.length+this._items.length,c=-1,d=0,e=0,f=[];++c<b;)d=f[c-1]||0,e=this._widths[this.relative(c)]+this.settings.margin,f.push(d+e*a);this._coordinates=f}},{filter:["width","items","settings"],run:function(){var a=this.settings.stagePadding,b=this._coordinates,c={width:Math.ceil(Math.abs(b[b.length-1]))+2*a,"padding-left":a||"","padding-right":a||""};this.$stage.css(c)}},{filter:["width","items","settings"],run:function(a){var b=this._coordinates.length,c=!this.settings.autoWidth,d=this.$stage.children();if(c&&a.items.merge)for(;b--;)a.css.width=this._widths[this.relative(b)],d.eq(b).css(a.css);else c&&(a.css.width=a.items.width,d.css(a.css))}},{filter:["items"],run:function(){this._coordinates.length<1&&this.$stage.removeAttr("style")}},{filter:["width","items","settings"],run:function(a){a.current=a.current?this.$stage.children().index(a.current):0,a.current=Math.max(this.minimum(),Math.min(this.maximum(),a.current)),this.reset(a.current)}},{filter:["position"],run:function(){this.animate(this.coordinates(this._current))}},{filter:["width","position","items","settings"],run:function(){var a,b,c,d,e=this.settings.rtl?1:-1,f=2*this.settings.stagePadding,g=this.coordinates(this.current())+f,h=g+this.width()*e,i=[];for(c=0,d=this._coordinates.length;c<d;c++)a=this._coordinates[c-1]||0,b=Math.abs(this._coordinates[c])+f*e,(this.op(a,"<=",g)&&this.op(a,">",h)||this.op(b,"<",g)&&this.op(b,">",h))&&i.push(c);this.$stage.children(".active").removeClass("active"),this.$stage.children(":eq("+i.join("), :eq(")+")").addClass("active"),this.$stage.children(".center").removeClass("center"),this.settings.center&&this.$stage.children().eq(this.current()).addClass("center")}}],e.prototype.initializeStage=function(){this.$stage=this.$element.find("."+this.settings.stageClass),this.$stage.length||(this.$element.addClass(this.options.loadingClass),this.$stage=a("<"+this.settings.stageElement+">",{class:this.settings.stageClass}).wrap(a("<div/>",{class:this.settings.stageOuterClass})),this.$element.append(this.$stage.parent()))},e.prototype.initializeItems=function(){var b=this.$element.find(".owl-item");if(b.length)return this._items=b.get().map(function(b){return a(b)}),this._mergers=this._items.map(function(){return 1}),void this.refresh();this.replace(this.$element.children().not(this.$stage.parent())),this.isVisible()?this.refresh():this.invalidate("width"),this.$element.removeClass(this.options.loadingClass).addClass(this.options.loadedClass)},e.prototype.initialize=function(){if(this.enter("initializing"),this.trigger("initialize"),this.$element.toggleClass(this.settings.rtlClass,this.settings.rtl),this.settings.autoWidth&&!this.is("pre-loading")){var a,b,c;a=this.$element.find("img"),b=this.settings.nestedItemSelector?"."+this.settings.nestedItemSelector:d,c=this.$element.children(b).width(),a.length&&c<=0&&this.preloadAutoWidthImages(a)}this.initializeStage(),this.initializeItems(),this.registerEventHandlers(),this.leave("initializing"),this.trigger("initialized")},e.prototype.isVisible=function(){return!this.settings.checkVisibility||this.$element.is(":visible")},e.prototype.setup=function(){var b=this.viewport(),c=this.options.responsive,d=-1,e=null;c?(a.each(c,function(a){a<=b&&a>d&&(d=Number(a))}),e=a.extend({},this.options,c[d]),"function"==typeof e.stagePadding&&(e.stagePadding=e.stagePadding()),delete e.responsive,e.responsiveClass&&this.$element.attr("class",this.$element.attr("class").replace(new RegExp("("+this.options.responsiveClass+"-)\\S+\\s","g"),"$1"+d))):e=a.extend({},this.options),this.trigger("change",{property:{name:"settings",value:e}}),this._breakpoint=d,this.settings=e,this.invalidate("settings"),this.trigger("changed",{property:{name:"settings",value:this.settings}})},e.prototype.optionsLogic=function(){this.settings.autoWidth&&(this.settings.stagePadding=!1,this.settings.merge=!1)},e.prototype.prepare=function(b){var c=this.trigger("prepare",{content:b});return c.data||(c.data=a("<"+this.settings.itemElement+"/>").addClass(this.options.itemClass).append(b)),this.trigger("prepared",{content:c.data}),c.data},e.prototype.update=function(){for(var b=0,c=this._pipe.length,d=a.proxy(function(a){return this[a]},this._invalidated),e={};b<c;)(this._invalidated.all||a.grep(this._pipe[b].filter,d).length>0)&&this._pipe[b].run(e),b++;this._invalidated={},!this.is("valid")&&this.enter("valid")},e.prototype.width=function(a){switch(a=a||e.Width.Default){case e.Width.Inner:case e.Width.Outer:return this._width;default:return this._width-2*this.settings.stagePadding+this.settings.margin}},e.prototype.refresh=function(){this.enter("refreshing"),this.trigger("refresh"),this.setup(),this.optionsLogic(),this.$element.addClass(this.options.refreshClass),this.update(),this.$element.removeClass(this.options.refreshClass),this.leave("refreshing"),this.trigger("refreshed")},e.prototype.onThrottledResize=function(){b.clearTimeout(this.resizeTimer),this.resizeTimer=b.setTimeout(this._handlers.onResize,this.settings.responsiveRefreshRate)},e.prototype.onResize=function(){return!!this._items.length&&(this._width!==this.$element.width()&&(!!this.isVisible()&&(this.enter("resizing"),this.trigger("resize").isDefaultPrevented()?(this.leave("resizing"),!1):(this.invalidate("width"),this.refresh(),this.leave("resizing"),void this.trigger("resized")))))},e.prototype.registerEventHandlers=function(){a.support.transition&&this.$stage.on(a.support.transition.end+".owl.core",a.proxy(this.onTransitionEnd,this)),!1!==this.settings.responsive&&this.on(b,"resize",this._handlers.onThrottledResize),this.settings.mouseDrag&&(this.$element.addClass(this.options.dragClass),this.$stage.on("mousedown.owl.core",a.proxy(this.onDragStart,this)),this.$stage.on("dragstart.owl.core selectstart.owl.core",function(){return!1})),this.settings.touchDrag&&(this.$stage.on("touchstart.owl.core",a.proxy(this.onDragStart,this)),this.$stage.on("touchcancel.owl.core",a.proxy(this.onDragEnd,this)))},e.prototype.onDragStart=function(b){var d=null;3!==b.which&&(a.support.transform?(d=this.$stage.css("transform").replace(/.*\(|\)| /g,"").split(","),d={x:d[16===d.length?12:4],y:d[16===d.length?13:5]}):(d=this.$stage.position(),d={x:this.settings.rtl?d.left+this.$stage.width()-this.width()+this.settings.margin:d.left,y:d.top}),this.is("animating")&&(a.support.transform?this.animate(d.x):this.$stage.stop(),this.invalidate("position")),this.$element.toggleClass(this.options.grabClass,"mousedown"===b.type),this.speed(0),this._drag.time=(new Date).getTime(),this._drag.target=a(b.target),this._drag.stage.start=d,this._drag.stage.current=d,this._drag.pointer=this.pointer(b),a(c).on("mouseup.owl.core touchend.owl.core",a.proxy(this.onDragEnd,this)),a(c).one("mousemove.owl.core touchmove.owl.core",a.proxy(function(b){var d=this.difference(this._drag.pointer,this.pointer(b));a(c).on("mousemove.owl.core touchmove.owl.core",a.proxy(this.onDragMove,this)),Math.abs(d.x)<Math.abs(d.y)&&this.is("valid")||(b.preventDefault(),this.enter("dragging"),this.trigger("drag"))},this)))},e.prototype.onDragMove=function(a){var b=null,c=null,d=null,e=this.difference(this._drag.pointer,this.pointer(a)),f=this.difference(this._drag.stage.start,e);this.is("dragging")&&(a.preventDefault(),this.settings.loop?(b=this.coordinates(this.minimum()),c=this.coordinates(this.maximum()+1)-b,f.x=((f.x-b)%c+c)%c+b):(b=this.settings.rtl?this.coordinates(this.maximum()):this.coordinates(this.minimum()),c=this.settings.rtl?this.coordinates(this.minimum()):this.coordinates(this.maximum()),d=this.settings.pullDrag?-1*e.x/5:0,f.x=Math.max(Math.min(f.x,b+d),c+d)),this._drag.stage.current=f,this.animate(f.x))},e.prototype.onDragEnd=function(b){var d=this.difference(this._drag.pointer,this.pointer(b)),e=this._drag.stage.current,f=d.x>0^this.settings.rtl?"left":"right";a(c).off(".owl.core"),this.$element.removeClass(this.options.grabClass),(0!==d.x&&this.is("dragging")||!this.is("valid"))&&(this.speed(this.settings.dragEndSpeed||this.settings.smartSpeed),this.current(this.closest(e.x,0!==d.x?f:this._drag.direction)),this.invalidate("position"),this.update(),this._drag.direction=f,(Math.abs(d.x)>3||(new Date).getTime()-this._drag.time>300)&&this._drag.target.one("click.owl.core",function(){return!1})),this.is("dragging")&&(this.leave("dragging"),this.trigger("dragged"))},e.prototype.closest=function(b,c){var e=-1,f=30,g=this.width(),h=this.coordinates();return this.settings.freeDrag||a.each(h,a.proxy(function(a,i){return"left"===c&&b>i-f&&b<i+f?e=a:"right"===c&&b>i-g-f&&b<i-g+f?e=a+1:this.op(b,"<",i)&&this.op(b,">",h[a+1]!==d?h[a+1]:i-g)&&(e="left"===c?a+1:a),-1===e},this)),this.settings.loop||(this.op(b,">",h[this.minimum()])?e=b=this.minimum():this.op(b,"<",h[this.maximum()])&&(e=b=this.maximum())),e},e.prototype.animate=function(b){var c=this.speed()>0;this.is("animating")&&this.onTransitionEnd(),c&&(this.enter("animating"),this.trigger("translate")),a.support.transform3d&&a.support.transition?this.$stage.css({transform:"translate3d("+b+"px,0px,0px)",transition:this.speed()/1e3+"s"+(this.settings.slideTransition?" "+this.settings.slideTransition:"")}):c?this.$stage.animate({left:b+"px"},this.speed(),this.settings.fallbackEasing,a.proxy(this.onTransitionEnd,this)):this.$stage.css({left:b+"px"})},e.prototype.is=function(a){return this._states.current[a]&&this._states.current[a]>0},e.prototype.current=function(a){if(a===d)return this._current;if(0===this._items.length)return d;if(a=this.normalize(a),this._current!==a){var b=this.trigger("change",{property:{name:"position",value:a}});b.data!==d&&(a=this.normalize(b.data)),this._current=a,this.invalidate("position"),this.trigger("changed",{property:{name:"position",value:this._current}})}return this._current},e.prototype.invalidate=function(b){return"string"===a.type(b)&&(this._invalidated[b]=!0,this.is("valid")&&this.leave("valid")),a.map(this._invalidated,function(a,b){return b})},e.prototype.reset=function(a){(a=this.normalize(a))!==d&&(this._speed=0,this._current=a,this.suppress(["translate","translated"]),this.animate(this.coordinates(a)),this.release(["translate","translated"]))},e.prototype.normalize=function(a,b){var c=this._items.length,e=b?0:this._clones.length;return!this.isNumeric(a)||c<1?a=d:(a<0||a>=c+e)&&(a=((a-e/2)%c+c)%c+e/2),a},e.prototype.relative=function(a){return a-=this._clones.length/2,this.normalize(a,!0)},e.prototype.maximum=function(a){var b,c,d,e=this.settings,f=this._coordinates.length;if(e.loop)f=this._clones.length/2+this._items.length-1;else if(e.autoWidth||e.merge){if(b=this._items.length)for(c=this._items[--b].width(),d=this.$element.width();b--&&!((c+=this._items[b].width()+this.settings.margin)>d););f=b+1}else f=e.center?this._items.length-1:this._items.length-e.items;return a&&(f-=this._clones.length/2),Math.max(f,0)},e.prototype.minimum=function(a){return a?0:this._clones.length/2},e.prototype.items=function(a){return a===d?this._items.slice():(a=this.normalize(a,!0),this._items[a])},e.prototype.mergers=function(a){return a===d?this._mergers.slice():(a=this.normalize(a,!0),this._mergers[a])},e.prototype.clones=function(b){var c=this._clones.length/2,e=c+this._items.length,f=function(a){return a%2==0?e+a/2:c-(a+1)/2};return b===d?a.map(this._clones,function(a,b){return f(b)}):a.map(this._clones,function(a,c){return a===b?f(c):null})},e.prototype.speed=function(a){return a!==d&&(this._speed=a),this._speed},e.prototype.coordinates=function(b){var c,e=1,f=b-1;return b===d?a.map(this._coordinates,a.proxy(function(a,b){return this.coordinates(b)},this)):(this.settings.center?(this.settings.rtl&&(e=-1,f=b+1),c=this._coordinates[b],c+=(this.width()-c+(this._coordinates[f]||0))/2*e):c=this._coordinates[f]||0,c=Math.ceil(c))},e.prototype.duration=function(a,b,c){return 0===c?0:Math.min(Math.max(Math.abs(b-a),1),6)*Math.abs(c||this.settings.smartSpeed)},e.prototype.to=function(a,b){var c=this.current(),d=null,e=a-this.relative(c),f=(e>0)-(e<0),g=this._items.length,h=this.minimum(),i=this.maximum();this.settings.loop?(!this.settings.rewind&&Math.abs(e)>g/2&&(e+=-1*f*g),a=c+e,(d=((a-h)%g+g)%g+h)!==a&&d-e<=i&&d-e>0&&(c=d-e,a=d,this.reset(c))):this.settings.rewind?(i+=1,a=(a%i+i)%i):a=Math.max(h,Math.min(i,a)),this.speed(this.duration(c,a,b)),this.current(a),this.isVisible()&&this.update()},e.prototype.next=function(a){a=a||!1,this.to(this.relative(this.current())+1,a)},e.prototype.prev=function(a){a=a||!1,this.to(this.relative(this.current())-1,a)},e.prototype.onTransitionEnd=function(a){if(a!==d&&(a.stopPropagation(),(a.target||a.srcElement||a.originalTarget)!==this.$stage.get(0)))return!1;this.leave("animating"),this.trigger("translated")},e.prototype.viewport=function(){var d;return this.options.responsiveBaseElement!==b?d=a(this.options.responsiveBaseElement).width():b.innerWidth?d=b.innerWidth:c.documentElement&&c.documentElement.clientWidth?d=c.documentElement.clientWidth:console.warn("Can not detect viewport width."),d},e.prototype.replace=function(b){this.$stage.empty(),this._items=[],b&&(b=b instanceof jQuery?b:a(b)),this.settings.nestedItemSelector&&(b=b.find("."+this.settings.nestedItemSelector)),b.filter(function(){return 1===this.nodeType}).each(a.proxy(function(a,b){b=this.prepare(b),this.$stage.append(b),this._items.push(b),this._mergers.push(1*b.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)},this)),this.reset(this.isNumeric(this.settings.startPosition)?this.settings.startPosition:0),this.invalidate("items")},e.prototype.add=function(b,c){var e=this.relative(this._current);c=c===d?this._items.length:this.normalize(c,!0),b=b instanceof jQuery?b:a(b),this.trigger("add",{content:b,position:c}),b=this.prepare(b),0===this._items.length||c===this._items.length?(0===this._items.length&&this.$stage.append(b),0!==this._items.length&&this._items[c-1].after(b),this._items.push(b),this._mergers.push(1*b.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)):(this._items[c].before(b),this._items.splice(c,0,b),this._mergers.splice(c,0,1*b.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)),this._items[e]&&this.reset(this._items[e].index()),this.invalidate("items"),this.trigger("added",{content:b,position:c})},e.prototype.remove=function(a){(a=this.normalize(a,!0))!==d&&(this.trigger("remove",{content:this._items[a],position:a}),this._items[a].remove(),this._items.splice(a,1),this._mergers.splice(a,1),this.invalidate("items"),this.trigger("removed",{content:null,position:a}))},e.prototype.preloadAutoWidthImages=function(b){b.each(a.proxy(function(b,c){this.enter("pre-loading"),c=a(c),a(new Image).one("load",a.proxy(function(a){c.attr("src",a.target.src),c.css("opacity",1),this.leave("pre-loading"),!this.is("pre-loading")&&!this.is("initializing")&&this.refresh()},this)).attr("src",c.attr("src")||c.attr("data-src")||c.attr("data-src-retina"))},this))},e.prototype.destroy=function(){this.$element.off(".owl.core"),this.$stage.off(".owl.core"),a(c).off(".owl.core"),!1!==this.settings.responsive&&(b.clearTimeout(this.resizeTimer),this.off(b,"resize",this._handlers.onThrottledResize));for(var d in this._plugins)this._plugins[d].destroy();this.$stage.children(".cloned").remove(),this.$stage.unwrap(),this.$stage.children().contents().unwrap(),this.$stage.children().unwrap(),this.$stage.remove(),this.$element.removeClass(this.options.refreshClass).removeClass(this.options.loadingClass).removeClass(this.options.loadedClass).removeClass(this.options.rtlClass).removeClass(this.options.dragClass).removeClass(this.options.grabClass).attr("class",this.$element.attr("class").replace(new RegExp(this.options.responsiveClass+"-\\S+\\s","g"),"")).removeData("owl.carousel")},e.prototype.op=function(a,b,c){var d=this.settings.rtl;switch(b){case"<":return d?a>c:a<c;case">":return d?a<c:a>c;case">=":return d?a<=c:a>=c;case"<=":return d?a>=c:a<=c}},e.prototype.on=function(a,b,c,d){a.addEventListener?a.addEventListener(b,c,d):a.attachEvent&&a.attachEvent("on"+b,c)},e.prototype.off=function(a,b,c,d){a.removeEventListener?a.removeEventListener(b,c,d):a.detachEvent&&a.detachEvent("on"+b,c)},e.prototype.trigger=function(b,c,d,f,g){var h={item:{count:this._items.length,index:this.current()}},i=a.camelCase(a.grep(["on",b,d],function(a){return a}).join("-").toLowerCase()),j=a.Event([b,"owl",d||"carousel"].join(".").toLowerCase(),a.extend({relatedTarget:this},h,c));return this._supress[b]||(a.each(this._plugins,function(a,b){b.onTrigger&&b.onTrigger(j)}),this.register({type:e.Type.Event,name:b}),this.$element.trigger(j),this.settings&&"function"==typeof this.settings[i]&&this.settings[i].call(this,j)),j},e.prototype.enter=function(b){a.each([b].concat(this._states.tags[b]||[]),a.proxy(function(a,b){this._states.current[b]===d&&(this._states.current[b]=0),this._states.current[b]++},this))},e.prototype.leave=function(b){a.each([b].concat(this._states.tags[b]||[]),a.proxy(function(a,b){this._states.current[b]--},this))},e.prototype.register=function(b){if(b.type===e.Type.Event){if(a.event.special[b.name]||(a.event.special[b.name]={}),!a.event.special[b.name].owl){var c=a.event.special[b.name]._default;a.event.special[b.name]._default=function(a){return!c||!c.apply||a.namespace&&-1!==a.namespace.indexOf("owl")?a.namespace&&a.namespace.indexOf("owl")>-1:c.apply(this,arguments)},a.event.special[b.name].owl=!0}}else b.type===e.Type.State&&(this._states.tags[b.name]?this._states.tags[b.name]=this._states.tags[b.name].concat(b.tags):this._states.tags[b.name]=b.tags,this._states.tags[b.name]=a.grep(this._states.tags[b.name],a.proxy(function(c,d){return a.inArray(c,this._states.tags[b.name])===d},this)))},e.prototype.suppress=function(b){a.each(b,a.proxy(function(a,b){this._supress[b]=!0},this))},e.prototype.release=function(b){a.each(b,a.proxy(function(a,b){delete this._supress[b]},this))},e.prototype.pointer=function(a){var c={x:null,y:null};return a=a.originalEvent||a||b.event,a=a.touches&&a.touches.length?a.touches[0]:a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:a,a.pageX?(c.x=a.pageX,c.y=a.pageY):(c.x=a.clientX,c.y=a.clientY),c},e.prototype.isNumeric=function(a){return!isNaN(parseFloat(a))},e.prototype.difference=function(a,b){return{x:a.x-b.x,y:a.y-b.y}},a.fn.owlCarousel=function(b){var c=Array.prototype.slice.call(arguments,1);return this.each(function(){var d=a(this),f=d.data("owl.carousel");f||(f=new e(this,"object"==typeof b&&b),d.data("owl.carousel",f),a.each(["next","prev","to","destroy","refresh","replace","add","remove"],function(b,c){f.register({type:e.Type.Event,name:c}),f.$element.on(c+".owl.carousel.core",a.proxy(function(a){a.namespace&&a.relatedTarget!==this&&(this.suppress([c]),f[c].apply(this,[].slice.call(arguments,1)),this.release([c]))},f))})),"string"==typeof b&&"_"!==b.charAt(0)&&f[b].apply(f,c)})},a.fn.owlCarousel.Constructor=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._interval=null,this._visible=null,this._handlers={"initialized.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoRefresh&&this.watch()},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers)};e.Defaults={autoRefresh:!0,autoRefreshInterval:500},e.prototype.watch=function(){this._interval||(this._visible=this._core.isVisible(),this._interval=b.setInterval(a.proxy(this.refresh,this),this._core.settings.autoRefreshInterval))},e.prototype.refresh=function(){this._core.isVisible()!==this._visible&&(this._visible=!this._visible,this._core.$element.toggleClass("owl-hidden",!this._visible),this._visible&&this._core.invalidate("width")&&this._core.refresh())},e.prototype.destroy=function(){var a,c;b.clearInterval(this._interval);for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(c in Object.getOwnPropertyNames(this))"function"!=typeof this[c]&&(this[c]=null)},a.fn.owlCarousel.Constructor.Plugins.AutoRefresh=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._loaded=[],this._handlers={"initialized.owl.carousel change.owl.carousel resized.owl.carousel":a.proxy(function(b){if(b.namespace&&this._core.settings&&this._core.settings.lazyLoad&&(b.property&&"position"==b.property.name||"initialized"==b.type)){var c=this._core.settings,e=c.center&&Math.ceil(c.items/2)||c.items,f=c.center&&-1*e||0,g=(b.property&&b.property.value!==d?b.property.value:this._core.current())+f,h=this._core.clones().length,i=a.proxy(function(a,b){this.load(b)},this);for(c.lazyLoadEager>0&&(e+=c.lazyLoadEager,c.loop&&(g-=c.lazyLoadEager,e++));f++<e;)this.load(h/2+this._core.relative(g)),h&&a.each(this._core.clones(this._core.relative(g)),i),g++}},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers)};e.Defaults={lazyLoad:!1,lazyLoadEager:0},e.prototype.load=function(c){var d=this._core.$stage.children().eq(c),e=d&&d.find(".owl-lazy");!e||a.inArray(d.get(0),this._loaded)>-1||(e.each(a.proxy(function(c,d){var e,f=a(d),g=b.devicePixelRatio>1&&f.attr("data-src-retina")||f.attr("data-src")||f.attr("data-srcset");this._core.trigger("load",{element:f,url:g},"lazy"),f.is("img")?f.one("load.owl.lazy",a.proxy(function(){f.css("opacity",1),this._core.trigger("loaded",{element:f,url:g},"lazy")},this)).attr("src",g):f.is("source")?f.one("load.owl.lazy",a.proxy(function(){this._core.trigger("loaded",{element:f,url:g},"lazy")},this)).attr("srcset",g):(e=new Image,e.onload=a.proxy(function(){f.css({"background-image":'url("'+g+'")',opacity:"1"}),this._core.trigger("loaded",{element:f,url:g},"lazy")},this),e.src=g)},this)),this._loaded.push(d.get(0)))},e.prototype.destroy=function(){var a,b;for(a in this.handlers)this._core.$element.off(a,this.handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Lazy=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(c){this._core=c,this._previousHeight=null,this._handlers={"initialized.owl.carousel refreshed.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoHeight&&this.update()},this),"changed.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoHeight&&"position"===a.property.name&&this.update()},this),"loaded.owl.lazy":a.proxy(function(a){a.namespace&&this._core.settings.autoHeight&&a.element.closest("."+this._core.settings.itemClass).index()===this._core.current()&&this.update()},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers),this._intervalId=null;var d=this;a(b).on("load",function(){d._core.settings.autoHeight&&d.update()}),a(b).resize(function(){d._core.settings.autoHeight&&(null!=d._intervalId&&clearTimeout(d._intervalId),d._intervalId=setTimeout(function(){d.update()},250))})};e.Defaults={autoHeight:!1,autoHeightClass:"owl-height"},e.prototype.update=function(){var b=this._core._current,c=b+this._core.settings.items,d=this._core.settings.lazyLoad,e=this._core.$stage.children().toArray().slice(b,c),f=[],g=0;a.each(e,function(b,c){f.push(a(c).height())}),g=Math.max.apply(null,f),g<=1&&d&&this._previousHeight&&(g=this._previousHeight),this._previousHeight=g,this._core.$stage.parent().height(g).addClass(this._core.settings.autoHeightClass)},e.prototype.destroy=function(){var a,b;for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.AutoHeight=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._videos={},this._playing=null,this._handlers={"initialized.owl.carousel":a.proxy(function(a){a.namespace&&this._core.register({type:"state",name:"playing",tags:["interacting"]})},this),"resize.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.video&&this.isInFullScreen()&&a.preventDefault()},this),"refreshed.owl.carousel":a.proxy(function(a){a.namespace&&this._core.is("resizing")&&this._core.$stage.find(".cloned .owl-video-frame").remove()},this),"changed.owl.carousel":a.proxy(function(a){a.namespace&&"position"===a.property.name&&this._playing&&this.stop()},this),"prepared.owl.carousel":a.proxy(function(b){if(b.namespace){var c=a(b.content).find(".owl-video");c.length&&(c.css("display","none"),this.fetch(c,a(b.content)))}},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers),this._core.$element.on("click.owl.video",".owl-video-play-icon",a.proxy(function(a){this.play(a)},this))};e.Defaults={video:!1,videoHeight:!1,videoWidth:!1},e.prototype.fetch=function(a,b){var c=function(){return a.attr("data-vimeo-id")?"vimeo":a.attr("data-vzaar-id")?"vzaar":"youtube"}(),d=a.attr("data-vimeo-id")||a.attr("data-youtube-id")||a.attr("data-vzaar-id"),e=a.attr("data-width")||this._core.settings.videoWidth,f=a.attr("data-height")||this._core.settings.videoHeight,g=a.attr("href");if(!g)throw new Error("Missing video URL.");if(d=g.match(/(http:|https:|)\/\/(player.|www.|app.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com|be\-nocookie\.com)|vzaar\.com)\/(video\/|videos\/|embed\/|channels\/.+\/|groups\/.+\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/),d[3].indexOf("youtu")>-1)c="youtube";else if(d[3].indexOf("vimeo")>-1)c="vimeo";else{if(!(d[3].indexOf("vzaar")>-1))throw new Error("Video URL not supported.");c="vzaar"}d=d[6],this._videos[g]={type:c,id:d,width:e,height:f},b.attr("data-video",g),this.thumbnail(a,this._videos[g])},e.prototype.thumbnail=function(b,c){var d,e,f,g=c.width&&c.height?"width:"+c.width+"px;height:"+c.height+"px;":"",h=b.find("img"),i="src",j="",k=this._core.settings,l=function(c){e='<div class="owl-video-play-icon"></div>',d=k.lazyLoad?a("<div/>",{class:"owl-video-tn "+j,srcType:c}):a("<div/>",{class:"owl-video-tn",style:"opacity:1;background-image:url("+c+")"}),b.after(d),b.after(e)};if(b.wrap(a("<div/>",{class:"owl-video-wrapper",style:g})),this._core.settings.lazyLoad&&(i="data-src",j="owl-lazy"),h.length)return l(h.attr(i)),h.remove(),!1;"youtube"===c.type?(f="//img.youtube.com/vi/"+c.id+"/hqdefault.jpg",l(f)):"vimeo"===c.type?a.ajax({type:"GET",url:"//vimeo.com/api/v2/video/"+c.id+".json",jsonp:"callback",dataType:"jsonp",success:function(a){f=a[0].thumbnail_large,l(f)}}):"vzaar"===c.type&&a.ajax({type:"GET",url:"//vzaar.com/api/videos/"+c.id+".json",jsonp:"callback",dataType:"jsonp",success:function(a){f=a.framegrab_url,l(f)}})},e.prototype.stop=function(){this._core.trigger("stop",null,"video"),this._playing.find(".owl-video-frame").remove(),this._playing.removeClass("owl-video-playing"),this._playing=null,this._core.leave("playing"),this._core.trigger("stopped",null,"video")},e.prototype.play=function(b){var c,d=a(b.target),e=d.closest("."+this._core.settings.itemClass),f=this._videos[e.attr("data-video")],g=f.width||"100%",h=f.height||this._core.$stage.height();this._playing||(this._core.enter("playing"),this._core.trigger("play",null,"video"),e=this._core.items(this._core.relative(e.index())),this._core.reset(e.index()),c=a('<iframe frameborder="0" allowfullscreen mozallowfullscreen webkitAllowFullScreen ></iframe>'),c.attr("height",h),c.attr("width",g),"youtube"===f.type?c.attr("src","//www.youtube.com/embed/"+f.id+"?autoplay=1&rel=0&v="+f.id):"vimeo"===f.type?c.attr("src","//player.vimeo.com/video/"+f.id+"?autoplay=1"):"vzaar"===f.type&&c.attr("src","//view.vzaar.com/"+f.id+"/player?autoplay=true"),a(c).wrap('<div class="owl-video-frame" />').insertAfter(e.find(".owl-video")),this._playing=e.addClass("owl-video-playing"))},e.prototype.isInFullScreen=function(){var b=c.fullscreenElement||c.mozFullScreenElement||c.webkitFullscreenElement;return b&&a(b).parent().hasClass("owl-video-frame")},e.prototype.destroy=function(){var a,b;this._core.$element.off("click.owl.video");for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Video=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this.core=b,this.core.options=a.extend({},e.Defaults,this.core.options),this.swapping=!0,this.previous=d,this.next=d,this.handlers={"change.owl.carousel":a.proxy(function(a){a.namespace&&"position"==a.property.name&&(this.previous=this.core.current(),this.next=a.property.value)},this),"drag.owl.carousel dragged.owl.carousel translated.owl.carousel":a.proxy(function(a){a.namespace&&(this.swapping="translated"==a.type)},this),"translate.owl.carousel":a.proxy(function(a){a.namespace&&this.swapping&&(this.core.options.animateOut||this.core.options.animateIn)&&this.swap()},this)},this.core.$element.on(this.handlers)};e.Defaults={animateOut:!1,
animateIn:!1},e.prototype.swap=function(){if(1===this.core.settings.items&&a.support.animation&&a.support.transition){this.core.speed(0);var b,c=a.proxy(this.clear,this),d=this.core.$stage.children().eq(this.previous),e=this.core.$stage.children().eq(this.next),f=this.core.settings.animateIn,g=this.core.settings.animateOut;this.core.current()!==this.previous&&(g&&(b=this.core.coordinates(this.previous)-this.core.coordinates(this.next),d.one(a.support.animation.end,c).css({left:b+"px"}).addClass("animated owl-animated-out").addClass(g)),f&&e.one(a.support.animation.end,c).addClass("animated owl-animated-in").addClass(f))}},e.prototype.clear=function(b){a(b.target).css({left:""}).removeClass("animated owl-animated-out owl-animated-in").removeClass(this.core.settings.animateIn).removeClass(this.core.settings.animateOut),this.core.onTransitionEnd()},e.prototype.destroy=function(){var a,b;for(a in this.handlers)this.core.$element.off(a,this.handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Animate=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._call=null,this._time=0,this._timeout=0,this._paused=!0,this._handlers={"changed.owl.carousel":a.proxy(function(a){a.namespace&&"settings"===a.property.name?this._core.settings.autoplay?this.play():this.stop():a.namespace&&"position"===a.property.name&&this._paused&&(this._time=0)},this),"initialized.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoplay&&this.play()},this),"play.owl.autoplay":a.proxy(function(a,b,c){a.namespace&&this.play(b,c)},this),"stop.owl.autoplay":a.proxy(function(a){a.namespace&&this.stop()},this),"mouseover.owl.autoplay":a.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.pause()},this),"mouseleave.owl.autoplay":a.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.play()},this),"touchstart.owl.core":a.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.pause()},this),"touchend.owl.core":a.proxy(function(){this._core.settings.autoplayHoverPause&&this.play()},this)},this._core.$element.on(this._handlers),this._core.options=a.extend({},e.Defaults,this._core.options)};e.Defaults={autoplay:!1,autoplayTimeout:5e3,autoplayHoverPause:!1,autoplaySpeed:!1},e.prototype._next=function(d){this._call=b.setTimeout(a.proxy(this._next,this,d),this._timeout*(Math.round(this.read()/this._timeout)+1)-this.read()),this._core.is("interacting")||c.hidden||this._core.next(d||this._core.settings.autoplaySpeed)},e.prototype.read=function(){return(new Date).getTime()-this._time},e.prototype.play=function(c,d){var e;this._core.is("rotating")||this._core.enter("rotating"),c=c||this._core.settings.autoplayTimeout,e=Math.min(this._time%(this._timeout||c),c),this._paused?(this._time=this.read(),this._paused=!1):b.clearTimeout(this._call),this._time+=this.read()%c-e,this._timeout=c,this._call=b.setTimeout(a.proxy(this._next,this,d),c-e)},e.prototype.stop=function(){this._core.is("rotating")&&(this._time=0,this._paused=!0,b.clearTimeout(this._call),this._core.leave("rotating"))},e.prototype.pause=function(){this._core.is("rotating")&&!this._paused&&(this._time=this.read(),this._paused=!0,b.clearTimeout(this._call))},e.prototype.destroy=function(){var a,b;this.stop();for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.autoplay=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){"use strict";var e=function(b){this._core=b,this._initialized=!1,this._pages=[],this._controls={},this._templates=[],this.$element=this._core.$element,this._overrides={next:this._core.next,prev:this._core.prev,to:this._core.to},this._handlers={"prepared.owl.carousel":a.proxy(function(b){b.namespace&&this._core.settings.dotsData&&this._templates.push('<div class="'+this._core.settings.dotClass+'">'+a(b.content).find("[data-dot]").addBack("[data-dot]").attr("data-dot")+"</div>")},this),"added.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.dotsData&&this._templates.splice(a.position,0,this._templates.pop())},this),"remove.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.dotsData&&this._templates.splice(a.position,1)},this),"changed.owl.carousel":a.proxy(function(a){a.namespace&&"position"==a.property.name&&this.draw()},this),"initialized.owl.carousel":a.proxy(function(a){a.namespace&&!this._initialized&&(this._core.trigger("initialize",null,"navigation"),this.initialize(),this.update(),this.draw(),this._initialized=!0,this._core.trigger("initialized",null,"navigation"))},this),"refreshed.owl.carousel":a.proxy(function(a){a.namespace&&this._initialized&&(this._core.trigger("refresh",null,"navigation"),this.update(),this.draw(),this._core.trigger("refreshed",null,"navigation"))},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this.$element.on(this._handlers)};e.Defaults={nav:!1,navText:['<span aria-label="Previous">‹</span>','<span aria-label="Next">›</span>'],navSpeed:!1,navElement:'button type="button" role="presentation"',navContainer:!1,navContainerClass:"owl-nav",navClass:["owl-prev","owl-next"],slideBy:1,dotClass:"owl-dot",dotsClass:"owl-dots",dots:!0,dotsEach:!1,dotsData:!1,dotsSpeed:!1,dotsContainer:!1},e.prototype.initialize=function(){var b,c=this._core.settings;this._controls.$relative=(c.navContainer?a(c.navContainer):a("<div>").addClass(c.navContainerClass).appendTo(this.$element)).addClass("disabled"),this._controls.$previous=a("<"+c.navElement+">").addClass(c.navClass[0]).html(c.navText[0]).prependTo(this._controls.$relative).on("click",a.proxy(function(a){this.prev(c.navSpeed)},this)),this._controls.$next=a("<"+c.navElement+">").addClass(c.navClass[1]).html(c.navText[1]).appendTo(this._controls.$relative).on("click",a.proxy(function(a){this.next(c.navSpeed)},this)),c.dotsData||(this._templates=[a('<button role="button">').addClass(c.dotClass).append(a("<span>")).prop("outerHTML")]),this._controls.$absolute=(c.dotsContainer?a(c.dotsContainer):a("<div>").addClass(c.dotsClass).appendTo(this.$element)).addClass("disabled"),this._controls.$absolute.on("click","button",a.proxy(function(b){var d=a(b.target).parent().is(this._controls.$absolute)?a(b.target).index():a(b.target).parent().index();b.preventDefault(),this.to(d,c.dotsSpeed)},this));for(b in this._overrides)this._core[b]=a.proxy(this[b],this)},e.prototype.destroy=function(){var a,b,c,d,e;e=this._core.settings;for(a in this._handlers)this.$element.off(a,this._handlers[a]);for(b in this._controls)"$relative"===b&&e.navContainer?this._controls[b].html(""):this._controls[b].remove();for(d in this.overides)this._core[d]=this._overrides[d];for(c in Object.getOwnPropertyNames(this))"function"!=typeof this[c]&&(this[c]=null)},e.prototype.update=function(){var a,b,c,d=this._core.clones().length/2,e=d+this._core.items().length,f=this._core.maximum(!0),g=this._core.settings,h=g.center||g.autoWidth||g.dotsData?1:g.dotsEach||g.items;if("page"!==g.slideBy&&(g.slideBy=Math.min(g.slideBy,g.items)),g.dots||"page"==g.slideBy)for(this._pages=[],a=d,b=0,c=0;a<e;a++){if(b>=h||0===b){if(this._pages.push({start:Math.min(f,a-d),end:a-d+h-1}),Math.min(f,a-d)===f)break;b=0,++c}b+=this._core.mergers(this._core.relative(a))}},e.prototype.draw=function(){var b,c=this._core.settings,d=this._core.items().length<=c.items,e=this._core.relative(this._core.current()),f=c.loop||c.rewind;this._controls.$relative.toggleClass("disabled",!c.nav||d),c.nav&&(this._controls.$previous.toggleClass("disabled",!f&&e<=this._core.minimum(!0)),this._controls.$next.toggleClass("disabled",!f&&e>=this._core.maximum(!0))),this._controls.$absolute.toggleClass("disabled",!c.dots||d),c.dots&&(b=this._pages.length-this._controls.$absolute.children().length,c.dotsData&&0!==b?this._controls.$absolute.html(this._templates.join("")):b>0?this._controls.$absolute.append(new Array(b+1).join(this._templates[0])):b<0&&this._controls.$absolute.children().slice(b).remove(),this._controls.$absolute.find(".active").removeClass("active"),this._controls.$absolute.children().eq(a.inArray(this.current(),this._pages)).addClass("active"))},e.prototype.onTrigger=function(b){var c=this._core.settings;b.page={index:a.inArray(this.current(),this._pages),count:this._pages.length,size:c&&(c.center||c.autoWidth||c.dotsData?1:c.dotsEach||c.items)}},e.prototype.current=function(){var b=this._core.relative(this._core.current());return a.grep(this._pages,a.proxy(function(a,c){return a.start<=b&&a.end>=b},this)).pop()},e.prototype.getPosition=function(b){var c,d,e=this._core.settings;return"page"==e.slideBy?(c=a.inArray(this.current(),this._pages),d=this._pages.length,b?++c:--c,c=this._pages[(c%d+d)%d].start):(c=this._core.relative(this._core.current()),d=this._core.items().length,b?c+=e.slideBy:c-=e.slideBy),c},e.prototype.next=function(b){a.proxy(this._overrides.to,this._core)(this.getPosition(!0),b)},e.prototype.prev=function(b){a.proxy(this._overrides.to,this._core)(this.getPosition(!1),b)},e.prototype.to=function(b,c,d){var e;!d&&this._pages.length?(e=this._pages.length,a.proxy(this._overrides.to,this._core)(this._pages[(b%e+e)%e].start,c)):a.proxy(this._overrides.to,this._core)(b,c)},a.fn.owlCarousel.Constructor.Plugins.Navigation=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){"use strict";var e=function(c){this._core=c,this._hashes={},this.$element=this._core.$element,this._handlers={"initialized.owl.carousel":a.proxy(function(c){c.namespace&&"URLHash"===this._core.settings.startPosition&&a(b).trigger("hashchange.owl.navigation")},this),"prepared.owl.carousel":a.proxy(function(b){if(b.namespace){var c=a(b.content).find("[data-hash]").addBack("[data-hash]").attr("data-hash");if(!c)return;this._hashes[c]=b.content}},this),"changed.owl.carousel":a.proxy(function(c){if(c.namespace&&"position"===c.property.name){var d=this._core.items(this._core.relative(this._core.current())),e=a.map(this._hashes,function(a,b){return a===d?b:null}).join();if(!e||b.location.hash.slice(1)===e)return;b.location.hash=e}},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this.$element.on(this._handlers),a(b).on("hashchange.owl.navigation",a.proxy(function(a){var c=b.location.hash.substring(1),e=this._core.$stage.children(),f=this._hashes[c]&&e.index(this._hashes[c]);f!==d&&f!==this._core.current()&&this._core.to(this._core.relative(f),!1,!0)},this))};e.Defaults={URLhashListener:!1},e.prototype.destroy=function(){var c,d;a(b).off("hashchange.owl.navigation");for(c in this._handlers)this._core.$element.off(c,this._handlers[c]);for(d in Object.getOwnPropertyNames(this))"function"!=typeof this[d]&&(this[d]=null)},a.fn.owlCarousel.Constructor.Plugins.Hash=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){function e(b,c){var e=!1,f=b.charAt(0).toUpperCase()+b.slice(1);return a.each((b+" "+h.join(f+" ")+f).split(" "),function(a,b){if(g[b]!==d)return e=!c||b,!1}),e}function f(a){return e(a,!0)}var g=a("<support>").get(0).style,h="Webkit Moz O ms".split(" "),i={transition:{end:{WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"}},animation:{end:{WebkitAnimation:"webkitAnimationEnd",MozAnimation:"animationend",OAnimation:"oAnimationEnd",animation:"animationend"}}},j={csstransforms:function(){return!!e("transform")},csstransforms3d:function(){return!!e("perspective")},csstransitions:function(){return!!e("transition")},cssanimations:function(){return!!e("animation")}};j.csstransitions()&&(a.support.transition=new String(f("transition")),a.support.transition.end=i.transition.end[a.support.transition]),j.cssanimations()&&(a.support.animation=new String(f("animation")),a.support.animation.end=i.animation.end[a.support.animation]),j.csstransforms()&&(a.support.transform=new String(f("transform")),a.support.transform3d=j.csstransforms3d())}(window.Zepto||window.jQuery,window,document);Стили CSS . owl.carousel.min.css и owl.theme.default.min.css
/**
* Owl Carousel v2.3.4
* Copyright 2013-2018 David Deutsch
* Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE
*/
.owl-carousel,.owl-carousel .owl-item{-webkit-tap-highlight-color:transparent;position:relative}.owl-carousel{display:none;width:100%;z-index:1}.owl-carousel .owl-stage{position:relative;-ms-touch-action:pan-Y;touch-action:manipulation;-moz-backface-visibility:hidden}.owl-carousel .owl-stage:after{content:".";display:block;clear:both;visibility:hidden;line-height:0;height:0}.owl-carousel .owl-stage-outer{position:relative;overflow:hidden;-webkit-transform:translate3d(0,0,0)}.owl-carousel .owl-item,.owl-carousel .owl-wrapper{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0)}.owl-carousel .owl-item{min-height:1px;float:left;-webkit-backface-visibility:hidden;-webkit-touch-callout:none}.owl-carousel .owl-item img{display:block;width:100%}.owl-carousel .owl-dots.disabled,.owl-carousel .owl-nav.disabled{display:none}.no-js .owl-carousel,.owl-carousel.owl-loaded{display:block}.owl-carousel .owl-dot,.owl-carousel .owl-nav .owl-next,.owl-carousel .owl-nav .owl-prev{cursor:pointer;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel .owl-nav button.owl-next,.owl-carousel .owl-nav button.owl-prev,.owl-carousel button.owl-dot{background:0 0;color:inherit;border:none;padding:0!important;font:inherit}.owl-carousel.owl-loading{opacity:0;display:block}.owl-carousel.owl-hidden{opacity:0}.owl-carousel.owl-refresh .owl-item{visibility:hidden}.owl-carousel.owl-drag .owl-item{-ms-touch-action:pan-y;touch-action:pan-y;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel.owl-grab{cursor:move;cursor:grab}.owl-carousel.owl-rtl{direction:rtl}.owl-carousel.owl-rtl .owl-item{float:right}.owl-carousel .animated{animation-duration:1s;animation-fill-mode:both}.owl-carousel .owl-animated-in{z-index:0}.owl-carousel .owl-animated-out{z-index:1}.owl-carousel .fadeOut{animation-name:fadeOut}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.owl-height{transition:height .5s ease-in-out}.owl-carousel .owl-item .owl-lazy{opacity:0;transition:opacity .4s ease}.owl-carousel .owl-item .owl-lazy:not([src]),.owl-carousel .owl-item .owl-lazy[src^=""]{max-height:0}.owl-carousel .owl-item img.owl-lazy{transform-style:preserve-3d}.owl-carousel .owl-video-wrapper{position:relative;height:100%;background:#000}.owl-carousel .owl-video-play-icon{position:absolute;height:80px;width:80px;left:50%;top:50%;margin-left:-40px;margin-top:-40px;background:url(owl.video.play.png) no-repeat;cursor:pointer;z-index:1;-webkit-backface-visibility:hidden;transition:transform .1s ease}.owl-carousel .owl-video-play-icon:hover{-ms-transform:scale(1.3,1.3);transform:scale(1.3,1.3)}.owl-carousel .owl-video-playing .owl-video-play-icon,.owl-carousel .owl-video-playing .owl-video-tn{display:none}.owl-carousel .owl-video-tn{opacity:0;height:100%;background-position:center center;background-repeat:no-repeat;background-size:contain;transition:opacity .4s ease}.owl-carousel .owl-video-frame{position:relative;z-index:1;height:100%;width:100%}/**
* Owl Carousel v2.3.4
* Copyright 2013-2018 David Deutsch
* Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE
*/
.owl-theme .owl-dots,.owl-theme .owl-nav{text-align:center;-webkit-tap-highlight-color:transparent}.owl-theme .owl-nav{margin-top:10px}.owl-theme .owl-nav [class*=owl-]{color:#FFF;font-size:14px;margin:5px;padding:4px 7px;background:#D6D6D6;display:inline-block;cursor:pointer;border-radius:3px}.owl-theme .owl-nav [class*=owl-]:hover{background:#869791;color:#FFF;text-decoration:none}.owl-theme .owl-nav .disabled{opacity:.5;cursor:default}.owl-theme .owl-nav.disabled+.owl-dots{margin-top:10px}.owl-theme .owl-dots .owl-dot{display:inline-block;zoom:1}.owl-theme .owl-dots .owl-dot span{width:10px;height:10px;margin:5px 7px;background:#D6D6D6;display:block;-webkit-backface-visibility:visible;transition:opacity .2s ease;border-radius:30px}.owl-theme .owl-dots .owl-dot.active span,.owl-theme .owl-dots .owl-dot:hover span{background:#869791}