В этой статье рассмотрим процесс создания легкого, простого и адаптивного слайдера для сайта с помощью CSS и JavaScript.
Проект слайдера расположен на GitHub по этому адресу . Данный слайдер распространяется под лицензией MIT. Его можно использовать бесплатно как в личных проектах, так и в коммерческих. Поблагодарить автора и поддержать дальнейшее развитие слайдера можно на .
Основные характеристики слайдера:
Подключение слайдера к странице осуществляется посредством выполнения следующих действий:
Демо слайдера расположено на этой странице .
Инициализация карусели осуществляется посредством вызова функции slideShow и указания ей в качестве первого аргумента селектора, определяющего слайдер в документе:
// инициализация элемента.slider в качестве карусели slideShow(".slider");
Кроме селектора функции slideShow можно передать дополнительные параметры, все они указываются в формате объекта посредством 2 параметра:
// инициализация элемента.slider в качестве карусели и настройка её с помощью дополнительных параметров slideShow(".slider", { isAutoplay: false, // false (по умолчанию) или true directionAutoplay: "next", // "next" (по умолчанию) или "prev" delayAutoplay: 5000, // 5000 (по умолчанию) или любое другое число isPauseOnHover: true // true (по умолчанию) или false });
Назначение ключей:
Например, если вам нужно инициализировать слайдер и включить у него автоматическую смену слайдов, то используйте следующую конструкцию:
// инициализация элемента.slider в качестве карусели и настройка её с помощью дополнительных параметров slideShow(".slider", { isAutoplay: true });
Кроме этого, вы можете управлять слайдом с помощью методов. Для этого вам нужно сохранить в переменную результат выполнения функции slideShow:
// инициализация элемента.slider в качестве карусели и настройка её с помощью дополнительных параметров var sliderOne = slideShow(".slider");
После этого вы можете использовать его методы. Например, для того чтобы программно выполнить переход на следующий слайд необходимо просто вызвать метод show:
// выполняет переход на следующий слайд sliderOne.next();
Список методов слайдера:
Применение слайдера для ротации изображений:
Использования слайдера для ротации текстовой информации:
Пример использования слайдера для отображения отзывов:
Применение слайдера для ротации товаров:
Исходные коды слайдера состоят из:
HTML структура слайдера:
В этой разметке основным контейнером, содержащим остальной код слайдера, является элемент div с классом slider . Внутри него находятся три элемента: обёртка для слайдов.slider__wrapper , кнопки для перехода к предыдущему и следующему слайду.slider__control . Кроме этого после вызова функции слайдера в этот блок ещё динамически добавляется элемент с индикаторами.slider__indicators .
Обёртка для слайдов.slider__wrapper содержит в себе элемент.slider__items , а он в свою очередь элементы.slider__item . Такая конструкция позволит при необходимости расположить индикаторы и элементы управления как внутри слайдов, так и за их пределами.
В этом примере слайдер состоит из 4 элементов.slider__item . Эти элементы визуально представляют собой слайды.
Блок с индикаторами.slider__indicators выполнен в виде нумерованного списка. Он состоит из элементов li с атрибутом data-slide-to . Количество элементов в списке определяется числом слайдов. Данный атрибут используется для определения индекса слайда, на которой нужно перейти при нажатии на данный индикатор. В слайдере активный индикатор отмечается с помощью добавления к нему класса active .
Кнопки «назад» и «вперед» размечены с помощью элемента a . Кнопка для перехода к предыдущему слайду имеет классы slider__control и slider__control_prev , а к следующему – slider__control и slider__control_next .
Стили слайдера:
/* стили основного контейнера слайдера */ .slider { position: relative; overflow: hidden; max-width: 600px; margin-left: auto; margin-right: auto; } /* стили для обёртки, в которой заключены слайды */ .slider__wrapper { position: relative; overflow: hidden; } /* стили для контейнера слайдов */ .slider__items { display: flex; transition: transform 0.7s ease; } /* стили для слайдов */ .slider__item { flex: 0 0 100%; max-width: 100%; } /* стили для кнопок "вперед" и "назад" */ .slider__control { position: absolute; top: 50%; display: none; align-items: center; justify-content: center; width: 40px; color: #fff; text-align: center; opacity: 0.5; height: 50px; transform: translateY(-50%); background: rgba(0, 0, 0, 0.5); } .slider__control_show { display: flex; } .slider__control:hover, .slider__control:focus { color: #fff; text-decoration: none; outline: 0; opacity: 0.9; } .slider__control_prev { left: 0; } .slider__control_next { right: 0; } .slider__control::before { content: ""; display: inline-block; width: 20px; height: 20px; background: transparent no-repeat center center; background-size: 100% 100%; } .slider__control_prev::before { background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23fff" viewBox="0 0 8 8"%3E%3Cpath d="M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z"/%3E%3C/svg%3E"); } .slider__control_next::before { background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23fff" viewBox="0 0 8 8"%3E%3Cpath d="M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z"/%3E%3C/svg%3E"); } /* стили для индикаторов */ .slider__indicators { position: absolute; right: 0; bottom: 10px; left: 0; z-index: 15; display: flex; justify-content: center; padding-left: 0; margin-right: 15%; margin-left: 15%; list-style: none; margin-top: 0; margin-bottom: 0; } .slider__indicators li { box-sizing: content-box; flex: 0 1 auto; width: 30px; height: 4px; margin-right: 3px; margin-left: 3px; text-indent: -999px; cursor: pointer; background-color: rgba(255, 255, 255, 0.5); background-clip: padding-box; border-top: 10px solid transparent; border-bottom: 10px solid transparent; } .slider__indicators li.active { background-color: #fff; }
В слайдере в некоторый момент времени пользователю всегда показывается только один слайд. Осуществляется это посредством скрытия всех элементов (слайдов) располагающихся за пределами области внутри.slider__wrapper . В CSS это осуществляется посредством установки.slider__wrapper свойства overflow со значением hidden .
Slider__wrapper {
overflow: hidden;
}
Переход от одного слайда к другому осуществляется посредством CSS трансформаций. Для этого к.slider__items посредством кода JavaScript добавляется CSS свойство transform , значение которого содержит функцию translateX с определённым значением. Например, если данной функции указать в качестве значения -100%, то браузер осуществит переход к следующему слайду, а если наоборот, 100% - то к предыдущему.
Время и скорость, с которой будет осуществляться трансформация определяется с помощью CSS свойства transition:
Slider__items { transition: transform 0.7s ease; }
Логика работы слайдера:
"use strict"; var slideShow = (function () { return function (selector, config) { var _slider = document.querySelector(selector), // основный элемент блока _sliderContainer = _slider.querySelector(".slider__items"), // контейнер для.slider-item _sliderItems = _slider.querySelectorAll(".slider__item"), // коллекция.slider-item _sliderControls = _slider.querySelectorAll(".slider__control"), // элементы управления _currentPosition = 0, // позиция левого активного элемента _transformValue = 0, // значение транфсофрмации.slider_wrapper _transformStep = 100, // величина шага (для трансформации) _itemsArray = , // массив элементов _timerId, _indicatorItems, _indicatorIndex = 0, _indicatorIndexMax = _sliderItems.length - 1, _stepTouch = 50, _config = { isAutoplay: false, // автоматическая смена слайдов directionAutoplay: "next", // направление смены слайдов delayAutoplay: 5000, // интервал между автоматической сменой слайдов isPauseOnHover: true // устанавливать ли паузу при поднесении курсора к слайдеру }; // настройка конфигурации слайдера в зависимости от полученных ключей for (var key in config) { if (key in _config) { _config = config; } } // наполнение массива _itemsArray for (var i = 0, length = _sliderItems.length; i < length; i++) { _itemsArray.push({ item: _sliderItems[i], position: i, transform: 0 }); } // переменная position содержит методы с помощью которой можно получить минимальный и максимальный индекс элемента, а также соответствующему этому индексу позицию var position = { getItemIndex: function (mode) { var index = 0; for (var i = 0, length = _itemsArray.length; i < length; i++) { if ((_itemsArray[i].position < _itemsArray.position && mode === "min") || (_itemsArray[i].position > _itemsArray.position && mode === "max")) { index = i; } } return index; }, getItemPosition: function (mode) { return _itemsArray.position; } }; // функция, выполняющая смену слайда в указанном направлении var _move = function (direction) { var nextItem, currentIndicator = _indicatorIndex;; if (direction === "next") { _currentPosition++; if (_currentPosition > position.getItemPosition("max")) { nextItem = position.getItemIndex("min"); _itemsArray.position = position.getItemPosition("max") + 1; _itemsArray.transform += _itemsArray.length * 100; _itemsArray.item.style.transform = "translateX(" + _itemsArray.transform + "%)"; } _transformValue -= _transformStep; _indicatorIndex = _indicatorIndex + 1; if (_indicatorIndex > _indicatorIndexMax) { _indicatorIndex = 0; } } else { _currentPosition--; if (_currentPosition < position.getItemPosition("min")) { nextItem = position.getItemIndex("max"); _itemsArray.position = position.getItemPosition("min") - 1; _itemsArray.transform -= _itemsArray.length * 100; _itemsArray.item.style.transform = "translateX(" + _itemsArray.transform + "%)"; } _transformValue += _transformStep; _indicatorIndex = _indicatorIndex - 1; if (_indicatorIndex < 0) { _indicatorIndex = _indicatorIndexMax; } } _sliderContainer.style.transform = "translateX(" + _transformValue + "%)"; _indicatorItems.classList.remove("active"); _indicatorItems[_indicatorIndex].classList.add("active"); }; // функция, осуществляющая переход к слайду по его порядковому номеру var _moveTo = function (index) { var i = 0, direction = (index > _indicatorIndex) ? "next" : "prev"; while (index !== _indicatorIndex && i <= _indicatorIndexMax) { _move(direction); i++; } }; // функция для запуска автоматической смены слайдов через промежутки времени var _startAutoplay = function () { if (!_config.isAutoplay) { return; } _stopAutoplay(); _timerId = setInterval(function () { _move(_config.directionAutoplay); }, _config.delayAutoplay); }; // функция, отключающая автоматическую смену слайдов var _stopAutoplay = function () { clearInterval(_timerId); }; // функция, добавляющая индикаторы к слайдеру var _addIndicators = function () { var indicatorsContainer = document.createElement("ol"); indicatorsContainer.classList.add("slider__indicators"); for (var i = 0, length = _sliderItems.length; i < length; i++) { var sliderIndicatorsItem = document.createElement("li"); if (i === 0) { sliderIndicatorsItem.classList.add("active"); } sliderIndicatorsItem.setAttribute("data-slide-to", i); indicatorsContainer.appendChild(sliderIndicatorsItem); } _slider.appendChild(indicatorsContainer); _indicatorItems = _slider.querySelectorAll(".slider__indicators > li") }; var _isTouchDevice = function () { return !!("ontouchstart" in window || navigator.maxTouchPoints); }; // функция, осуществляющая установку обработчиков для событий var _setUpListeners = function () { var _startX = 0; if (_isTouchDevice()) { _slider.addEventListener("touchstart", function (e) { _startX = e.changedTouches.clientX; _startAutoplay(); }); _slider.addEventListener("touchend", function (e) { var _endX = e.changedTouches.clientX, _deltaX = _endX - _startX; if (_deltaX > _stepTouch) { _move("prev"); } else if (_deltaX < -_stepTouch) { _move("next"); } _startAutoplay(); }); } else { for (var i = 0, length = _sliderControls.length; i < length; i++) { _sliderControls[i].classList.add("slider__control_show"); } } _slider.addEventListener("click", function (e) { if (e.target.classList.contains("slider__control")) { e.preventDefault(); _move(e.target.classList.contains("slider__control_next") ? "next" : "prev"); _startAutoplay(); } else if (e.target.getAttribute("data-slide-to")) { e.preventDefault(); _moveTo(parseInt(e.target.getAttribute("data-slide-to"))); _startAutoplay(); } }); document.addEventListener("visibilitychange", function () { if (document.visibilityState === "hidden") { _stopAutoplay(); } else { _startAutoplay(); } }, false); if (_config.isPauseOnHover && _config.isAutoplay) { _slider.addEventListener("mouseenter", function () { _stopAutoplay(); }); _slider.addEventListener("mouseleave", function () { _startAutoplay(); }); } }; // добавляем индикаторы к слайдеру _addIndicators(); // установливаем обработчики для событий _setUpListeners(); // запускаем автоматическую смену слайдов, если установлен соответствующий ключ _startAutoplay(); return { // метод слайдера для перехода к следующему слайду next: function () { _move("next"); }, // метод слайдера для перехода к предыдущему слайду left: function () { _move("prev"); }, // метод отключающий автоматическую смену слайдов stop: function () { _config.isAutoplay = false; _stopAutoplay(); }, // метод запускающий автоматическую смену слайдов cycle: function () { _config.isAutoplay = true; _startAutoplay(); } } } }()); slideShow(".slider", { isAutoplay: true });
Код слайдера написан на «чистом» JavaScript, без использования библиотеки jQuery. Программный код структурирован и организован в виде «модуля».
Основные функции, выполняющие всю логику, используемые внутри модуля slideShow:
Данные функции организуют логику работу слайдера. Они доступны как было уже отмечено выше только внутри модуля, к ним нельзя обратиться вне его.
Здравствуйте, дорогие читатели блога. Сегодня представляю Вам полезную подборку бесплатных JQuery слайдеров с примерами . Если Вы всё таки надумали поставить слайдер изображений на свой ресурс, эта подборка Вам очень пригодится, и, поверьте, вам есть с чего выбрать. Тем более все слайдеры с примерами, и каждый из них Вы сможете попробовать в действии. В общем не буду отвлекать, выбирайте:-)
Самый обычный и не большой слайдер миниатюр на Вашем сайте.
Очень простой и интересный слайдер с миниатюрами, который подойдёт практически для любого дизайна.
Большой и очень красивый слайдер изображений, с интересным перелистыванием текста.
Самый обычный и простой слайдер на Ваш ресурс
Эффектный слайдер мимо которого нереально пройти.
Постой и стильный слайдер текста с изображениями и с красивым эффектом перелистывания.
Интересный скроллинг изображений, который непрерывно и плавно прокручивается. По умолчанию стоят изображения разных фруктов, которые можно изменить на свои.
Интересный слайдер с большими розовыми стрелками, которые меняют размер за счёт увеличения изображения.
В данной статье описан способ реализации и создания слайдера изображений или текста, с автоматическим перелистыванием. Функционал слайдера позволяет задавать интервал переключения между слайдами, скорость, эффект смены, а также выбор конкретного слайда из списка. В данном примере использовался классический метод смены изображений - появления и исчезновение слайдов.
timeList - скорость переключения слайда
TimeView - время показа
RadioBut - кнопки под слайдом, для быстрой навигации (radio buttons). По умолчанию true может принимать значение false .
А теперь давайте приступим! Создадим и откроем файл index.htm
Внимание! В данном примере использован текст для работы слайда, если вы хотите использовать изображение, то поместите каждую вашу картинку в тег .
В представленном коде как мы видим ничего сложного нет, slider-wrap определяет общее положение слайдера и выравнивает его по середине экрана. Параметр slider позиционирует, и задает высоту нашего слайда свойством height . Если будете использовать слайдер картинок, то укажите высоту картинок в данном свойстве, если высота картинок разная, то укажите максимальную.
Для наилучшей визуализации слайдера и привлекательности используйте одинаковое разрешение картинок.
Теперь нам необходимо стилизовать наш слайдер. Стрелки вперед/назад для переключения слайдов, а также радио кнопки под слайдером, использованы в виде картинок и прилагаются вместе с файлом. Создадим и откроем файл style.css и пропишем туда нужную нам разметку:
@import url("https://fonts.googleapis.com/css?family=Open+Sans|Roboto"); html, body { height: 100%; } body { color: #4f4f5a; font-family: "Roboto", sans-serif; font-size: 16px; padding: 0; margin: 0; } #slider-wrap { max-width:650px; margin: 100px auto; } #slider { position:relative; height: 200px; overflow: hidden; border:#fafafa solid 10px; } .slide { width:100%; height: 100%; position: absolute; top: 0; left: 0; text-align: center; padding-top: 40px; } .Radio-But { margin-top:10px; text-align:center; } .Radio-But .ctrl-select { display: inline-block; width: 16px; height: 16px; background: url("radioBg.png") center bottom no-repeat; margin: 2px; overflow: hidden; text-indent: -99999px; } .Radio-But .ctrl-select:hover { cursor: pointer; background-position: center center; } .Radio-But .ctrl-select.active{ background-position: center top; } #prewBut, #nextBut{ display: block; width: 40px; height: 100%; position: absolute; top: 0; overflow: hidden; text-indent: -99999px; background: url("arrowBg.png") left center no-repeat; opacity: 0.5; z-index: 3; outline: none !important; } #prewBut { left: 10px; } #nextBut { right: 10px; background: url("arrowBg.png") right center no-repeat; } #prewBut:hover, #nextBut:hover { opacity: 1; }
Если стрелочки вперед/назад мешают видимости вашего слайдера их можно сделать невидимыми, а появляться они будут, лишь при наведении на них. В параметрах prewBut и nextBut , задайте свойству opacity значение 0.
Создадим и откроем наш js-файл , в котором и будет код слайдера. Не забудьте подключить фреймворк jQuery, а также библиотеку jquery.ui - указанная библиотека нам необходима для того, чтобы задать элемент исчезновения и появление слайда. Заменить указанный эффект можно свойством fadeIn и fadeOut .
$(document).ready(function () { var timeList = 300; var TimeView = 5000; var RadioBut = true; $(".slide").hide().eq(0).show(); var slideNum = 0; var slideTime; slideCount = $("#slider .slide").length; var animSlide = function(arrow){ clearTimeout(slideTime); function slideDirectionHide(slideFloatNum, directTo){ $(".slide").eq(slideFloatNum).fadeOut(timeList); } function slideDirectionShow(slideFloatNum, directTo, pause){ $(".slide").eq(slideFloatNum).fadeIn(timeList, function() { if(pause == true) { rotator(); } }); } var old_slideNum = slideNum; if(arrow == "next"){ slideDirectionHide(slideNum, "left"); if(slideNum == (slideCount-1)){slideNum=0;} else{slideNum++} slideDirectionShow(slideNum, "right", true); } else if(arrow == "prew") { slideDirectionHide(slideNum, "right"); if(slideNum == 0){slideNum=slideCount-1;} else{slideNum-=1} slideDirectionShow(slideNum, "left", true); }else{ if(arrow !== old_slideNum) { if(arrow > old_slideNum) { slideDirectionHide(slideNum, "left"); slideNum = arrow; slideDirectionShow(slideNum, "right", true); }else if(arrow < old_slideNum) { slideDirectionHide(slideNum, "right"); slideNum = arrow; slideDirectionShow(slideNum, "left", true); } } } $(".ctrl-select.active").removeClass("active"); $(".ctrl-select").eq(slideNum).addClass("active"); } if(RadioBut){ var linkArrow = $("<>") .prependTo("#slider"); $("#nextBut").click(function(){ animSlide("next"); return false; }) $("#prewBut").click(function(){ animSlide("prew"); return false; }) } var addSpan =""; $(".slide").each(function(index) { addSpan += "" + index + ""; }); $("
Функция animSlide принимает три вида значений: next , prew , и числовое значение. Параметр next переключает следующий слайд, prew предыдущий, а числовое значение это конкретно выбранный слайд через радио кнопки под слайдом. Функции slideDirectionHide и slideDirectionShow почти схожи и идентичны, первая отвечает за исчезновение слайда и направление движения уходящего слайда, вторая за появление слайда, его направление движения при появлении, а также за заданный интервал времени показа.
При наведении курсора мыши на слайдер показ приостанавливаеться.
На этом все, если что-то не понятно или возникли вопросы, пишите и спрашивайте.
В этой статье разберём как можно очень просто с помощью CSS Flexbox и CSS трансформаций создать адаптивный слайдер для сайта.
Проект слайдера под названием chiefSlider расположен на GitHub. Перейти на него можно по этой ссылке .
Слайдер с одним активным слайдом (без зацикливания):
Слайдер с тремя активными слайдами (без зацикливания):
Пример, в котором показан как можно применить слайдер для ротации статей:
Перечислим основные преимущества данного слайдера:
Установка слайдера выполняется за 3 шага:
CSS и JavaScript код желательно минимизировать, это действие обеспечит более быструю загрузку страницы.
Создание слайдера chiefSlider будет состоять из создания HTML кода, CSS и JavaScript (без jQuery).
HTML код слайдера chiefSlider :
Как видно, слайдер имеет очень простую HTML архитектуру. Начинается она с основного блока, который имеет класс slider . Данный блок состоит из 3 элементов.
Первый элемент - это.slider__wrapper . Он выступает в качестве обёртки для элементов.slider__item (слайдов).
Остальные два элемента (.slider__control) визуально представляют собой кнопки. С их помощью будет совершаться навигация по слайду, т.е. переход к предыдущим и следующим элементам.
CSS код слайдера chiefSlider :
/* ОСНОВНЫЕ СТИЛИ */ .slider { position: relative; overflow: hidden; } .slider__wrapper { display: flex; transition: transform 0.6s ease; /* 0.6 длительность смены слайда в секундах */ } .slider__item { flex: 0 0 50%; /* определяет количество активных слайдов (в данном случае 2 */ max-width: 50%; /* определяет количество активных слайдов (в данном случае 2 */ } /* СТИЛИ ДЛЯ КНОПОК "НАЗАД" И "ВПЕРЁД" */ .slider__control { position: absolute; display: none; top: 50%; transform: translateY(-50%); align-items: center; justify-content: center; text-align: center; width: 40px; /* ширина кнопки */ height: 50px; /* высота кнопки */ opacity: .5; /* прозрачность */ background: #000; /* цвет фона */ } .slider__control_show { display: flex; } .slider__control:hover, .slider__control:focus { text-decoration: none; outline: 0; opacity: .9; /* прозрачность */ } .slider__control_left { left: 0; } .slider__control_right { right: 0; } .slider__control::before { content: ""; display: inline-block; width: 20px; /* ширина иконки (стрелочки) */ height: 20px; /* высота иконки (стрелочки) */ background: transparent no-repeat center center; background-size: 100% 100%; } .slider__control_left::before { background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23fff" viewBox="0 0 8 8"%3E%3Cpath d="M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z"/%3E%3C/svg%3E"); } .slider__control_right::before { background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23fff" viewBox="0 0 8 8"%3E%3Cpath d="M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z"/%3E%3C/svg%3E"); }
Как видно, CSS код слайдера тоже является не очень сложным . Основные определения, с помощью которых можно настроить внешний вид слайдера, снабжены комментариями .
CSS код, который определяет количество активных элементов :
/* определяет количество активных слайдов (в данном случае 2) */ flex: 0 0 50%; max-width: 50%;
Этот код устанавливает слайдеру число активных элементов, равное 2.
Для того чтобы слайдер, например, имел один активный элемент , эти определения необходимо изменить на следующие:
/* определяет количество активных слайдов (в данном случае 1) */ flex: 0 0 100%; max-width: 100%;
Создание адаптивного слайдера осуществляется посредством медиа запросов.
Например , слайдер, который на устройствах с крохотным экраном должен иметь один активный слайд, а на больших - четыре:
Slider__item { flex: 0 0 100%; max-width: 100%; } @media (min-width: 980px) { .slider__item { flex: 0 0 25%; max-width: 25%; } }
JavaScript код слайдера chiefSlider :
"use strict"; var multiItemSlider = (function () { return function (selector) { var _mainElement = document.querySelector(selector), // основный элемент блока _sliderWrapper = _mainElement.querySelector(".slider__wrapper"), // обертка для.slider-item _sliderItems = _mainElement.querySelectorAll(".slider__item"), // элементы (.slider-item) _sliderControls = _mainElement.querySelectorAll(".slider__control"), // элементы управления _sliderControlLeft = _mainElement.querySelector(".slider__control_left"), // кнопка "LEFT" _sliderControlRight = _mainElement.querySelector(".slider__control_right"), // кнопка "RIGHT" _wrapperWidth = parseFloat(getComputedStyle(_sliderWrapper).width), // ширина обёртки _itemWidth = parseFloat(getComputedStyle(_sliderItems).width), // ширина одного элемента _positionLeftItem = 0, // позиция левого активного элемента _transform = 0, // значение трансформации.slider_wrapper _step = _itemWidth / _wrapperWidth * 100, // величина шага (для трансформации) _items = ; // массив элементов // наполнение массива _items _sliderItems.forEach(function (item, index) { _items.push({ item: item, position: index, transform: 0 }); }); var position = { getMin: 0, getMax: _items.length - 1, } var _transformItem = function (direction) { if (direction === "right") { if ((_positionLeftItem + _wrapperWidth / _itemWidth - 1) >= position.getMax) { return; } if (!_sliderControlLeft.classList.contains("slider__control_show")) { _sliderControlLeft.classList.add("slider__control_show"); } if (_sliderControlRight.classList.contains("slider__control_show") && (_positionLeftItem + _wrapperWidth / _itemWidth) >= position.getMax) { _sliderControlRight.classList.remove("slider__control_show"); } _positionLeftItem++; _transform -= _step; } if (direction === "left") { if (_positionLeftItem <= position.getMin) { return; } if (!_sliderControlRight.classList.contains("slider__control_show")) { _sliderControlRight.classList.add("slider__control_show"); } if (_sliderControlLeft.classList.contains("slider__control_show") && _positionLeftItem - 1 <= position.getMin) { _sliderControlLeft.classList.remove("slider__control_show"); } _positionLeftItem--; _transform += _step; } _sliderWrapper.style.transform = "translateX(" + _transform + "%)"; } // обработчик события click для кнопок "назад" и "вперед" var _controlClick = function (e) { if (e.target.classList.contains("slider__control")) { e.preventDefault(); var direction = e.target.classList.contains("slider__control_right") ? "right" : "left"; _transformItem(direction); } }; var _setUpListeners = function () { // добавление к кнопкам "назад" и "вперед" обработчика _controlClick для события click _sliderControls.forEach(function (item) { item.addEventListener("click", _controlClick); }); } // инициализация _setUpListeners(); return { right: function () { // метод right _transformItem("right"); }, left: function () { // метод left _transformItem("left"); } } } }());
Основное действие в коде JavaScript выполняет функция _transformItem . Эта функция в зависимости от переданного ей направления выполняет трансформирование элемента.slider__wrapper .
Инициализация слайдера осуществляется следующим образом:
Var slider = multiItemSlider(".slider") Демо слайдера
Зацикливание слайдов можно выполнить посредством трансформирования элементов.slider__item .
Для этого необходимо к каждому элементу.slider__item привязать значения его текущей позиции и трансформации.
Наиболее оптимально эти действия можно выполнить с помощью массива _items:
Var _items = ; // наполнение массива элементами.slider__item _sliderItems.forEach(function (item, index) { _items.push({ item: item, position: index, transform: 0 }); });
Но связать данные с элементами можно выполнить не только посредством массива , а например, с помощью data-атрибутов . Но операции с DOM самые медленные и ресурсоёмкие, их не рекомендуется использовать, когда это можно выполнить как-то по-другому.
Следующий шаг - это создать функции для вычисления элементов.slider__item с минимальной и максимальной позицией.
Var position = { getItemMin: function () { var indexItem = 0; _items.forEach(function (item, index) { if (item.position < _items.position) { indexItem = index;` } }); return indexItem; }, getItemMax: function () { var indexItem = 0; _items.forEach(function (item, index) { if (item.position > _items.position) { indexItem = index; } }); return indexItem; }, getMin: function () { return _items.position; }, getMax: function () { return _items.position; } }
Последний основной шаг, который предстоит выполнить - это доработать функцию _transformItem
. А именно добавить к ней код, который будет изменять позицию элемента .slider__item
и выполнять его трансформацию.
Var _transformItem = function (direction) { var nextItem; if (direction === "right") { _positionLeftItem++; if ((_positionLeftItem + _wrapperWidth / _itemWidth - 1) > position.getMax()) { nextItem = position.getItemMin(); _items.position = position.getMax() + 1; _items.transform += _items.length * 100; _items.item.style.transform = "translateX(" + _items.transform + "%)"; } _transform -= _step; } if (direction === "left") { _positionLeftItem--; if (_positionLeftItem < position.getMin()) { nextItem = position.getItemMax(); _items.position = position.getMin() - 1; _items.transform -= _items.length * 100; _items.item.style.transform = "translateX(" + _items.transform + "%)"; } _transform += _step; } _sliderWrapper.style.transform = "translateX(" + _transform + "%)"; }На самом деле здесь всё просто.
Например, для того чтобы осуществить переход к следующему слайду сначала в массиве items ищется элемент с позицией большей, чем у текущего крайнего правого элемента.slider__item .
Если такой элемент в массиве есть , то выполняется трансформация элемента.slider__wrapper (т.е. действия, как и в алгоритме без зацикливания).
А вот если такого элемента нет , то кроме трансформации.slider__wrapper , выполняется ещё ряд действий . Во-первых , в массиве items ищется элемент с минимальной позицией . После получения этого элемента, ему устанавливается позиция, значение которой будет равно значению текущего правого элемента + 1 . Ну и конечно выполняется его трансформация , на такое количество процентов, чтобы он оказался в конце , т.е. после последнего элемента.
Для перехода к предыдущему слайду выполняются аналогичные действия, но наоборот.
Кроме этого для слайдера с зацикливанием не нужно переключать видимость кнопок "Влево" и "Вправо". Данные кнопки в этой версии слайдера будут отображаться всегда .
Чтобы это выполнить необходимо:
Запрограммировать автоматическую смену слайдов через определённые промежутки времени можно с помощью функции setInterval .
Var _cycle = function (direction) { if (!_config.isCycling) { return; } _interval = setInterval(function () { _transformItem(direction); }, _config.interval); }
Функция setInterval в этом примере будет запускать функцию _transformItem через определённые интервалы времени, равные значению переменой _config.interval .
Кроме этого остановку автоматической смены слайдов желательно ещё добавить при поднесении курсора к слайдеру.
Осуществить этот функционал можно следующим образом:
If (_config.pause && _config.isCycling) { _mainElement.addEventListener("mouseenter", function () { clearInterval(_interval); }); _mainElement.addEventListener("mouseleave", function () { clearInterval(_interval); _cycle(_config.direction); }); }
Отключить автоматическую смену слайдов целесообразно в двух случаях:
Обработку первого случая можно осуществить с помощью события visibilitychange .
Document.addEventListener("visibilitychange", _handleVisibilityChange, false);
Функция для обработчика события visibilitychange:
// обработка события "Изменения видимости документа" var _handleVisibilityChange = function () { if (document.visibilityState === "hidden") { clearInterval(_interval); } else { clearInterval(_interval); _cycle(_config.direction); } }
Вычисление видимости элемента можно организовать с помощью функции _isElementVisible:
Function _isElementVisible(element) { var rect = element.getBoundingClientRect(), vWidth = window.innerWidth || doc.documentElement.clientWidth, vHeight = window.innerHeight || doc.documentElement.clientHeight, elemFromPoint = function (x, y) { return document.elementFromPoint(x, y); }; if (rect.right < 0 || rect.bottom < 0 || rect.left > vWidth || rect.top > vHeight) { return false; } return (element.contains(elemFromPoint(rect.left, rect.top)) || element.contains(elemFromPoint(rect.right, rect.top)) || element.contains(elemFromPoint(rect.right, rect.bottom)) || element.contains(elemFromPoint(rect.left, rect.bottom))); }
Поместить вызов _isElementVisible можно, например, в начало функции _transformItem . Это действие позволит отменить автоматическую смену слайдов, если слайдер в данный момент находится вне viewport .
Var _transformItem = function (direction) { var nextItem; if (!_isElementVisible(_mainElement)) { return; } //...
Данный вариант адаптивного слайдера отличается от предыдущих тем, что он позволяет изменить количество активных элементов (слайдов) при изменении размеров окна браузера . Обычно пользователи не изменяют размер браузера, но всё же это может произойти.
Реализовано это с помощью использования события resize и массива _states . Массив используется для вычислений. Его применение позволит не выполнять переинициализацию слайдера, когда это не требуется.
В настоящее время слайдер – карусель – функционал, который просто необходимо иметь на сайте для бизнеса, сайте — портфолио или любом другом ресурсе. Наряду с полноэкранными слайдерами изображения, горизонтальные слайдеры – карусели хорошо вписываются в любой веб-дизайн.
Иногда слайдер должен занимать одну треть страницы сайта. Здесь слайдер — карусель используется с эффектами переходов и с адаптивными макетами. Сайты электронной коммерции используют слайдер – карусель для демонстрации множества фото в отдельных публикациях или страницах. Код слайдера можно свободно использовать и изменять его в соответствии с потребностями.
Используя JQuery совместно с HTML5 и CSS3 , можно сделать ваши страницы более интересными, снабдив их уникальными эффектами, и обратить внимание посетителей на конкретную область сайта.
Slick – свободно распространяемый jquery – плагин, разработчики которого утверждают, что их решение удовлетворит все ваши требования к слайдеру. Адаптивный слайдер – карусель может работать в режиме «плитки » для мобильных устройств, и, в режиме «перетаскивания » для десктопной версии.
Содержит эффект перехода «затухание », интересную возможность «режим в центре », ленивую загрузку изображений с автопрокруткой. Обновленный функционал включает в себя добавление слайдов и фильтр слайдов. Все для того, чтобы вы настроили плагин в соответствии с вашими требованиями.
Демо-режим | Скачать
В арсенале этого плагина – большой набор функций, подходящий как для новичков, так и для опытных разработчиков. Это обновленная версия слайдера — карусели. Его предшественник именовался точно также.
Слайдер имеет в своем составе некоторые встроенные плагины для улучшения общего функционала. Анимация, проигрывание видео, автозапуск слайдера, ленивая загрузка, автоматическая корректировка высоты – основные возможности Owl Carousel 2.0 .
Поддержка возможности drag and drop
включена для более удобного использования плагина на мобильных устройствах.
Плагин отлично подойдет для отображения больших изображений даже на маленьких экранах мобильных устройств.
Примеры | Скачать
Довольно маленький, но богатый по функционалу jquery плагин, который позволяет разместить на странице слайдер – карусель, обладающий небольшим ядром и не потребляющий множества ресурсов сайта. Плагин может быть использован для отображения вертикальных и горизонтальных слайдеров, с анимацией и созданием наборов изображений из галереи.
Примеры | Скачать
Ультра компактный jQuery слайдер – карусель, функционал которого намного больше, чем у обычного слайдера. Он включают в себя предварительный просмотр одного изображения, отображение нескольких изображений в виде карусели и слайдера на основе заголовков.
Примеры | Скачать
Owl carousel – слайдер с поддержкой сенсорных экранов и технологии drag and drop , легко встраиваемый в HTML — код. Плагин является одним из лучших слайдеров, которые позволяют создавать красивые карусели без какой — либо специально подготовленной разметки.
Примеры | Скачать
Использует 3D – переходы, основанные на CSS – стилях и немного Javascript кода.
Примеры | Скачать
Великолепная 3D карусель. Похоже, что это еще бета – версия, потому как я обнаружил пару проблем с ней буквально сейчас. Если вы заинтересованы в тестировании и создании ваших собственных слайдеров – эта карусель будет большим подспорьем.
Примеры | Скачать
Адаптивный слайдер – карусель с использованием технологии bootstrap как раз для вашего нового веб-сайта.
Примеры | Скачать
Наиболее востребованный на портфолио и бизнес сайтах. Подобный тип слайдера — карусели часто встречается на сайтах любого типа.
Примеры | Скачать
Это слайдер крошечного размера готов работать на устройствах с любым разрешением экрана. Слайдер может работать как в круговом, так и карусельном режиме. Tiny circle представлен как альтернатива другим слайдерам подобного типа. Имеется встроенная поддержка операционных систем IOS и Android .
В круговом режиме слайдер выглядит довольно интересно. Отлично реализована поддержка метода drag and drop и система автоматической прокрутки слайдов.
Примеры | Скачать
Мощный, адаптивный, слайдер карусельного типа отлично подойдет к современному сайту. Корректно работает на любых устройствах. Имеет горизонтальный и вертикальный режимы. Его размер минимизирован всего до 1 КБ. Ультра компактный плагин ко всему прочему имеет отличные плавные переходы.
Примеры | Скачать
Содержит более 50 эффектов, что может помочь вам в создании оригинального слайдера для вашего сайта.
Примеры | Скачать
Измените размер окна браузера, чтобы увидеть, как адаптируется слайдер. Bxslider поставляется более чем с 50 вариантами настроек и демонстрирует свои функции с различными эффектами переходов.
Примеры | Скачать
jCarousel — jQuery плагин, который поможет организовать просмотр ваших изображений. Вы сможете с легкостью создавать пользовательские карусели изображений из основы который показан в примере. Слайдер адаптивный и оптимизирован для работы на мобильных платформах.
Примеры | Скачать
Scrollbox компактный плагин для создания слайдера – карусели или текстовой бегущей строки. Основные функции включают в себя эффект вертикальной и горизонтальной прокрутки с паузой при наведении курсора мыши.
Примеры | Скачать
Простой слайдер – карусель. Если вам нужен быстрый плагин – этот подойдет на 100%. Поставляется только с основными функциями, необходимыми для работы слайдера.
Примеры | Скачать
Создатели Flexisel вдохновились плагином старой школы jCarousel , сделав его копию, ориентированную на корректную работу слайдера на мобильных и планшетных устройствах.
Адаптивный макет Flexisel , при работе на мобильных устройствах, отличается от макета, ориентированного на размер окна браузера. Flexisel отлично адаптирован к работе на экранах, как с низким, так и высоким разрешением.
Примеры | Скачать
Elastislide отлично адаптируется под размер экрана устройства. Вы можете задать минимальное количество отображаемых изображений при определенном разрешении. Хорошо работает в качестве слайдера – карусели с галерей изображений, используя фиксированную обертку совместно с эффектом вертикальной прокрутки.
Пример | Скачать
Свободно распространяемый слайдер от Woothemes . По праву считается одним из лучших адаптивных слайдеров. Плагин содержит несколько шаблонов и будет полезен как начинающим пользователям, так и экспертам.
Пример | Скачать
Amazing Carousel – адаптивный слайдер изображений на jQuery . Поддерживает множество систем управления сайтами, такие как WordPress , Drupal и Joomla . Также поддерживает Android и IOS и настольные варианты операционных систем без каких-либо проблем с совместимостью. Встроенные шаблоны amazing carousel позволяют использовать слайдер в вертикальном, горизонтальном и круговом режимах.
Примеры | Скачать