Блог для начинающих веб разработчиков. 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://imitrex-sumatriptan.com/ - order imitrex order sumatriptan buy imitrex no rx

чт, 2019-08-08 07:40

propecia online buy propecia no prescription order finasteride

пт, 2019-08-09 01:32

http://imitrex-sumatriptan.com/ - buy imitrex pills online buy imitrex pills order sumatriptan

пт, 2019-08-09 07:58

http://imitrex-sumatriptan.com/ - buy imitrex uk buy imitrex no rx sumatriptan generic

сб, 2019-08-10 08:35

http://imitrex-sumatriptan.com/ - buy imitrex pills buy imitrex pills imitrex

вс, 2019-08-11 09:23

legal online pharmacy Buy Prescription Drugs Online xanax online pharmacy overnight

пн, 2019-08-12 06:36

reputable online pharmacy costco online pharmacy prices online pharmacy no perscription

пн, 2019-08-12 06:43

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

вт, 2019-08-13 02:57

#1 online pharmacy canadian online pharmacy canada pharmacy on line no prescription/#canada pharmacies online

ср, 2019-08-14 03:26

best online pharmacy no prescription online pharmacy levitra pharmacy technician online courses

ср, 2019-08-14 06:43

u s online pharmacy canada online pharmacy online pharmacy without prescription

пт, 2019-08-16 04:46

mexican pharmacy online canadian online pharmacy no prescription pharmacy online

сб, 2019-08-17 02:12

legitimate online pharmacies overseas pharmacies that deliver to usa online pharmacy no prescription needed

вс, 2019-08-18 00:21

northwest pharmacy review drugs without a prescription to canada levitra online pharmacy/#canada drugs with out prescriptions

пт, 2019-08-23 04:50

european pharmacy viagra canadian pharmacy cialis online epharmacy/#cheap viagra canada pharmacy

сб, 2019-08-24 03:12

Не стоит повторять этих попыток более одногораза - позаботьтесь о своем хорошем настроении!Бывает, что вы сами хотите прекратить отношения
массаж сочи
Если вам этот процессизвестен, вам обеспечено удачное знакомство
http://www.nsklove.com/mb1706130692?hit=35&sp=1&noid=1706130692&nchanged=1535955432&nactive=0
анонимности. Желающие познакомиться чувствуют себя защищенными в случае неудачного знакомства, или если разговор принимает неприятный оборот, его можно просто прервать.
по погибающим юным поколениям. Например, существует зависимость от картежных игр или игры в казино. Для некоторых людей та или иная азартная игра становится смыслом жизни,
А если любовные отношения не сложатся, возможно, ты приобретешь друга. В реальных знакомствах все наоборот: погонишься за привлекательной внешностью, и может оказаться,
Разумеется, онидолжны быть в руках (а лучше на коленях) у девушки, которая едет в общественномтранспорте на семинар в свой техникум или университет, а по дороге учит какой-нибудь запутанный химико-физическо-технолого-бионический процесс Зато появитсяповод рассказать о себе

сб, 2019-08-24 19:37

buy propecia purchase finasteride order finasteride/#buy finasteride

ср, 2019-08-28 12:59

buy finasteride propecia cheap propecia online/#order finasteride

чт, 2019-08-29 13:11

buy cialis with no prescription buy cialis with no prescription cialis cheap/#cialis

сб, 2019-08-31 07:55

order viagra viagra cheap sildenafil

сб, 2019-08-31 07:58

Наша продукція пройшла міжнародну сертифікацію якості.
Артикул Super Wings EU720314 Оригинальное название Dizzy.
Важно чтобы ребенок не только имел возможность таких развлечений, но также наслаждался играми на качественных и оригинальных детских площадках.
Достаточно много продукции компания изготавливает для тех, кто занимается фитнесом.
Уличный Орбитрек SG108.

http://plusland.ru/forum/index.php?PAGE_NAME=profile_view&UID=45579
http://telefon.com.ua/communication/forum/talk/user/1151690/
http://exdekor.ru/forum/?PAGE_NAME=profile_view&UID=37116
http://stilmetdv.ru/communication/forum/user/118589/
http://xn--124-5cdyr3a1bbk.xn--p1ai/communication/forum/user/1779/

Игровые площадки для инвалидов купить украина.
Производство детского игрового оборудования и детских площадок.
Это огромный детский комплекс, оборудованный множеством интерактивных и развивающих элементов, где каждый ребенок в возрасте от 7 до 13 лет найдет для себя занятие по душе; Безопасность конструкции подтверждена соответствием качеству международных стандартов; Принимая решение детский игровой комплекс из металла купить , Вы получаете надежную установку, способную стать любимым местом для уличных развлечений минимум 10 поколений детей; Конструкция Вавилона адаптирована под переменчивый климат Украины, благодаря чему оборудование не будет портиться под воздействием атмосферных осадков; Привлекательный дизайн оборудования будет привлекать внимание детей и способствовать увеличению желания проводить как можно больше времени на открытом воздухе, что важно для развития детского физического здоровья; Игровой комплекс в детский сад купить или любое образовательное учреждение школьного типа создать комплексную площадку, где дети смогут в игровой форме заниматься базовыми атлетическими упражнениями.
Одного из претендентов в присяжные не отпустили с работы.
Комплексы также должны обеспечивать адекватную защиту от падений.

MatthewBof
сб, 2019-08-31 10:07

buy generic cialis buy cialis uk buy cialis pills online/#purchase cialis online no prescription

вс, 2019-09-01 13:32

oxfordhealth online pharmacy online pharmacy degree indian online pharmacy

пн, 2019-09-02 10:29

walgreen pharmacy online pharmacy technician online class pharmacy technician classes online

пн, 2019-09-02 10:36

Kamagra 100mg Gold site fiable achat cialis 125 Tab Sandoz Dutasteride Medicine

чт, 2019-09-05 21:56

purchase fluoxetine online order fluoxetine purchase prozac pills

пт, 2019-09-06 06:00

buy furosemide no prescription furosemide buy lasix no prescription

пт, 2019-09-06 06:53

buy prozac online without prescription fluoxetine buy fluoxetine online

пт, 2019-09-06 13:02

buy lasix uk purchase furosemide buy lasix pills online

пт, 2019-09-06 13:50

purchase prozac with no prescription prozac online purchase fluoxetine

пт, 2019-09-06 19:56

buy lasix buy lasix pills online buy furosemide no prescription

пт, 2019-09-06 20:39

order prozac fluoxetine purchase prozac online

сб, 2019-09-07 02:43

order furosemide buy furosemide no prescription buy lasix no prescription

сб, 2019-09-07 03:20

where purchase prozac order prozac medication purchase prozac uk

сб, 2019-09-07 09:36

buy lasix no prescription lasix 100 mg lasix generic

сб, 2019-09-07 10:09

buy lasix no prescription buy lasix with no prescription order lasix

сб, 2019-09-07 17:02

order prozac pills order fluoxetine prozac

сб, 2019-09-07 23:19

lasix generic buy lasix no rx furosemide

вс, 2019-09-08 06:28

buy furosemide buy generic lasix buy generic lasix

вс, 2019-09-08 19:52

lasix 100 mg buy lasix medication buy lasix online without prescription

пн, 2019-09-09 02:34

order lasix buy lasix lasix online

пн, 2019-09-09 09:21

furosemide lasix generic order lasix

пн, 2019-09-09 16:10

buy furosemide no prescription buy lasix no prescription buy lasix

пн, 2019-09-09 22:56

prescription best online pharmacy get deal websites

вт, 2019-09-10 05:01

best online pharmacy degree official source generic best online pharmacy

вт, 2019-09-10 10:20

article full article latisse best online pharmacy

ср, 2019-09-11 00:14

find out here investigate this site u.s online pharmacy

ср, 2019-09-11 05:07

check my source why not try this out pop over here

ср, 2019-09-11 05:38

overseas online pharmacy no prescription additional resources discover more here

ср, 2019-09-11 10:33

he said pop over to this site see post

ср, 2019-09-11 11:03

Страницы

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