Сайт о телевидении

Сайт о телевидении

» » Адаптивный слайдер своими руками. Плагин «jQuery Slidy». Какие виды слайдеров бывают и где они могут понадобится

Адаптивный слайдер своими руками. Плагин «jQuery Slidy». Какие виды слайдеров бывают и где они могут понадобится

Но так как мы разбираем с вами основы JS, то для изучения базы я опишу, как создать простейший слайдер только при помощи языка JavaScript. Ну что ж, давайте приступим к разбору материала!

Какие виды слайдеров бывают и где они могут понадобится?

Создание удобных галерей для просмотра изображений требуется на всех веб-сервисах, где есть хоть какие-то фотографии. Это могут быть интернет-магазины, сайты-портфолио, новостные и обучающие сервисы, сайты компаний и развлекательных заведений с фотоотчетами и т.д.

Однако это стандартное применение слайдеров. Подобные технологии также используют для привлечения клиентов к акционным товарам, услугам или же для описания преимуществ предприятий.

В основном заказчики просят внедрять на галереи типа «Карусель». Это удобный инструмент для просмотра изображений в крупном размере с возможностью переключения юзером слайдов вперед и назад. При этом сами картинки обычно переключаются автоматически через определенное время. такой механизм прозвали из-за того, что показ картинок повторяется по кругу.

На сегодняшний день при желании в интернете можно найти самые необычные и привлекательные плагины для просмотра набора фотографий.

Самостоятельная деятельность

Ну а теперь займемся созданием своего слайдера. На данном этапе обучения для его реализации я предлагаю вам использовать чистый . Это будет автоматический переключатель картинок по кругу.

Ниже я прикрепил программный код своего приложения. По ходу кода я оставлял для вас комментарии.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72

Автоматический переключатель изображений /*Описываю внешний вид каркаса, основы для будущего слайдера */ #slides{ position: relative; height: 415px; width: 100%; padding: 0px; list-style-type: none; box-shadow: 0 0 7px #010, 0 0 10px blue, 0 0 15px #010, 0 0 35px #010; } /* Редактирую отображение картинок*/ img { width: auto; height: 390px; padding: 13px; } /*Указываю, что содержимое пунктов списка будет отображаться по центру элемента-родителя, т.е. в данном случае по центру элемента ul - основы для слайдов */ li { text-align: center; } /*Описываю внешний вид самих слайдов */ .slide{ position: absolute; opacity: 0; top: 0px; left: 0px; height: 100%; z-index: 3; width: 100%; background: blue; -moz-transition: opacity 1.5s; transition: opacity 1.5s; -webkit-transition: opacity 1.5s; } /*При отображении объект становится видимым и выдвигается на передний план*/ .showing{ opacity: 1; z-index: 4; }

var MySlider = document.querySelectorAll("#slides .slide"); var currentPicture = 0; var IntervalForChange = setInterval(nextSlide,2700); function nextSlide(){ MySlider.className = "slide"; currentPicture = (currentPicture+1)%MySlider.length; MySlider.className = "slide showing"; }

Я надеюсь, что никаких проблем с кодом на css и html у вас не возникло. А вот работу скрипта я считаю нужным разобрать. Поэтому давайте перейдем к расшифровке написанного.

Итак, сначала при помощи метода querySelectorAll переменной MySlider я присваиваю список всех элементов в переделах указанных. Указывает это запись

document.querySelectorAll ("#slides .slide")

Таким образом, в MySlider хранится коллекция из четырех элементов.

Далее я задаю, с какого изображения начинать показ, присваивая переменной currentPicture нуль. После указываю, что смена слайдов происходит через 2,7 секунды и при этом должна быть вызвана функция обработки nextSlide .

Переходим к самой функции.

Изначально для текущего элемента списка я меняю описание классов, т.е. переписываю «slide showing » на «slide ». Следовательно, изображение становится невидимым.

Теперь определяю новый элемент коллекции, который будет отображаться на экране. Для этого я беру текущую позицию +1. Вы могли заметить, что я также использую деление с остатком (%) на количество имеющихся слайдов. Этот финт ушами необходим для того, чтобы запустить показ по новому кругу. Вот как это будет выглядеть буквально:

А вот теперь полученному элементу присваиваю описание классов «slide showing ». Как видите, все реализуется проще простого.

Спасибо за внимание. Не забывайте вступать в группу моих подписчиков, читать новые статьи и конечно же делиться ссылками на понравившиеся публикации с друзьями. Желаю удачи в изучении JavaScript. Пока-пока!

С уважением, Роман Чуешов

Прочитано: 256 раз

То иногда приходится решать задачи, связанные с фронтэндом, несмотря на то, что я его недолюбливаю 🙂

О моём отношению к всему, что связано с «прекрасным» вы, собственно говоря, могли оценить по дизайну данного сайта, который разрабатывался мною единолично 🙂

Однако, сравнительно недавно я столкнулся с необходимостью реализации слайдера на JavaScript, причём сделать это нужно было без каких-либо готовых библиотек и даже без всеми любимого jQuery.

Вызвана данная необходимость была тем, что в результате должен был получиться JS скрипт, который через сторонний сервис подключался бы на сайт. Следовательно, готовые карусели на JavaScript сразу отпадали, т.к. для их интеграции нужно было в HTML код сайта добавлять подключение библиотеки через тэг script и копировать сами файлы либы на сервер или тянуть их по cdn, но для этого снова потребовалось бы править код ресурса.

Как сделать JavaScript слайдер: начало

Сегодня, думаю, что каждый, кто попадал в похожую ситуацию, начинал с поисков имеющихся наработок, т.к. когда задача сделать JS карусель стоит в рамках работы — это всегда должно быть сделано максимально быстро. И при таких условиях сидеть и выдумывать свои велосипеды, ясное дело, никто не позволит.

Заказчикам всегда наплевать на то, как код написан, какая у него архитектура, главное — видеть результат!

В итоге, как вы поняли, перед тем, как написать слайдер на JavaScript без jQuery, я решил подыскать готовый и доработать его под свои нужды. Почему без jQuery? Да потому что на целевом ресурсе, куда я планировал подключать свой слайдер через сервис, вызов jQuery в коде был расположен позже скрипта, подключаемого сервисом. Поэтому jQuery конструкции в моём коде просто не воспринимались.

В качестве основы я взял этот JavaScript слайдер изображений — https://codepen.io/gabrieleromanato/pen/pIfoD.

Остановиться я решил именно на нём, т.к. его JS код был написан с применением принципов ООП и классы в нём основываются на прототипах, а не на банальных функциях.

Честно говоря, я глубоко не понимаю и не признаю сегодняшнюю шумиху вокруг JavaScript с использование ООП, фреймворков и прочих архитектурных штук в языке, который изначально задумывался как простенький язык динамических сценариев. Равно как и сам JS я откровенно недолюбливаю с его синтаксическим винегретом, позволяющим одни и те же конструкции писать несколькими способами.

Но, к сожалению, в современном мире мои позиции мало кто разделяет, т.к. данный язык развивается сумасшедшими темпами и предпринимает даже попытки завоевать умы бэкенд разработчиков с помощью Node.js как альтернативы Java, PHP, C#, Ruby и других монстров.

В итоге, чтобы банально не остаться без работы, приходится по-тихоньку с JavaScript разбираться. А в выбранной мною реализации слайдера на чистом JavaScript я встретил то, что, как вы поняли, презираю в данном языке. Поэтому я её и выбрал, чтобы был хоть какой-то повод поработать и разобраться с JavaScript ООП и прототипными классами — иначе я бы к ним добровольно никогда в жизни не прикоснулся бы 🙂

На базе найденного мною кода мне необходимо было разработать слайдер на чистом JS во всплывающем окне (такую штуку ещё называют popup, попап и т.д.), который имел бы кнопки переключения слайдов и кликабельные индикаторы текущего слайда. Также нужно было сделать кнопку для закрытия данного окна.

Вот, что у меня получилось в итоге.

Делаем библиотеку JS слайдера

Сперва я решил всё реализовать по уму и сделать JavaScript слайдер для сайта в виде библиотеки, подключаемой на сайт одним-единственным скриптом, в котором будут вызываться компоненты слайдера, разбитые по подкаталогам. Назвать её я решил popupSlider.js в честь её изначального предназначения.

Её код можно найти на GitHub по этому адресу — https://github.com/Pashaster12/popupSlider.js

Структура библиотеки вышла следующая:

Папка slides предназначена для картинок слайдов. В controls размещены картинки элементов управления JS каруселью (кнопки закрытия слайдера и переключения слайдов). А в assets — статические элементы JS слайдера: HTML разметка и файл с CSS стилями.

Ну, а файл popupSlider.js — это и есть сердце самой библиотеки, в котором прописаны действия JavaScript карусели и устанавливается связь с остальными файлами. Именно его мы и будем подключать на сайте, а он уже будет вызывать остальные.

Я решил начать с HTML разметки нашей JS карусели картинок, которая в моём случае выглядит так:

Text 1 Text 2 Text 3

Для оформления слайдера на JavaScript в виде попапа я использовал следующие стили:

#slider { margin: auto; width: 600px !important; overflow: hidden; } #slider-wrapper { width: 9999px; height: 343px; position: relative; transition: left 400ms linear; } .slide { float: left; width: 600px; position: relative; overflow: hidden; } .caption { width: 600px; height: 110px; line-height: 1.5; font-size: 15px; font-weight: 300; text-align: center; color: #000; display:table; } .caption-container { display: table-cell; vertical-align: middle; padding: 0 20px; } #slider-nav { position: absolute; bottom: -36px; text-align: center; left: 50%; transform: translateX(-50%); } #slider-nav a { width: 8px; height: 8px; text-decoration: none; color: #000; display: inline-block; border-radius: 50%; margin: 0 5px; background-color: #fafafa; } #slider-nav a.current { background-color: #337ab7; } .horizontal-controls { position: absolute; display: inline-block; width: 12px; height: 20px; top: 50%; margin-top: -10px; } #prev { background: url(../controls/arrow_left_inactive.png); left: -40px; } #prev:hover { background: url(../controls/arrow_left_active.png); } #next { background: url(../controls/arrow_right_inactive.png); right: -40px; } #next:hover { background: url(../controls/arrow_right_active.png); } #cq-popup { width: 600px; z-index: 23; left: calc(50%); top: calc(50%); position: fixed !important; background-repeat: no-repeat; background-position: right; background-color: #fff; font-family: "Roboto","Segoe UI","Helvetica","Georgia","Calibri","Verdana"; transform: translate(-50%, -50%) scale(1); } #cq-popup .header { display: inline-block; font-size: 17px; font-weight: 500; } #cq-popup > div { width: 500px; font-size: 22px; line-height: 36px; } #cq-popup-btclose { text-decoration: none; position: absolute; right: -40px; top: 0; background: url(../controls/btn_delete_inactive.png); height: 16px; width: 16px; } #cq-popup-btclose:hover { background: url(../controls/btn_delete_active.png); } #cq-popup-bg { position: fixed; top:0; width: 100%; height: 100%; background: rgba(51,51,51,0.8); z-index: 22; }

В результате применения данных стилей JS карусель выглядит следующим образом:

И HTML разметку, и CSS стили я вынес в отдельные файлы popupSlider.html и popupSlider.css, которые расположены в директории assets библиотеки слайдера на JavaScript. Я сделал это специально, чтобы пользователи при использовании данного кода могли без проблем корректировать разметку и оформление, не лазя в JS коде, где вынесенное нужно было бы прописать напрямую.

Кроме того, многие ещё любят минимизировать JS для ускорения загрузки сайта. Так что кастомизировать данное решение при указанных условиях было бы очень сложно.

В итоге, я решил просто подключать готовые файлы в главном файле библиотеки popupSlider.js, который для моей постановки задачи принял следующий вид:

Function Slider(element) { this.loadStatic(); this.el = document.querySelector(element); this.init(); } Slider.prototype = { init: function () { this.links = this.el.querySelectorAll("#slider-nav a"); this.wrapper = this.el.querySelector("#slider-wrapper"); this.nextBtn = this.el.querySelector("#next"); this.prevBtn = this.el.querySelector("#prev"); this.navigate(); }, navigate: function () { var self = this; for (var i = 0; i < this.links.length; ++i) { var link = this.links[i]; link.addEventListener("click", function (e) { self.slide(this); }); } self.prevBtn.style.display = "none"; self.nextBtn.addEventListener("click", function (e) { var currentSlideNumber = document.querySelector("#slider-nav a.current").getAttribute("data-slide"); var nextSlide = document.querySelector(""); nextSlide.click(); }, false); self.prevBtn.addEventListener("click", function (e) { var currentSlideNumber = document.querySelector("#slider-nav a.current").getAttribute("data-slide"); var prevSlide = document.querySelector(""); prevSlide.click(); }, false); self.close(); }, slide: function (element) { this.setCurrentLink(element); var index = parseInt(element.getAttribute("data-slide"), 10) + 1; var currentSlide = this.el.querySelector(".slide:nth-child(" + index + ")"); this.wrapper.style.left = "-" + currentSlide.offsetLeft + "px"; if (index < this.links.length) this.nextBtn.style.display = "block"; else if (index == this.links.length) this.nextBtn.style.display = "none"; if (index > 1) this.prevBtn.style.display = "block"; else if (index == 1) this.prevBtn.style.display = "none"; }, setCurrentLink: function (link) { var parent = link.parentNode; var a = parent.querySelectorAll("a"); link.className = "current"; this.currentElement = link; for (var j = 0; j < a.length; ++j) { var cur = a[j]; if (cur !== link) { cur.className = ""; } } }, loadStatic: function () { var self = this; var link = document.createElement("link"); link.rel = "stylesheet"; link.href = "assets/popupSlider.css"; document.head.appendChild(link); var sliderHTML = ""; var xhr = new XMLHttpRequest(); xhr.open("GET", "assets/popupSlider.html", false); xhr.send(); if (xhr.status != 200) { alert("Can not load the popupSlider.html. Got the error " + xhr.status + ": " + xhr.statusText); } else { sliderHTML = xhr.responseText; } var div = document.createElement("div"); div.innerHTML = sliderHTML; document.body.appendChild(div); }, close: function () { document.getElementById("cq-popup-btclose").onclick = function () { document.getElementById("cq-popup-bg").remove(); document.getElementById("cq-popup").remove(); } } };

Немного комментариев по поводу приведённого кода. Содержимое файла popupSlider.js является одним JavaScript классом Slider, который, как и в PHP, содержит конструктор и методы класса. Только в JS определение конструктора, в отличие от PHP, является обязательным.

Конструктор определяется с помощью следующей конструкции:

Function Slider(element) { //код конструктора }

Внутри конструктора должны быть прописаны действия, которые будут выполняться при создании объекта класса.

Сами методы класса будут находиться внутри прототипа и будут доступны для всех экземпляров данного JavaScript класса. JS прототип в моём случае описывается следующей конструкцией:

Slider.prototype = { //методы }

Вызываться за пределами тела класса они будут следующим образом:

Var slider = new Slider(); slider.class_method();

А внутри самого кода класса доступен следующий способ:

This.class_method();

Главное только не забывать, что в JavaScript значение this зависит от контекста вызова, поэтому в телах некоторых методов, в которых нужно было вызывать методы и свойства класса, присутствует такая конструкция:

Var self = this; self.class_method(); //чтобы обратиться к методу, находящемся на уровень выше кода описываемого метода

Вроде обо всех нюансах написания кода я рассказал. Теперь пару слов о методах нашего JavaScript класса, внутри которых содержатся описания действий JS карусели картинок.

loadStatic()

Самый первый метод, вызывающийся при создании экземпляра класса в конструкторе. Отвечает за добавление в HTML кода страницы сайта HTML разметки слайдера и файла со стилями.

Сначала в памяти создаётся новый тэг link с помощью JavaScript функции document.createElement() и ему присваиваются значения всех необходимых атрибутов, в том числе и путь к CSS файлу со стилями JS слайдера. И, в конце-концов, он добавляется в HTML страницы с помощью JavaScript метода appendChild() в конец секции head, где и должны стилей.

Далее мы делаем то же самое для файла с HTML разметкой нашего слайдера на чистом JavaScript. Вот только здесь есть маленький нюанс: просто так HTML файл внутри такого же подключить нельзя, как мы сделали это с CSS файлом. Для этого есть специальные библиотеки, например, для того, чтобы подключить HTML в HTML, отлично подходит либа от w3.org — https://www.w3schools.com/howto/howto_html_include.asp

Но тогда её пришлось бы или подключать в саму библиотеку слайдера, или просить о самостоятельной её установке пользователей. Но всё это неоптимально, т.к. требует много телодвижений и замедляет скорость загрузки сайта за счёт дополнительных скриптов.

В итоге, я решил получать содержимое HTML файла внутри JavaScript кода и загружать его в новый div элемент, создаваемый в памяти, как я делал это ранее для подключения CSS файла в JavaScript. Сгенерированный элемент подключается в самый конец секции body HTML кода страницы сайта.

Если хотите вставить div с разметкой слайдера не просто в конец body, а в какой-то конкретный контейнер, то можете вместо следующего кода:

Var div = document.createElement("div"); div.innerHTML = sliderHTML; document.body.appendChild(div);

Прописать следующее, указав нужный идентификатор целевого контейнера (в моём случае HTML JS слайдера будет расположен в элементе с id popupSlider):

Var target = document.querySelector("#popupSlider"); target.innerHTML = sliderHTML;

Метод, который вызывается в конструкторе после loadStatic(), и нужен для инициализации свойств класса, соответствующих основным HTML элементам, к которым мы будем обращаться в следующем коде.

В конце вызывается метод navigate().

navigate()
В данном методе происходит указание действий, происходящих при клике на кнопки переключения слайдов и элементы навигации, расположенные под самим слайдером, в виде кружочков.

Сам JavaScript код смены слайдов для удобства я вынес в отдельный метод slide(), а в данном я только навешиваю его на событие click для каждой круглой кнопки в цикле.

При клике на кнопки «предыдущий слайд»/»следующий слайд» я, как видите, решил всего лишь эмулировать нажатие на соответствующий кружочек, определяя нужный относительно текущего, у которого имеется CSS класс current.

slide(element)

Метод, «отвечающий за магию» самой JavaScript карусели, в котором содержится код, меняющий слайды местами. В самом начале вызывается метод setCurrentLink(), о котором мы поговорим чуточку позже.

В качестве входного параметра в него передаётся объект кнопки навигации JS слайдера в виде кружочка.

Само переключение слайдов работает следующим образом:

  • Все слайды у нас оформлены в виде блоков одинаковых размеров, идущих друг за другом. Окно слайдера — это лишь видимая часть элемента, содержащего все слайды.
  • Мы определяем смещение левого края текущего слайда от левого края родительского элемента с помощью свойства offsetLeft.
  • И сдвигаем родительский элемент на это значение, чтобы в окне слайдера у нас отображался необходимый элемент.
  • В конце метода описано поведение для кнопок «предыдущий слайд»/»следующий слайд», оформленных в виде стрелок влево/вправо соответственно. Если текущий слайд — первый из всего списка, то кнопка перехода к предыдущему слайду скрывается. Если последний, то убираем кнопку перехода к следующему слайду.

    setCurrentLink(link)

    Данный метод нашего класса JavaScript слайдера отвечает за подсветку навигационной круглой кнопки, соответствующей текущему элементу. Т.е. если у нас выбран второй слайд, то будет подсвечиваться вторая кнопочка.

    В качестве входного параметра в функцию передаётся объект кнопки, которая должна быть выделена как текущая.

    Логика выделения текущего элемента проста:

  • Получаем объект родительского элемента, которым в нашем случае выступает контейнер с идентификатором slider-nav .
  • Получаем все навигационные элементы в виде массива ссылок.
  • Выделяем элемент, полученный на входе, путём добавления ему классу current .
  • В цикле перебираем все навигационные элементы и у всех, кроме текущего, очищаем значение класса. Это нужно для того, чтобы снять выделение с элемента, которым был текущим до данного вызова функции.
  • Самый последний метод класса, в котором определяется действие при нажатии на кнопку закрытия слайдера в виде крестика. Здесь, собственно говоря, код самый понятный из всего, содержащегося в классе JS слайдера.

    При нажатии на кнопку закрытия, доступ к которой получается по её идентификатору, происходит удаление со страницы элемента слайдера и элемента, задающего полупрозрачный фон. Они также, в свою очередь, получаются по уникальным идентификаторам.

    Сам метод вызывается внутри описанного ранее navigate(), который содержит в себе все сценарии действий, происходящих на нашем JavaScript слайдере.

    Кстати, если вы захотите сделать закрытие слайдера при клике за его пределами, то достаточно в данный метод добавить следующий код:

    Document.getElementById("cq-popup-bg").onclick = function () { document.getElementById("cq-popup-bg").remove(); document.getElementById("cq-popup").remove();

    JavaScript слайд шоу на базе разработанной библиотеки

    Иногда на практике может потребоваться сделать JS карусель с прокруткой, которую часто называют слайд шоу. В моём случае этого не требовалось, но я всё же решил сделать такую на базе итогового кода библиотеки для случая, когда это может пригодиться.

    На самом деле, реализация JavaScript слайд шоу отличается от обычного слайдера совсем незначительно. Разница заключается лишь в том, что в слайд шоу слайды переключаются автоматически с заданным временным интервалом, а в случае обычной JS карусели они меняются вручную с помощь элементов навигации.

    SlideShow: function (timeout) { var sliderCount = this.links.length; var self = this; this.slideCycle = setInterval(function () { var currentSlideNumber = document.querySelector("#slider-nav a.current").getAttribute("data-slide"); var slideId = parseInt(currentSlideNumber, 10) + 1; self.slide(document.querySelector("")); }, timeout); }

    Что здесь происходит — думаю, понятно. Для создания данного метода я скопировал код из события клика на кнопки ручного переключения слайдов и разместил его внутри вызова JavaScript функции setInterval(), которая выполняет указанное действие через заданный промежуток времени.

    Сценарий действия передаётся первым аргументом в виде анонимной функции, а временной интервал — вторым, который я решил сделать в виде переменной, значение которой передаётся при вызове slideShow().

    Единственная модификация кода внутри setInterval(), которая потребовалась, — это определение количества слайдов и сравнение с ним индекса текущего слайда для зацикленности автоматического переключения.

    Ну, и для того, чтобы данный код заработал, сам метод необходимо вызвать. Я решил сделать это всё в том же navigate(), который как раз и является сборником всяких сценариев. Вызов я разместил в самом конце, передав в качестве аргумента значение временного интервала для автоматической смены слайдов в нашем JS слайд шоу (я выбрал 2000 милисекунд или 2 секунды, вы можете по необходимости изменять это число):

    Self.slideShow(2000);

    После этого проверяйте работу JavaScript слайдера, не забыв при этом почистить и браузера.

    По идее, всё должно работать. Если нет — изучайте ошибки в консоли браузера и делитесь ими в комментариях.

    В итоге, у нас получилось JS слайд шоу, в котором слайды переключаются автоматически и по кругу, т.е. при достижении последнего слайда шоу переходит на новый цикл, и показ снова начинается с самого первого элемента.

    При работе с различными библиотеками JS каруселей картинок и отзывов я заметил, что данную практику разработчики активно применяют, но с некоторым дополнением. Во всех увиденных мною решениях автоматический показ слайдов прерывается, если пользователь сделал ручное переключение. Поэтому я решил сделать подобное и в своей библиотеке.

    Для прерывания автоматического показа слайдов JavaScript карусели я решил воспользоваться стандартной JS функцией clearInterval(), которой в качестве аргумента передаю идентификатор временного интервала, возвращаемого функцией setInterval() при его установке.

    В итоге, получился следующий код, который я решил не оформлять отдельным методом:

    ClearInterval(self.slideCycle);

    И разместил его в местах описания действий при кликах на различные элементы навигации, т.е. в следующих:

    Link.addEventListener("click", function (e) {...}); self.prevBtn.addEventListener("click", function (e) {...}); self.nextBtn.addEventListener("click", function (e) {...});

    Вызов clearInterval() лучше делать поближе к самому событию клика, главное, чтобы перед ним, а не после.

    Интеграция JavaScript слайдера на сайт

    Итак, наш слайдер на чистом JS готов. Осталось теперь только подключить его на сайт.

    Для этого необходимо выполнить последовательно следующие шаги, которые являются стандартными действиями при интеграции каких-либо сторонних JavaScript библиотек вообще.

    Шаг 1 . Копируем файлы библиотеки к себе на сайт в отдельный каталог.
    Шаг 2 . Добавляем следующий код в HTML страниц, на которых необходимо будет отображение слайдера, разместив его перед закрывающимся тэгом body:

    Шаг 3 . Размещаем следующий код вызова JS карусели в каком-либо существующем JavaScript файле, который подключается на странице после подключения самого слайдера:

    Var aSlider = new Slider("#slider");

    Как видите, данный код, — это, по сути, создание объекта класса Slider, который содержится в popupSlider.js. Именно поэтому его вызов должен быть только после подключения самого файла класса на страницу.

    Добавление новых слайдов в JavaScript карусель

    Здесь всё очень просто. Поскольку слайды у нас берутся из отдельной директории библиотеки slides , то при добавлении новых картинок нужно будет просто закинуть в неё нужные файлы, задав им предварительно такой же размер, как и у других.

    А затем в коде файла assets/popupSlider.html добавить новый блок в контейнер с id slider-wrapper :

    Text

    В принципе, можете просто скопировать аналогичный существующий и изменить в нём путь к файлу изображения и текст подписи (если она вообще будет нужна).

    Также необходимо будет добавить новый элемент навигации в виде кружочка, т.к. на данный момент автоматическое его добавление пока не реализовано. Для этого нужно будет добавить следующий код в контейнер с id slider-nav , прописав его в самом конце:

    Значение атрибута data-slide должно быть больше самого большого у остальных элементов. Достаточно всего лишь увеличить максимальное текущее на единицу.

    Упаковка JS карусели в единый скрипт

    Всё, слайдер на JavaScript готов и подключен. Я лично рекомендую использовать данный вариант на практике, если он вам вообще пригодится 🙂

    Для ускорения работы его, кстати, можете ещё дополнительно сжать статические компоненты: CSS, HTML и JavaScript файлы. Я не стал этого делать и предлагать вам минифицированный код, потому что систем сборок фронтэнда сейчас очень много: Gulp, Grunt, Webpack и другие. И у каждой из них свои алгоритмы сжатия и подключения файлов.

    К тому же, минифицированные результаты на разных ОС могут работать по-разному. В общем, причин много.

    Да и сами исходники у меня вышли, я считаю, не такие уж тяжеловесные, что нуждаются в данной процедуре. Но если же вам они будут необходимы, то настройте минификацию самостоятельно с учётом вашей ОС и сборщика.

    Как я писал в самом начале, для решения поставленной мне изначально задачи нужно было получить единый JS файл для корректного использования моего слайдера через сторонний сервис на сайте. По этой причине я, собственно говоря, и не стал пользоваться готовыми сторонними библиотеками.

    Тогда вариант единого скрипта JavaScript карусели вам придётся как нельзя кстати, т.к. весь контент будет содержаться прямо в нём, в том числе и HTML/CSS код, который в случае библиотеки хранится в отдельных файлах.

    Скрипт в моём случае состоит из двух частей. В первой части располагалось содержимое файла popupSlider.js, которое я второй раз не буду приводить. Вставьте его самостоятельно, убрав из кода класса описание метода loadStatic() и его вызов, т.к. они нам не понадобятся.

    Вторая же часть единого скрипта JavaScript слайдера для сайта представляет собой обработчик события DOMContentLoaded, которое наступает при загрузке содержимого страницы.

    Там у нас будет происходить добавление на страницу HTML/CSS кода JS карусели и создание объекта класса Slider, что равносильно активации самого слайдера.

    Схематично код выглядит следующим образом:

    /* содержимое popupSlider.js без описания метода loadStatic() и его вызова */ document.addEventListener("DOMContentLoaded", function(){ var str = "\ \ /*css код*/ \ /* html код */ "; var div = document.createElement("div"); div.innerHTML = str; document.body.appendChild(div); var aSlider = new Slider("#slider");

    Поскольку в моём случае вариант загрузки файлов на сервер был вообще закрыт, мне пришлось загрузить файлы картинок элементов управления JavaScript каруселью на облако и вместо путей к ним в HTML и CSS коде прописать ссылки, сгенерированные при сохранении.

    Если у вас таких сложностей нет, то можете ничего не менять, но не забыть скопировать каталоги slides и controls библиотеки на сервер и указать правильные пути к ним.

    Самописный JS слайдер — перспективы развития

    Честно скажу, что заниматься целенаправленной поддержкой и развитием созданного мною решения я заниматься не планирую 🙂 На данный момент подобных слайдеров существует вагон и маленькая тележка, которые, в отличие от моего имеют свою историю, тщательно оттестированы и поддерживаются обширным комьюнити пользователей и разработчиков.

    Мне же начинать весь этот путь с нуля в одиночку и создавать ещё один велосипед как-то не интересно, да и времени на это толком нет. Но, зато данный JavaScript слайдер является отличной возможностью попрактиковаться в разработке путём рефакторинга его кода и реализации новых интересных функций, которых, возможно, на данный момент ещё нет.

    Так что если вам, как и мне, нужна будет кодовая база для экспериментов и вы располагаете хоть каким-то лишним свободным временем — копируйте себе код описанного мною JavaScript слайдера или присоединяйтесь к контрибьюторам на GitHub. Репозиторий открытый, а ссылку на него я предоставил в начале статьи.

    Если вы хотите прокачать свои фронтэнд скилы на моём творении, могу вам даже подкинуть небольшой список правок и доработок, в которых нуждается код и которые, возможно, будут интересны вам в плане их реализации:

  • сделать внешний конфиг, чтобы можно было удобно настраивать слайдер;
  • сделать возможность встраивания слайдера внутрь страницы (сейчас оформлен только в виде попапа);
  • асинхронная загрузка HTML кода (сейчас сделана синхронная, которая многими браузерами помечается как устаревший вариант);
  • оформить библиотеку в виде пакета, NPM, Bower или другого пакета, чтобы его можно было устанавливать и оперировать зависимостями с помощью пакетных менеджеров;
  • сделать вёрстку адаптивной для использования JS карусели на различных устройствах;
  • сделать переключение слайдов по событию Swipe для мобильных пользователей.
  • Приведённый мною список правок, естественно, не конечный и может быть дополнен. Пишите о своих предложениях, мыслях и пожеланиях в комментариях под статьёй и делитесь со своими друзьями через социальные сети, чтобы их также привлечь к разработке.

    Прошу мой код строго не судить, т.к., я как я уже говорил, Frontend спецом я себя не считаю и не являюсь. Также я открыт для всех ваших замечаний по стилю кодирования и надеюсь, что смогу что-то у вас перенять, а вы — у меня, т.е. выполнить основное предназначение разработки и поддержки OpenSource продукции.

    Вступайте в сообщества проекта, подписывайтесь на обновления и можете даже помочь мне материально с помощью формы прямо под самой статьёй, если я чем-то смог вам помочь или вам просто нравится то, чем я занимаюсь 🙂

    У меня всё! Всем добра! 🙂

    Время не стоит на месте а с ним и прогресс. Это затронуло и просторы интернета. Уже можно заметить как меняется внешний вид сайтов, особенно большой популярностью пользуется адаптивный дизайн. И в связи с этим появилось не мало новых адаптивных jquery слайдеров , галерей, каруселей или подобных плагинов.
    1. Responsive Horizontal Posts Slider

    Адаптивная горизонтальная карусель с детальной инструкцией по установке. Выполнена она в простом стиле, но вы можете ее стилизовать под себя.

    2. Слайдер на Glide.js

    Этот слайдер подходит для любого сайта. Тут используется Glide.js с открытым кодом. Цвета слайдера можно легко изменить.

    3. Tilted Content Slideshow

    Адаптивный слайдер с контентом. Изюминкой данного слайдера является 3d эффект изображений, а также разные анимации появления в случайном порядке.

    4. Слайдер с использованием HTML5 canvas

    Очень красивый и впечатляющий слайдер с интерактивными частицами. Выполнен он с помощью HTML5 canvas,

    5. Слайдер «Морфинг изображений»

    Слайдер с эффектом морфинга (Плавная трансформация из одного объекта к другому). В данном примере слайдер хорошо подойдет для портфолио веб-разработчика или веб-студии в виде портфолио.

    6. Круговой слайдер

    Слайдер в виде круга с эффектом переворота изображения.

    7. Слайдер с размытым фоном

    Адаптивный слайдер с переключением и размытием заднего фона.

    8. Адаптивный фэшн слайдер

    Простой, легкий и адаптивный слайдер для сайта.

    9. Slicebox - jQuery 3D image slider (ОБНОВЛЕННЫЙ)

    Обновленная версия Slicebox slider с исправлениями и новыми возможностями.

    10.Free Animated Responsive Image Grid

    Плагин JQuery для создания гибкой сетки изображения, который будет переключать снимки, используя различные анимации и тайминги. Это может хорошо смотреться в качестве фона или декоративного элемента на сайте, так как мы можем настроить выборочное появление новых изображений и их переходов. Плагин выполнен в нескольких вариантах.

    11. Flexslider

    Универсальный бесплатный плагин для вашего сайта. Этот плагин выполнен в нескольких вариантах слайдера и каруселях.

    12. Фоторама

    Fotorama - это универсальный плагин. У него есть много настроек, все работает быстро и легко, есть возможность просмотра слайдов на весь экран. Слайдер можно использовать как в фиксированном размере так и адаптивном, с миниатюрами и без, с круговой прокруткой и без и еще много чего.

    P.S. Ставил слайдер несколько раз и считаю что он один из лучших

    13. Бесплатная и адаптивная 3D галерея-слайдер с миниатюрами.

    Экспериментальная галерея-слайдер 3DPanelLayout с сеткой и интересными эффектами анимации.

    14. Слайдер на css3

    Адаптивный слайдер выполнен при помощи css3 с плавным появлением контента и легкой анимацией.

    15. WOW Slider

    WOW Slider - это слайдер изображений с потрясающими визуальными эффектами.

    17. Elastic

    Эластичный слайдер с полной адаптивностью и с миниатюрами слайдов.

    18. Slit

    Это полноэкранный адаптивный слайдер с использованием анимации css3. Выполнен слайдер в двух вариантах. анимация сделана достаточно необычно и красиво.

    19. Адаптивная фотогалерея plus

    Простой бесплатный слайдер-галерея с подгрузкой изображений.

    20. Адаптивный слайдер для WordPress

    Адаптивный бесплатный слайдер для WP.

    21. Parallax Content Slider

    Слайдер с эффектом параллакса и контролем каждого элемента с помощью CSS3.

    22. Слайдер с привязкой музыки

    Слайдер с использованием открытого исходного кода JPlayer. Этот слайдер напоминает презентацию с музыкой.

    23. Слайдер с jmpress.js

    Адаптивный слайдер основан на jmpress.js и поэтому позволит использовать некоторые интересные 3D эффекты к слайдам.

    24. Fast Hover Slideshow

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

    25. Image Accordion with CSS3

    Аккордеон изображений с помощью css3.

    26. A Touch Optimized Gallery Plugin

    Это адаптивная галерея которая оптимизирована для тач-устройств.

    27. 3D Галерея

    3D Wall Gallery - создана для браузера Safari, где будет виден 3D эффект. Если смотреть на другом браузере то функциональность будет в порядке но небудет виден 3D эффект.

    28. Слайдер с пагинацией

    Адаптивный слайдер с нумерацией страниц с помощью ползунка JQuery UI. идея состоит в том чтобы чтобы использовать простую концепцию навигации. Есть возможность перемотки всех изображений или послайдового переключения.

    29.Image Montage with jQuery

    Автоматическое расположение изображений в зависимости от ширины экрана. Очень полезная штука при разработке сайта портфолио.

    30. 3D Gallery

    Простенький 3D круговой слайдер на css3 и jQuery.

    31. Полноэкранный режим с 3D эффектом на css3 и jQuery

    Слайдер с возможностью полно-экранного просмотра изображений с красивым переходом.

    Уже несколько раз меня просили рассказать, как сделать слайдер на JS, а я все не рассказывал. Главная причина - потому что не знал, как.

    В какой-то момент я понял, что слайдер иногда проще написать, чем искать готовый. Поэтому хочу предложить вам урок по созданию такого слайдера. Его легко сделать своими руками, а код занимает меньше 2 Кб.

    Задача

    Создать слайдер изображений. Размеры роли не играют, только изображения должны быть одинакового размера. Перед подключением скрипта не забудьте подключить jQuery:

    Создание слайдера

    Для управления слайдером будет использоваться меню с белыми кружками, активная закладка будет зеленой. Меню создается динамически. Задача вебмастера - создать список из изображений и присвоить правильные классы. На странице можно располагать любое количество слайдеров, работе друг друга они не мешают.

    Код слайдера будет таким:

    Для управления слайдером нужен такой код:

    $(document).ready(function() { $(".slider").each(function () { // обрабатываем каждый слайдер var obj = $(this); $(obj).append(""); $(obj).find("li").each(function () { $(obj).find(".nav").append(""); // добавляем блок навигации $(this).addClass("slider"+$(this).index()); }); $(obj).find("span").first().addClass("on"); // делаем активным первый элемент меню }); }); function sliderJS (obj, sl) { // slider function var ul = $(sl).find("ul"); // находим блок var bl = $(sl).find("li.slider"+obj); // находим любой из элементов блока var step = $(bl).width(); // ширина объекта $(ul).animate({marginLeft: "-"+step*obj}, 500); // 500 это скорость перемотки } $(document).on("click", ".slider .nav span", function() { // slider click navigate var sl = $(this).closest(".slider"); // находим, в каком блоке был клик $(sl).find("span").removeClass("on"); // убираем активный элемент $(this).addClass("on"); // делаем активным текущий var obj = $(this).attr("rel"); // узнаем его номер sliderJS(obj, sl); // слайдим return false; });

    А стили для слайдера нужны такие:

    .slider { z-index: 9; width: 700px; height: 290px; overflow: hidden; margin: 0 0 7px; position: relative; } .slider ul, .slider li { padding: 0; margin: 0; list-style-type: none; } .slider ul { width: 9999px; } .slider ul li { list-style-type: none; float: left; width: 700px; height: 290px; } .slider .nav { position: absolute; left: 15px; bottom: 12px; } .slider .nav span { opacity: 0.9; background: #fff; margin: 0 8px 0 0; width: 16px; height: 16px; border-radius: 8px; cursor: pointer; overflow: hidden; display: block; float: left; box-shadow: 0 1px 2px #000; } .slider .nav span.on { background: #2e9419; }

    Как видите, код предельно прост. Я специально не делал разные стили переходов, а остановился именно на простом перематывании слайдов. Кроме того, автоматически слайды меняться не будут. Не знаю, кого как, но меня раздражает любая анимация на странице, которая производится без моего ведома.

    Начну с того, что данная статья написана с целью рассказать о том, каким образом создается слайдер прокрутки изображений для веб-страниц. Эта статья ни в коем случае не несет обучающий характер, она лишь служит примером того, как можно реализовать наш объект рассмотрения. Код, предоставленный в этой статье вы можете использовать как некий шаблон для подобных разработок, надеюсь, что мне удастся достаточно подробно и доступно донести до читателя всю суть мною написанного.



    А теперь к делу, не так давно мне нужно было поставить слайдер на один сайт, но поискав в интернете готовые скрипты я не нашел ничего путного, т.к. какие-то работали не так как мне нужно, а другие и вовсе не запускались без ошибок в консоли. Использовать jQuery – плагины для слайдера мне показалось уж слишком неинтересным, т.к. я этим хоть и решу задачу, но у меня не останется понимания о работе сего механизма, да и использовать плагин ради одного слайдера не очень-то и оптимально. Разбираться в кривых скриптах мне также было не очень-то и охота, потому я и решил написать свой собственный скрипт для слайдера, который сам и размечу как мне нужно.


    Для начала нам необходимо определиться с логикой работы самого слайдера, а потом уже приступать к реализации, на этом этапе очень важно четкое понимание работы этого механизма, потому что без него нам не написать кода, работающего в точности так, как мы хотим.


    Главным объектом у нас будет viewport , то есть блок, в котором мы будем видеть, как крутятся наши картинки, в нем у нас будет slidewrapper , это будет нашим блоком, содержащим в себе все изображения, выстроенными в одну линию, и который будет менять свою позицию внутри самого viewport .


    Далее, по бокам внутри viewport , вертикально посередине, будут располагаться кнопки назад и вперед, при клике на которые мы также будем менять позицию нашего slidewrapper относительно viewport , тем самым вызывая эффект пролистывания картинок. И, наконец, последним объектом будут наши кнопочки навигации, находящиеся в нижней части viewport .


    При клике по ним, мы просто будем смотреть на порядковый номер этой кнопочки и двигать на нужный нам слайд опять же путем смещения slidewrapper (смещение будет производиться через изменение css-свойства transform , значение которого будет постоянно вычисляться).


    Думаю, логика работы всего этого дела должна быть понятна после выше мною изложенного, но если всё же где-то возникли недопонимания, то ниже в коде все прояснится, нужно лишь немного терпения.


    А теперь давайте же писать! Первым делом откроем наш index-файл и пропишем туда нужную нам разметку:



    Как видим, ничего сложного, block-for-slider служит как раз таки блоком, в который наш слайдер будет помещен, внутри него уже сам viewport , в котором находится наш slidewrapper , он же вложенный список, здесь li являются слайдами, а img – картинками внутри них. Прошу обратить внимание на то, что все картинки должны быть одного размера или, хотя бы, пропорций, иначе слайдер будет криво смотреться, т.к. его размеры на прямую зависят от пропорций изображения.


    Теперь нам необходимо стилизовать все это дело, обычно стили особо не комментируют, но я решил все-таки заострить на этом внимание, чтобы в дальнейшем не происходило недопонимания.


    body { margin: 0; padding: 0; } #block-for-slider { width: 800px; margin: 0 auto; margin-top: 100px; } #viewport { width: 100%; display: table; position: relative; overflow: hidden; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; -o-user-select: none; user-select: none; } #slidewrapper { position: relative; width: calc(100% * 4); top: 0; left: 0; margin: 0; padding: 0; -webkit-transition: 1s; -o-transition: 1s; transition: 1s; -webkit-transition-timing-function: ease-in-out; -o-transition-timing-function: ease-in-out; transition-timing-function: ease-in-out; } #slidewrapper ul, #slidewrapper li { margin: 0; padding: 0; } #slidewrapper li { width: calc(100%/4); list-style: none; display: inline; float: left; } .slide-img { width: 100%; }

    Начнем с block-for-slider , это, повторюсь, наш блок на странице, который мы отведем под слайдер, его высота будет зависеть от его ширины и от пропорций нашего изображения, т.к. viewport занимает всю ширину block-for-slider , то и сам slide имеет такую же ширину, а, соответственно, и картинка внутри него меняет свою высоту в зависимости от ширины (пропорции сохраняются). Этот элемент на своей странице я расположил горизонтально по середине, сверху отступил 100px, сделав его позицию более удобной для примера.


    Элемент viewport , как уже говорилось, занимает всю ширину нашего block-for-slider , он имеет свойство overflow:hidden , оно позволит нам скрыть нашу ленту изображений, которая вылазит за рамки viewport.


    Следующее css-свойство - user-select:none , позволяет избавится от синего выделения отдельных элементов слайдера при многочисленных кликах по кнопкам.


    Переходим к slidewrapper , почему же position:relative , а не absolute ? Все очень просто, т.к. если мы выберем второй вариант, то при свойстве viewport overflow:hidden нам ни покажется ровно ничего, т.к. сам viewport не станет подстраиваться под высоту slidewrapper , из-за чего будет иметь height:0 . Почему ширина имеет такое значение и зачем мы ее вообще задаем? Дело в том, что наши слайды будут иметь ширину, равную 100% от viewport , а чтобы расставить их в линию, нам нужно место, где они будут стоять, таким образом ширина slidewrapper должна равняться 100% ширины viewport , умноженной на количество слайдов (в моем случае на 4). Что касается transition и transition-timing-function , то здесь 1s значит, что смена смена положения slidewrapper будет происходить в течении 1 секунды и мы будем это наблюдать, а ease-in-out – вид анимации, при котором она сначала идет медленно, ускоряется до середины, а после снова замедляется, здесь вы уже можете установить значения по своему усмотрению.


    Следующий блок свойств задает slidewrapper и его дочерним элементам нулевые отступы, здесь комментарии излишни.


    Далее мы стилизуем наши слайды, их ширина должна равняться ширине viewport , но т.к. они находятся в slidewrapper , ширина которого равна ширине viewport умноженной на кол-во слайдов, то чтобы получить ширину viewport снова, нам нужно 100% от ширины slidewrapper поделить на кол-во слайдов (в моем случае, опять же, на 4). После превратим их в строчные элементы при помощи display:inline и зададим обтекание слева, добавив свойство float:left . Про list-style:none я могу сказать, что использую его для того чтобы убрать дефолтный маркер у li , в большинстве случаев является неким стандартом.


    Со slide-img все просто, картинка будет занимать всю ширину slide , slide подстроится под ее высоту, slidewrapper подстроится под высоту slide , а высота viewport в свою очередь примет значение высоты slidewrapper , таким образом высота нашего слайдера будет зависеть от пропорций изображения и размеров блока, предоставленного под слайдер, о чем я уже и писал выше.


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


    Откроем наш js-файл , в котором и будет код слайдера, не забудьте подключить jQuery , т.к. писать мы будем при помощи этого фреймворка. Я, к слову, на момент написания статьи, использую версию jQuery 3.1.0 . Сам же файл со скриптом необходимо подключить в самом конце тега body , т.к. мы будем работать с DOM-элементами, которые необходимо инициализировать в первую очередь.


    Пока что нам нужно объявить пару переменных, одна будет хранить в себе номер слайда, который мы видим в определенный момент времени во viewport , я назвал ее slideNow , а вторая будет хранить количество этих самых слайдов, это slideCount .


    var slideNow = 1; var slideCount = $("#slidewrapper").children().length);

    Переменной slideNow необходимо задать начальное значение 1, т.к. при загрузке страницы мы, исходя из нашей разметки, будем видеть первый слайд во viewport .


    В slideCount мы поместим количество дочерних элементов slidewrapper , тут все логично.
    Далее необходимо создать функцию, которая как раз-таки и будет отвечать за переключение слайдов справа налево, объявим ее:


    function nextSlide() { }

    Ее мы будем вызывать в основном блоке нашего кода, до которого мы еще доберемся, а пока что скажем нашей функции, что ей нужно делать:


    function nextSlide() { if (slideNow == slideCount || slideNow slideCount) { $("#slidewrapper").css("transform", "translate(0, 0)"); slideNow = 1; } else { translateWidth = -$("#viewport").width() * (slideNow); $("#slidewrapper").css({ "transform": "translate(" + translateWidth + "px, 0)", "-webkit-transform": "translate(" + translateWidth + "px, 0)", "-ms-transform": "translate(" + translateWidth + "px, 0)", }); slideNow++; } }

    Для начала мы проверяем, находимся ли мы сейчас на последнем слайде нашей ленты? Для этого мы берем количество всех наших слайдов при помощи $("#slidewrapper").children().length и сверяем его с номером нашего слайда, если они оказываются равными, то это значит что нам нужно начать показывать ленту заново, с 1 слайда, а значит меняем css-свойство transform у slidewrapper на translate(0, 0) , таким образом смещая его в исходное положение, чтобы в нашем поле зрения оказался первый слайд, не забудем также про –webkit и –ms для адекватного кроссбраузерного отображения (см. справочник по css-свойствам ). После этого не забудем обновить значение переменной slideNow , сообщив ей, что в поле зрения находится слайд номер 1: slideNow = 1;


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


    Если же первое условие не выполняется, то это говорит о том, что мы на данный момент не находимся ни на последнем слайде, ни на каком-то несуществующем, а значит нам необходимо переключиться на следующий, сделаем мы это путем смещения slidewrapper влево на значение, равное ширине viewport , смещение снова будет происходить через знакомое нам свойство translate , значение которого будет равным "translate(" + translateWidth + "px, 0)" , где translateWidth – расстояние, на которое смещается наш slidewrapper . Кстати, объявим эту переменную вначале нашего кода:


    var translateWidth = 0;

    После перехода на следующий слайд скажем нашему slideNow, что мы видим следующий по счету слайд: slideNow++;


    На данный момент у некоторых читателей может возникнуть вопрос: почему мы не заменили $("#viewport").width() на какую-нибудь переменную, например slideWidth , чтобы всегда иметь под рукой ширину нашего слайда? Ответ очень прост, если наш сайт адаптивный, то, соответсвтенно, блок, выделенный под слайдер тоже адаптивный, исходя из этого можно понять, что при изменении размеров ширины окна без перезагрузки страницы (например, поворот телефона на бок), ширина viewport изменится, а, соответсвенно, изменится и ширина одного слайда. В таком случае наш slidewrapper будет смещаться на значение той ширины, которая была изначально, а значит картинки будут отображаться частями или вовсе не отображаться во viewport . Записав в нашу функцию $("#viewport").width() вместо slideWidth мы заставляем ее при каждом переключении слайдов вычислять ширину viewport , тем самым обеспечивая при резком изменении ширины экрана докрутку до нужного нам слайда.


    Впрочем-то, функцию мы написали, теперь необходимо вызывать ее через определенный интервал времени, интервал мы тоже можем хранить в переменной, чтобы при желании его изменить, поменять лишь одно значение в коде:


    var slideInterval = 2000;

    Время в js указывается в миллисекундах.


    Теперь напишем такую конструкцию:


    $(document).ready(function () { setInterval(nextSlide, slideInterval); });

    Тут все проще некуда, мы через конструкцию $(document).ready(function () {}) говорим о том, что следующие действия необходимо выполнять после полной загрузки документа. Далее же мы просто вызываем функцию nextSlide с интервалом, равным slideInterval , при помощи встроенной функции setInterval .


    После всех действий, которые мы выполнили выше, наш слайдер должен прекрасно крутиться, если же у вас что-то пошло не так, то проблема может быть либо в версии jQuery , либо в неправильном подключении каких-либо файлов. Также не нужно исключать, что вы могли допустить где-либо ошибку в коде, так что могу лишь посоветовать все перепроверить.


    Тем временем двигаемся дальше, добавим к нашему слайдеру такую функцию, как остановка прокрутки при наведении курсора, для этого нам необходимо прописать в основном блоке кода (внутри конструкции $(document).ready(function () {})) такую вещь:


    $("#viewport").hover(function(){ clearInterval(switchInterval); },function() { switchInterval = setInterval(nextSlide, slideInterval); });

    Чтобы начать анализировать этот код, нам нужно знать, что такое switchInterval . Во-первых, это переменная, в которой хранится периодический вызов функции nextSlide, попросту говоря, мы эту строчку кода: setInterval(nextSlide, slideInterval); , превратили в эту: switchInterval = setInterval(nextSlide, slideInterval); . После этих манипуляций наш основной блок кода принял следующий вид:


    $(document).ready(function () { var switchInterval = setInterval(nextSlide, slideInterval); $("#viewport").hover(function(){ clearInterval(switchInterval); },function() { switchInterval = setInterval(nextSlide, slideInterval); }); });

    Здесь я использую событие hover , что означает «при наведении», это событие позволяет отследить тот момент, когда я навожу курсор на какой-либо объект, в данном случае на viewport .


    После наведении я очищаю интервал, который укажу в скобках (это наш switchInterval ), далее, через запятую, я пишу, что я буду делать, когда отведу курсор обратно, в этом блоке я снова присваиваю нашему switchInterval периодический вызов функции nextSlide .


    Теперь, если мы проверим, то увидим, как наш слайдер реагирует на наведение курсора, останавливая переключение слайдов.


    Вот и пришло время добавлять кнопки к нашему слайдеру, начнем с кнопок вперед-назад.


    Первым делом разметим их:



    Поначалу данная разметка может быть непонятной, скажу сразу, что обернул эти две кнопки в один div с классом prev-next-btns просто для своего удобства, вы можете этого не делать, результат от этого не изменится, сейчас мы добавим им стили и все станет ясно:


    #prev-btn, #next-btn { position: absolute; width: 50px; height: 50px; background-color: #fff; border-radius: 50%; top: calc(50% - 25px); } #prev-btn:hover, #next-btn:hover { cursor: pointer; } #prev-btn { left: 20px; } #next-btn { right: 20px; }

    Сначала мы позиционируем наши кнопки через position:absolute , тем самым будем свободно управлять их положением внутри нашего viewport , далее укажем размеры этих кнопок и при помощи border-radius закруглим углы так, чтобы эти кнопки превратились в круги. Цвет их будет белый, то есть #fff , а их отступ от верхнего края viewport будет равен половине высоты этого viewport минус половина высоты самой кнопки (в моем случае 25px), таким образом мы сможем их расположить вертикально по центру. Далее мы укажем, что при наведении на них, наш курсор изменится на pointer и, в конце концов, сообщим нашим кнопкам по отдельности, что они должны отступать от своих краев на 20px, чтобы мы могли их видеть так, как нам было бы удобно.


    Повторюсь, что стилизовать элементы страницы вы можете так, как хотите, я лишь привожу пример тех стилей, которые я решил использовать.


    После стилизации наш слайдер должен выглядеть примерно вот так:


    Далее, снова переходим в наш js-файл , где мы опишем работу наших кнопок. Что ж, добавим еще одну функцию, она будет показывать нам предыдущий слайд:


    function prevSlide() { if (slideNow == 1 || slideNow slideCount) { translateWidth = -$("#viewport").width() * (slideCount - 1); $("#slidewrapper").css({ "transform": "translate(" + translateWidth + "px, 0)", "-webkit-transform": "translate(" + translateWidth + "px, 0)", "-ms-transform": "translate(" + translateWidth + "px, 0)", }); slideNow = slideCount; } else { translateWidth = -$("#viewport").width() * (slideNow - 2); $("#slidewrapper").css({ "transform": "translate(" + translateWidth + "px, 0)", "-webkit-transform": "translate(" + translateWidth + "px, 0)", "-ms-transform": "translate(" + translateWidth + "px, 0)", }); slideNow--; } }

    Она называется prevSlide , вызываться она будет только при клике на prev-btn . Сначала делаем проверку на то, находимся ли мы на 1-ом слайде или нет, здесь мы также проверяем, не вышел ли наш slideNow за границы реального диапазаона наших слайдов и, в случае, если какое-то из условий сработает, перместимся на последний слайд, сместив slidewrapper на нужное нам значение. Это значение мы вычислим по формуле: (ширина одного слайда)*(кол-во слайдов – 1), все это берем со знаком минус, т.к. смещаем его влево, получается, что viewport теперь будет показывать нам последний слайд. В конце этого блока нам также нужно сказать переменной slideNow , что сейчас в нашем поле зрения находится последний слайд.


    Если же мы не находимся на первом слайде, то нам нужно сместиться на 1 назад, для этого опять же меняем свойство transform у slidewrapper . Формула такая: (ширина одного слайда)*(номер текущего слайда – 2), все это, опять же, берем со знаком минус. Но почему же -2, а не -1, нам же нужно переместиться как раз таки на 1 слайд назад? Дело в том, что если мы находимся, скажем, на 2-ом слайде, то переменная x свойства transform:translate(x,0) нашего slidewrapper уже равна ширине одного слайда, если мы ему скажем, что от номера текущего слайда нужно отнять 1, то снова получим единицу, на которую уже смещен slidewrapper , поэтому нужно будет смещать на 0 этих самых ширин viewport , а значит на slideNow - 2.



    Теперь нам осталось внести в основной блок кода эти строки:


    $("#next-btn").click(function() { nextSlide(); }); $("#prev-btn").click(function() { prevSlide(); });

    Тут мы просто отслеживаем, был ли произведен клик на наши кнопки, и в этом случае вызываем нужные нам функции, все просто и логично.


    Теперь добавим кнопки навигации по слайдам, снова возвращаемся в разметку:



    Как видим, внутри viewport появился вложенный список, дадим ему идентефикатор nav-btns , внутри него li – наши кнопочки навигации, им присвоим класс slide-nav-btn , впрочем-то с разметкой можно и закончить, приступаем к стилям:


    #nav-btns { position: absolute; width: 100%; bottom: 20px; padding: 0; margin: 0; text-align: center; } .slide-nav-btn { position: relative; display: inline-block; list-style: none; width: 20px; height: 20px; background-color: #fff; border-radius: 50%; margin: 3px; } .slide-nav-btn:hover { cursor: pointer; }

    Блоку nav-btns , в котором находятся наши кнопочки, даем свойство position:absolute , для того, чтобы он не растянул viewport по высоте, т.к. у slidewrapper свойство position:relative , ширину в 100% мы задаем, чтобы при помощи text-align:center сцентрировать кнопки горизонтально относительно viewport , далее c помощью свойства bottom даем понять нашему блоку, что он от нижнего края должен находиться на расстоянии в 20px.


    С кнопками мы делаем тоже самое, что и со слайдами, но при этом теперь задаем им display:inline-block , т.к. при display:inline они не реагируют на width и height , т.к. находятся в абсолютно позиционированном блоке. Цвет их сделаем белый и при помощи уже знакомого нам border-radius придадим им форму круга. При наведении на них поменяем вид нашего курсора для привычного отображения.


    А теперь приступаем уже к jQuery – части :
    Для начала объявим переменную navBtnId, в которой будет храниться индекс кликнутой нами кнопки:


    var navBtnId = 0;
    $(".slide-nav-btn").click(function() { navBtnId = $(this).index(); if (navBtnId + 1 != slideNow) { translateWidth = -$("#viewport").width() * (navBtnId); $("#slidewrapper").css({ "transform": "translate(" + translateWidth + "px, 0)", "-webkit-transform": "translate(" + translateWidth + "px, 0)", "-ms-transform": "translate(" + translateWidth + "px, 0)", }); slideNow = navBtnId + 1; } });

    Здесь мы при клике по нашему slide-nav-btn вызываем функцию, которая в первую очередь присваивает переменной navBtnId индекс кликнутой кнопки, то есть ее порядковый номер, так как отсчет начинается с нуля, то если мы кликаем на вторую кнопку, то в navBtnId записывается значение 1. Далее мы делаем проверку, где прибавляем к порядковому номеру кнопки единицу, чтобы получить такое число, будто отсчет шел не с 0, а с 1, сравниваем это число с номером текущего слайда, если они совпадают, то мы не будем предпринимать никаких действий, ведь нужный слайд уже во viewport .


    Если же нужный нам слайд находится не в поле зрения viewport , то вычислим расстояние, на которое нам нужно сдвинуть slidewrapper влево, далее меняем значение css-свойства transform на translate (то самое расстояние в пикселях, 0). Это мы уже делали не раз, поэтому вопросов возникнуть не должно. В конце снова сохраняем значение текущего слайда в переменную slideNow , это значение можно вычислить, прибавив к индексу кликнутой кнопки единицу.


    На этом, собственно, все, если что-то не понятно, то я оставляю ссылку на jsfiddle, где будет предоставлен весь код, написанный в материале.




    Спасибо за внимание!

    Теги:

    • jquery slider
    • css
    • css3 animation
    • html
    Добавить метки