Блог для начинающих веб разработчиков. HTML, СSS, Jquery, Drupal и другое.

→ Делаем простой слайдер на jQuery

Опубликовано: 13 апреля 2012

Некоторое время назад, я начал осваивать jQuery. Думаю, все знают, что так называется самая популярная библиотека для разработки и создания сценариев (скриптов) на JavaScript. С её помощью очень просто создавать эффектные и интерактивные элементы сайта.

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

Итак, какие особенности нашего слайдера на jQuery (который я назвал HWSlider) можно отметить?

  • Простота использования и оформления – я хотел создать простой сценарий без наворотов, поэтому, я не использовал анимации на CSS3, а код получился очень универсальным  и понятным.
  • Возможность вставлять в слайды как изображения, так и любой HTML – код.
  • Возможность прокручивать слайды как по порядку (вперёд - назад), так и выбирать каждый слайд (1,2,3,4…)
  • Автоматически формирующиеся ссылки (предыдущий – следующий, и с номерами слайдов). Вам нужно лишь вставить нужное количество div-ов, а всё остальное рассчитается само. Ну и можно отметить, что количество слайдов неограниченно.

Скрипт совместим со всеми современными браузерами: IE, Opera, Firefox, Safari, Chrome, (т.к. слайдер не использует CSS3).

ДемоСкачать

Начнём с HTML разметки. В нужное место html страницы или шаблона нужно вставить.

<div id="slider-wrap">
	<div id="slider">
		<div class="slide">Здесь содержание слайда 1</div>
		<div class="slide">Здесь содержание слайда 2</div>
		<div class="slide">Здесь содержание слайда 3</div>
	</div>
</div>

Здесь всё просто, как видно, вы можете вставлять сколько угодно слайдов путём создания новых div-ов. Внутрь их можно вставлять любой html код, например картинку или блок с текстом. Не забудьте только подключить саму библиотеку на jQuery в вместе со всеми js - скриптами. Если не знаете как, смотрите в примере.

Далее рассмотрим CSS. Это разметка стилей для нашего jQuery - слайдера. Вставьте код, что приведён ниже в файл стилей (css - файл) вашего сайта или темы.

#slider-wrap{ /* Оболочка слайдера и кнопок */
	width:660px; 
	}
#slider{ /* Оболочка слайдера */
	width:640px;
	height:360px;
	overflow: hidden;
	border:#eee solid 10px;
	position:relative;}
.slide{ /* Слайд */
	width:100%;
	height:100%;
	}
.sli-links{ /* Кнопки смены слайдов */
	margin-top:10px;
	text-align:center;}
.sli-links .control-slide{
	margin:2px;
	display:inline-block;
	width:16px;
	height:16px;
	overflow:hidden;
	text-indent:-9999px;
	background:url(radioBg.png) center bottom no-repeat;}
.sli-links .control-slide:hover{
	cursor:pointer;
	background-position:center center;}
.sli-links .control-slide.active{
	background-position:center top;}
#prewbutton, #nextbutton{ /* Ссылка "Следующий" и "Педыдущий" */
	display:block;
	width:15px;
	height:100%;
	position:absolute;
	top:0;
	overflow:hidden;
	text-indent:-999px;
	background:url(arrowBg.png) left center no-repeat;
	opacity:0.8;
	z-index:3;
	outline:none !important;}
#prewbutton{left:10px;}
#nextbutton{
	right:10px;
	background:url(arrowBg.png) right center no-repeat;}
#prewbutton:hover, #nextbutton:hover{
	opacity:1;}

Давайте разберём его подробнее. Сначала мы даём основному блоку с идентификатором "slider-wrap", нужную ширину. Так как в него вставляются все остальные блоки, то высоту можно не задавать, она будет зависеть от того, что будет внутри. Затем нам нужно задать размеры контейнера в котором будут находиться слайды. Это – #slider. Зададим ему ширину и высоту, а так же, к примеру, границу в 10 пикселей. Здесь ширина – 640px это меньше чем ширина родителя, так как мы добавляем границы шириной по 10px справа и слева. От ширины этого div-а так же зависит и ширина самих слайдов ( .slide).

И последнее: нам нужно обязательно задать position:relative для контейнера слайдов так как слайды внутри - с абсолютным позиционированием. Для самих слайдов в CSS задаётся только ширина и высота. Остальные свойства задаются уже в jQuery скрипте.

Селектор .sli-links это блок, в котором будут находится кнопки перехода на необходимый слайд. Эти кнопки представляют из себя простые элементы вида <span class="control-slide">номер</span>, которые вставятся в необходимом количестве автоматически, вместе и с их родителем .sli-links. Для кнопок мы задаём красивый вид, а именно делаем каждую кнопку квадратной, выравниваем их все по центру, а так же, благодаря overflow:hidden и text-indent:-9999px, убираем текст, оставляя только фоновые иконки, которые так же меняются при наведении на этот элемент курсора. Для удобства я использовал спрайты, что уменьшило количество изображений.

Далее оформляется активная кнопка. Просто изменяем положение фона. Затем переоформим ссылки для перехода на сдедующий и предыдущий слайды. Вы можете дать им любое оформление, так же как и кнопкам. Данные ссылки вставляются автоматически внутрь #slider. Но чтобы их было видно, я задал им абсолютное позиционирование и верхний слой (z-index:3), чтобы они были отображены над слайдами. Думаю с CSS здесь всё понятно и просто: вы можете поменять практически все свойства, чтобы оформить слайдер так, как вам необходимо.

Давайте теперь рассмотрим сам сценарий:

var hwSlideSpeed = 700;
var hwTimeOut = 3000;
var hwNeedLinks = true;

$(document).ready(function(e) {
	$('.slide').css(
		{"position" : "absolute",
		 "top":'0', "left": '0'}).hide().eq(0).show();
	var slideNum = 0;
	var slideTime;
	slideCount = $("#slider .slide").size();
	var animSlide = function(arrow){
		clearTimeout(slideTime);
		$('.slide').eq(slideNum).fadeOut(hwSlideSpeed);
		if(arrow == "next"){
			if(slideNum == (slideCount-1)){slideNum=0;}
			else{slideNum++}
			}
		else if(arrow == "prew")
		{
			if(slideNum == 0){slideNum=slideCount-1;}
			else{slideNum-=1}
		}
		else{
			slideNum = arrow;
			}
		$('.slide').eq(slideNum).fadeIn(hwSlideSpeed, rotator);
		$(".control-slide.active").removeClass("active");
		$('.control-slide').eq(slideNum).addClass('active');
		}
if(hwNeedLinks){
var $linkArrow = $('<a id="prewbutton" href="#"></a><a id="nextbutton" href="#"></a>')
	.prependTo('#slider');		
	$('#nextbutton').click(function(){
		animSlide("next");

		})
	$('#prewbutton').click(function(){
		animSlide("prew");
		})
}
	var $adderSpan = '';
	$('.slide').each(function(index) {
			$adderSpan += '<span class = "control-slide">' + index + '</span>';
		});
	$('<div class ="sli-links">' + $adderSpan +'</div>').appendTo('#slider-wrap');
	$(".control-slide:first").addClass("active");
	
	$('.control-slide').click(function(){
	var goToNum = parseFloat($(this).text());
	animSlide(goToNum);
	});
	var pause = false;
	var rotator = function(){
	if(!pause){slideTime = setTimeout(function(){animSlide('next')}, hwTimeOut);}
			}
	$('#slider-wrap').hover(	
		function(){clearTimeout(slideTime); pause = true;},
		function(){pause = false; rotator();
		});
	rotator();
});

Сначала в переменных сохраняются настройки: hwSlideSpeed - скорость перелистывания слайдов, hwTimeOut - время спустя которое происходит автоматическая смена слайда, hwNeedLinks - управляет ссылками "Следующий " и "Предыдущий" - если значение этой переменной равно true, то эти ссылки будут отображаться, а если false, то соответственно их не будет (как на главной странице моего блога).

Далее мы устанавливаем необходимые CSS свойства для слайдов с помощью метода .css(). Блоки со слайдами мы накладываем друг на друга используя абсолютное позиционирование, затем скрываем их все .hide(), а затем показываем только первый. Переменная slideNum - это номер активного слайда, то есть счётчик.

Основная логика работы нашего jQuery слайдера - это функция animSlide. Она принимает один параметр. Если мы передадим в неё строки "next" или "prew", то сработают условные операторы и будет отображён соответственно следующий или предыдущий слайд. Если же мы пошлём в качестве значения цифру, то это число станет активным слайдом и он будет показан.

Таки образом эта функция скрывает текущий div, высчитывает новый и показывает его.

Обратите внимание, что методу .fadeIn(), который делает видимым активный слайд, задан второй аргумент. Это, так называемая функция обратного вызова. Она выполняется, когда слайд полностью появится. В данном случае это сделано для обеспечения автоматической прокрутки слайдов. Функция rotator, определённая ниже, вызывает снова функцию animSlide для перехода на следующий слайд через необходимый нам интервал времени: мы получим замыкание, обеспечивающее постоянную прокрутку.

Всё работает нормально, но нам нужно остановить выполнение автоматики, если пользователь подводит курсор к слайдеру, или нажимает кнопки. Для этого создана переменная pause. Если её значение положительно - true, значит автоматического переключения не будет. С помощью метода .hover(), мы указываем: очистить таймер если он запущен - clearTimeout(slideTime), и установить pause = true. А после отвода курсора, отключить паузу и запустить замыкание rotator(). 

Дополнительно нам нужно создать новые элементы на странице и поместить их в нужное место. Используя цикл each() для каждого слайда (div-а с классом .slide), создадим элемент span внутри которого бует число - номер слайда. Это число используется в функции анимации, для перехода к слайду с этим номером. Обернём всё в div с нужными классами, и в итоге получим такую разметку:

<div class="sli-links">
  <span class="control-slide">0</span>
  <span class="control-slide">1</span>
  <span class="control-slide">2</span>
  <span class="control-slide">3</span>
</div>

Затем если в настройках указано, что ссылки "следующий - предыдущий" нужны, то создадим и их, и сразу повесим на них обработчики. В качестве обработчика клика используем ту же самую функцию animSlide, с аргументами "next" и "prew". 

Казалось бы, зачем мы создаём разметку внутри скрипта, а не в HTML коде?. Дело в том, что например, если у пользователя отключены скрипты - он не увидит элементов, которые не будут работать, и это не введёт его в замешательство. Кроме того упрощается код, что неплохо для SEO.

В итоге разметка слайдера будет выглядеть примерно так (в качестве слайдов я использовал изображения, и установил 5 штук):

<div id="slider-wrap">
  <div id="slider">
    <a id="prewbutton" href="#">&lt;</a>
    <a id="nextbutton" href="#">></a>
    <div class="slide" style="position: absolute; top: 0px; left: 0px; display: none">
      <img src="img/001.jpg" width="640" height="360">
    </div>
    <div class="slide" style="position: absolute; top: 0px; left: 0px; display: none">
      <img src="img/002.jpg" width="640" height="360">
    </div>
    <div class="slide" style="position: absolute; top: 0px; left: 0px; display: none">
      <img src="img/003.jpg" width="640" height="360">
    </div>
    <div class="slide" style="position: absolute; top: 0px; left: 0px; display: block">
      <img src="img/004.jpg" width="640" height="360">
    </div>
  </div>
  <div class="sli-links">
    <span class="control-slide">0</span>
    <span class="control-slide">1</span>
    <span class="control-slide">2</span>
    <span class="control-slide active">3</span>
  </div>
</div>

Ниже вы можете посмотреть, как работает наш jQuery слайдер на демо странице, и скачать все необходимые исходники.

ДемоСкачать

На напоследок, пару моментов об интеграции этого слайдера с Drupal. Вы можете добавить этот код в файл шаблона, например в page.tpl.php, и прикрепить скрипт отдельными js-файлом к теме. Jquery в Drupal включен по умолчанию, но работает в режиме совместимости (подробнее). Есть два варианта доработки. Либо обернуть весь js код:

(function ($) {
  // Весь ваш код...
})(jQuery);

или заменить символы $ во всём скрипте на jQuery. Вот так:

jQuery(document).ready(function(e) {
	jQuery('.slide').css(
		{"position" : "absolute",
		 "top":'0', "left": '0'}).hide().eq(0).show();
	var slideNum = 0;
	var slideTime;
	slideCount = jQuery("#slider .slide").size();
	var animSlide = function(arrow){
// и т. д.

В примере уже реализован первый метод.

Спасибо за прочтение! Оставляйте комментарии, приходите ещё. А так же вы можете подписаться на RSS, чтобы получать обновления блога первыми! 

Добавлено: Это ещё не всё. Читайте следующую статью о HWSlider. Там мы добавим новые возможности к данному скрипту.

Поделиться:
Комментарии

Отлично!
А скажите, как сделать слайдер из нескольких картинок?
То есть, чтобы была не одна картинка, а несколько...например, как здесь http://elemisdesign.com/demos/carousel/light/index.html

Лидия
ср, 2014-11-05 07:34

Faraday, пожалуйста свяжись со мной, нужна твоя помощь, заранее спасибо)))
мой id в вк http://vk.com/nekuryashka51

Татьяна
сб, 2014-12-06 23:18

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

Татьяна
пн, 2014-12-08 14:35

Благодарю за отличный и очень простой слайдер. Немного доработал вид и функционал.
Можете посмотреть здесь:
http://needfull.net/video/668-videoklip-ani-lorak-medlenno

вт, 2014-12-09 00:10

Добрый день! Подскажите по следующей ситуации: один и тот же код слайдера на всех страницах сайта (include). Очень не нравится что при сёрфинге по сайту как и положенно слайдер начинает показ картинок с первой. Есть ли какие то методы которые могут мне помочь в данной ситуации.

Максим
сб, 2014-12-13 14:23

Слайдер супер !!! Спаси БОГ!
Подскажите пожалуйста, как отключить автоматический слайд-шоу ?)

Дмитрий
пт, 2015-01-16 01:17

Как отключить уже писали в коментах ранее. Удали часть кода или увеличь время.

Сергей
вт, 2015-02-03 01:21

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

Сергей
вт, 2015-02-03 01:32

В данный слайдер подключил второй библиотеку JQM:

А теперь не получается вставить код для работы слайдера на сенсорных устройствах. Вот код:

$(document).ready(function() {
$("#myCarousel").swiperight(function() {
$("#myCarousel").carousel('prev');
});
$("#myCarousel").swipeleft(function() {
$("#myCarousel").carousel('next');
});
});

Сергей подскажи пж как ты решил этот вопрос?
Или может кто знает, подскажите пж. За ранее спасибо добрым людям.

Юрец
чт, 2015-02-19 02:06

Спасибо! Я полный новичок в jquery, но со слайдером без труда разобралась.

Юля
сб, 2015-03-21 12:12

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

Павел
пт, 2015-04-10 15:10

Возможно поможет, если у блока с меню установить CSS свойство z-index:4 или выше. Если нет, то нужно смотреть сайт.

Faraday
сб, 2015-04-11 22:56

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

Автору огромный респект!!!

чт, 2015-04-23 14:05

Не отображает у меня стрелки для смены слайдов, также не отображает нижнюю панель. В чём проблема?

aleksey
ср, 2015-05-20 18:07

Возникла проблемка. Я данный слайдер поместил во вкладки, которые также используют метод show, hide в JQuery. Из-за этого, слайдер анимировал только кнопки навигации, а при попытке перейти к следующему слайду, ничего не происходило, кроме анимации самих кружочков под (у кого над) ним. Поэтому я изменил код. На самом деле оказалось решение очень простым.
с
$(slide).css(
{"position" : "absolute",
"top":'0', "left": '0'}).hide().eq(0).show();
на
$(slide).css(
{"position" : "absolute",
"top":'0', "left": '0'}).hide();
$(slide).eq(0).show();

needfull
вт, 2015-06-02 11:37

ан нет! все-равно его глючит. слайды останавливаются на одном из и начинают показ только тогда, когда все пройдут до конца.
как бы. если мы на 1 слайде подгрузили вкладку, то слайдер листает только кнопки навигации по слайдам. а сам контейнер со слайдами замирает на первом. а начинает показ только, когда все пройдут заново.

needfull
вс, 2015-06-07 00:25

Отличный простой и удобный слайдер, внедрил в карточку товаров Joomshopping. Спасибо

пн, 2015-09-07 22:07

Спасибо!
Долго искал что то похожее. Очень помогли!

вт, 2015-09-15 10:24

Какая часть кода отвечает за то что: После нажатия на клавишу дальше, когда показан последний слайд появляется первый?

Сергей
ср, 2015-12-09 03:22

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

Faraday
чт, 2015-12-24 14:58

Огромное спасибо за тему! Как вы помогли!!! Как раз то, что искала!!!

А возможно ли в таком слайдере сделать функцию переходя с каждого слайда на привязанную у нему страницу?

Елена
вт, 2016-01-19 15:54

Спасибо за статью.=) Очень помогло.

Сергей
пн, 2016-02-15 22:55

Отличный слайдер! Немного покорректировал его под себя и в итоге возникла какая-то странная ошибка...
Каждый последний div.slide не отображается... просто черный квадрат вместо него, а сам слайдер работает...
Не подскажите, в чем может быть проблема?

Илья
сб, 2016-04-23 04:25

Так просто не скажу, нужно видеть страницу.

Faraday
пн, 2016-05-02 12:06

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

inwizard
вт, 2016-06-14 18:37

Здравствуйте! столкнулся с проблемой слайдер отлично работает на jquery-1.7.2.min.js, а вот на jquery-3.1.1.js не работает, подскажите пожалуйста в чём причина?
Спасибо за слайдер и ответ!

Дмитрий
сб, 2016-10-08 13:14

Отличный скрипт!
Всё хорошо, но с библиотекой jquery-3.1.1.min.js не работает.
Доработайте, пожалуйста.

Вячеслав
пн, 2017-01-23 06:09

Данный слайдер не работает с новыми библиотеками jquery-3.2.0

Вячеслав
вт, 2017-04-04 14:17

Хороший слайдер. Подскажите, пожалуйста, как отключить автоматическую ротацию слайдов? оставить только смену картинок по клику. Заранее спасибо.

Наташа
пн, 2017-10-23 13:01

Добрый день! Такая проблема, вставил код, всё вроде работало, вёрдпресс обновился, и теперь у меня вместо 6 слайдов - 12, причём 6 нормальных, а 6 пустых. Как это можно исправить?)

Владимир
пн, 2018-07-30 14:57

Hi! buy sildenafil online good site

пн, 2019-07-08 05:08

Howdy! modafinil online pharmacy great internet site

пн, 2019-07-08 05:16

Hello! buy viagra uk good web site

вт, 2019-07-09 04:07

Howdy! purchase viagra online no prescription beneficial web site

ср, 2019-07-10 00:00

Здравствуйте! интересный у вас сайт!
Нашел обширную базу кино: смотреть сериал черный ворон в хорошем http://kinovalenok.tv/
Тут: фэнтези смотреть онлайн в хорошем качестве http://kinovalenok.tv/fentezi/ список 2018
Тут: фильмы драма смотреть хорошем качестве бесплатно смотреть хороший русский фильм драму список 2018
Здесь: лучшие документальные онлайн фильмы бесплатно http://kinovalenok.tv/dokumentalnyy/ список 2019
Здесь: http://kinovalenok.tv/8800-lyubit-ne-lyubit-sezon-1-2013.html Смотреть Любит не любит (Сезон 1) (2013) онлайн бесплатно
Тут: http://kinovalenok.tv/11620-volchya-staya-the-wolfpack-2015.html
Здесь: http://kinovalenok.tv/12772-novyy-rezhisser-betmena-rasskazal-o-rabote-nad-filmom.html

вс, 2019-07-14 10:31

Приветствую всех! класный у вас сайт!
Нашел сериальную базу кино: детские мультфильмы смотреть в хорошем качестве
Тут: кино онлайн в хорошем качестве 2019 фэнтези http://inspacefilm.ru/fentezi/ рейтинг 2018
Тут: смотреть лучшие драмы 2019 лучшие фильмы онлайн бесплатно драма рейтинг 2018
Здесь: документальные фильмы смотреть онлайн бесплатно в хорошем Лучшие документальные фильмы список 2018
Тут: http://inspacefilm.ru/10041-taynye-agenty-agents-secrets-2004.html Смотреть Тайные агенты / Agents secrets (2004) онлайн бесплатно
Здесь: Конец ***го мира / The End of the F***ing World (Сезон 1) (2017) онлайн Смотреть Конец ***го мира / The End of the F***ing World (Сезон 1) (2017) онлайн бесплатно
Тут: http://inspacefilm.ru/4350-papa-baabul-2006.html

вс, 2019-07-14 10:32

Страницы

Комментировать