Какво е Friday Code?

Това е място за хора, които считат писането на код същевременно за изкуство и част от ежедневието. Това е място, където можем да се съберем и да обсъждаме всичко без задръжки, тъй като всички тук сме равни. Това е място, където информацията и придобитите знания са безценни. Всичко от нас се прави за удоволствие! Ако искате да се свържете с екипа за предложение, запитване или критика, може да използвате контактите.

Как да си направим Slider или Carousel с jQuery

От доста дълго време Гошето (Георги Калайджиев) ме кара да седна и да напиша урок за такъв слайдър и ето че той вече е факт. Разбира се има много подобни слайдъри или carousels (въртележки) в мрежата, но рядко се среща нещо, което да ти свърши работа на 100% и хем да е удобно, хем да е малко като код и т.н. Надявам се сами се досещате, че това не е най-великият скрипт, но със сигурност ще свърши работа на някой от вас.

Как да си направим Slider или Carousel с jQuery

Надявам се всичко надолу да е ясно, но ако имате въпроси не се притеснявайте да питате.

HTML

Файловата структура на този урок е идентична с тази на повечето уроци, които ще срещнете на сайта. Имаме директория CSS, в която са всички използвани css файлове. Аналогично на CSS директорията е и JS папката, в която стоят съответно всички JavaScript файлове. И още по-аналогично е IMG директорията, в която стоят всички изображения.

За изграждането на този слайдър или carousel ще използваме елемент (div), който е с id="carousel" и в който има друг елемент (div) с клас slides, в който пък стои неподреден списък (ul). Отделните слайдове (slides) се намират в <li></li> таговете на неподредения списък. Ето и HTML кода за по голяма яснота :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>Как да си направим Slider или Carousel с jQuery</title>
	<link rel="stylesheet" type="text/css" href="css/style.css" />

	<script type="text/javascript" src="http://www.google.com/jsapi"></script>
	<script type="text/javascript">google.load("jquery", "1.4.1");</script>
</head>

<body>
<div id="carousel">
	<div class="slides">
		<ul>
			<li><div class="slide img1"></div></li>
			<li><div class="slide img2"></div></li>
			<li><div class="slide img3"></div></li>
		</ul>
		<div class="clr"></div>
	</div>

	<div id="buttons">
		<a href="#" class="prev_btn">назад</a>
		<a href="#" class="next_btn">напред</a>
		<div class="clr"></div>
	</div>
	<div class="frame_right_bg"></div>
</div>

<script type="text/javascript" src="js/script.js"></script>
</body>
</html>

CSS

Както стана ясно по-горе използвам два елемента (div) вложени един в друг. Интересното тук е, че първият елемент, който е с id="carousel" e позициониран винаги в центъра на екрана. Как става това ли? За повече информация прочетете Хоризонтално и вертикално центриране на елемент с CSS.

#carousel {
	overflow:hidden;
	position:absolute;
	top:50%;
	left:50%;
	padding:11px;
	width:578px;
	height:158px;
	margin:-90px 0 0 -300px;
	background: transparent url(../img/frame.png) 0 0 no-repeat;
}
.slides {
	overflow:hidden;
	position:relative; /* ie overflow issue fix */
	width:578px;
	height:158px;
}
.frame_right_bg {
	position:absolute;
	top:0;
	right:0;
	height:180px;
	width:12px;
	background: transparent url(../img/frame_right_bg.png) 0 0 no-repeat;
}
.slides ul {position:relative;left:0;top:0;}
.slides li {float:left;width:578px;height:158px;}
#buttons { position:absolute;top:20px;right:20px; }
#buttons a { float:left; margin:0 0 0 10px; width:38px; height:16px; text-indent:-9999px; }
#buttons .prev_btn { background: transparent url(../img/prev_btn.png) 0 0 no-repeat; }
#buttons .next_btn { background: transparent url(../img/next_btn.png) 0 0 no-repeat; }
#buttons a:hover { background-position: 0 100%; }
.slide { width:578px;height:158px;}
.img1 { background: transparent url(../img/img1.png) top center no-repeat; }
.img2 { background: transparent url(../img/img2.png) top center no-repeat; }
.img3 { background: transparent url(../img/img3.png) top center no-repeat; }

JavaScript

Преди да обясним логиката, с която работи този скрипт обаче, трябва да се запознаем с два метода, които са ни нужни за изграждането на така наречената безкрайна въртележка или безкраен слайдър, а именно After и Before.
Тези методи са ни нужни, защото потребителят има две възможности:

  1. да кликне върху бутона "prev"
  2. да кликне върху бутона "next"

В резултат на които, когато потребителя кликне върху един от двата бутона скрипта наслагва първия или последния слайд съответно най-отпред или най-отзад в неподредения списък. И всъщност това е цялата идея. Разбира се има и автоматично сменяне на слайдовете скороста на което се определя от променливата "speed". По желание на Гошето автоматичното слайдване спира при натискането на бутоните "prev" и "next". Ето и самия JavaScript код:

$(document).ready(function() {

	//Параметри
	var speed = 3000;
	var slide_speed = 500;
	var run = setInterval('rotate()', speed);

	//Взимаме широчината на обекта и пресмятаме стойност "left"
	var item_width = $('.slides li').outerWidth();
	var move_left_value = item_width * (-1);

	//Пресмятаме общата широчина на всички елементи и я задаваме на обекта с клас ".slides"
	$('.slides').css({'width' : ($('.slides li').size()) * item_width});

    //Преместваме последния обект преди първия за да се подсигурим при евентуално кликане на бутона "назад"
	$('.slides li:first').before($('.slides li:last'));

	//Преместваме елемента по подразбиране на правилното му място,
	//тъй като по-горе сме преместили последния елемент, като първи и вече елемента по подразбиране е втори
	$('.slides ul').css({'left' : move_left_value});

    //При кликване на бутона назад
	$('a.prev_btn').click(function() {

		//Изчисляваме правилната позиция на елемента
		var left_move = parseInt($('.slides ul').css('left')) + item_width;

		//Преместваме обекта ( :not(:animated) - преместваме само ако обекта не се анимира в момента )
		$('.slides ul:not(:animated)').animate({'left' : left_move}, slide_speed,function(){

            //Преместваме последния обект преди първия
			$('.slides li:first').before($('.slides li:last'));

			//Преместваме елемента по подразбиране на правилното му място
			$('.slides ul').css({'left' : move_left_value});

		});

		//Прекъсване на функцията
		return false;

	});

    //При кликване на бутона напред
	$('a.next_btn').click(function() {

		//Изчисляваме правилната позиция на елемента
		var left_move = parseInt($('.slides ul').css('left')) - item_width;

		//Преместваме обекта ( :not(:animated) - преместваме само ако обекта не се анимира в момента )
		$('.slides ul:not(:animated)').animate({'left' : left_move}, slide_speed, function () {

            //Преместваме последния обект преди първия
			$('.slides li:last').after($('.slides li:first'));

			//Преместваме елемента по подразбиране на правилното му място
			$('.slides ul').css({'left' : move_left_value});

		});

		//Прекъсване на функцията
		return false;

	});

	//Спираме автоматичното преместване
	$('.slides').hover( function() {
		clearInterval(run);
	});

});

function rotate() {
	$('a.next_btn').click();
}

$(document).keydown(function(e) {
    switch (e.keyCode) {
        case 37: $('a.prev_btn').click(); break;
        case 39: $('a.next_btn').click(); break;
    }
});

Това не е всичко, добавил съм едно малко подобрение, което се вижда в скрипта :


$(document).keydown(function(e) {
    switch (e.keyCode) {
        case 37: $('a.prev_btn').click(); break;
        case 39: $('a.next_btn').click(); break;
    }
});

Ако вече не сте се досетили какво е това, отговорът е : "Преместване на слайдовете със стрелките от клавиатурата".

View DemoDownload

Скриптът е тестван и работи на всички браузъри с изключение на някои ефекти, които се дънят под Internet Explorer 6. Ние от Fridaycode сме плътно зад идеята IE6 да бъде спрян точно заради причината, че спъва технологиите.

И още веднъж ако имате въпроси - насреща съм!

  • Facebook
  • Twitter
  • Digg

2 коментара за “Как да си направим Slider или Carousel с jQuery”

  1. Този slider е много як :), ще се радвам ако и аз успея да напиша нещо такова някой ден :)

Отговор