Слайд шоу на библиотеке jQuery
Добрый день!
Стала задача разработать слайд шоу ![]() Есть похожий на этом сайте но проблема в том что не получается активной картинке присвоить ссылку. Как это сделать примерно в какую сторону копать. Целые день сидел но ничегою |
Если слайд шоу со стрелочками (как на сайте-примере), то все просто.
Картинки размещаете со свойствами position: absolute, так чтобы они были одна за другой. Стрелочкам присваиваете классы prev и next (например) и по клику на стрелочку запускаете событие перемещения. $(function() { // Эта функция выполнится при полной загрузке страницы var prev = $('.prev'), next = $('.next'); // Объявили переменные prev.click(function() {//клик на стрелку назад $('./*общий класс всех картинок*/').each(function() {//цикл по всем картинкам $(this).animate({'left' : '-=' + $(this).width() + 'px'}, 'slow') /*вычитаем из значения left текущей картинки её ширину*/ }) }) }) Пишите кнопку "вперед". Также после создания анимации будет необходимо придумать условие прекращения анимаций по достижению крайней картинки. Так же обратите внимание, что данный скрипт рассчитан что все картинки будут иметь одинаковую ширину. Разбирайтесь, пишите вопросы. |
Учите обращение к селекторам, и анимации (т.е. эффекты jQuery типа animate, fade, slide...), по сути это минимум что необходимо знать. Пример приведенный выше - самый простой и понятный, освойте хотябы его, а потом можно будет переделывать на слайд шоу с вашей картинки.
|
Слайдер работает, но не совсем правильно
Кое что сделал. Но все же работает еще не так...
Загвоздка именно на javascript вот собственно он (function ($) { var hwSlideSpeed = 700; var hwTimeOut = 3000; var hwNeedLinks = true; $(document).ready(function(e) { //$('.slide').css( // {"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'); } 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(); }); })(jQuery); HTML разметка <div id="slider-wrap"> <div id="slider"> <div class="slide"> <img src="img/1.png" width="640" height="360"> </div> <div class="slide"> <img src="img/2.png" width="640" height="360"> </div> <div class="slide"> <img src="img/3.png" width="640" height="360"> </div> <div class="slide"> <img src="img/4.png" width="640" height="360"> </div> </div> </div> И файл стилей Код:
#slider{ /* Оболочка слайдера */ У меня в каком-то месте цикл не правильно работает. И еще мне хочется чтоб они по кругу шли. Я знаю что есть скрипт circle но не понимаю как его использовать. буду очень признателен если кто-то чего-то посоветует или подскажет Вот то как работает http://207693.artzozul.web.hosting-test.net/ |
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>Документ без названия</title> <script src="jquery-1.7.2.min.js"></script> </head> <body> <style> #slider{ /* Оболочка слайдера */ width:1540px; height:360px; overflow: hidden; position:relative;} .slide{ /* Слайд */ width:640px; height:360px!important; float:left; margin:0 -85px 0 0; } .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;} </style> <script> (function ($) { var hwSlideSpeed = 700; var hwTimeOut = 3000; var hwNeedLinks = true; $(document).ready(function(e) { //$('.slide').css( // {"left": '0'}).hide().eq(0).show(); var slideNum = 0; var slideTime; slideCount = $("#slider .slide").size(); var animSlide = function(arrow){ clearTimeout(slideTime); $('.slide').eq(slideNum).hide(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).show(hwSlideSpeed, rotator); $(".control-slide.active").removeClass("active"); $('.control-slide').eq(slideNum).addClass('active'); } 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(); }); })(jQuery); </script> <div id="slider-wrap"> <div id="slider"> <div class="slide"> <img src="img/1.png" width="640" height="360"> </div> <div class="slide"> <img src="img/2.png" width="640" height="360"> </div> <div class="slide"> <img src="img/3.png" width="640" height="360"> </div> <div class="slide"> <img src="img/4.png" width="640" height="360"> </div> </div> </div> </body> </html> IgorArhangel, fadeIn/fadeOut не подходит нужны обычные show/hide c фиксированной высотой слайда .slide{ height:360px!important; |
Deff,
спс. Но мне необходимо выстроить все картинки в ряд и по переключению они все чтоб ехали причем по кругу вот как тут у меня же получается полная ерунда. |
IgorArhangel,
имхо простой метод построить одностроковую таблу и переносить с разворачиванием ячейки в начало(или в конец, зависит от направления) таблицы, сворачивая текущую; ================================================== ================ По кругу чтобы ехало, тоже аналогично, переносить слайды с разворачиванием в начало или конец блока обрамляющего слайды |
Зачем делать прокрутку по кругу, если вы хотите сделать перемещение изображений не по "стрелочкам", а по кнопкам привязанным к конкретной картинке?
Самый простой вариант: <div id="general"><!--Блок с position: relative--> <div id="forImages"><!--Блок с position: absolute;--> <div class="img1 allImgClass"></div><!--Блок с position: absolute;--> <div class="img2 allImgClass"></div><!--Блок с position: absolute;--> <div class="img3 allImgClass"></div><!--Блок с position: absolute;--> <div class="img4 allImgClass"></div><!--Блок с position: absolute;--> </div> </div> При такой структуре их надо расставить в ряд (скрипт): var x = 0; var num = 0; //Номер картинки var margin = 5;//отступ между картинками $('.allImgClass').each(function () {//Цикл по всем картинкам $(this).css({'left': x + 'px'}); num++; x = margin + ($(this).width() + margin * 2) * num; }); Итак, у нас есть блок forImages, в котором все картинки лежат подряд. Теперь по нажатию на кнопки (1, 2, 3, 4) вам нужно лишь перечислить координаты forImages, при которых необходимая картинка была бы посередине. Например: $('.button2').click(function() { $('#forImages').css({'left': '-150px'}); }) В данном примере описываю максимально простой, а не правильный способ. |
|
Цитата:
Никак не могу понять. Было супер если бы пример сюда поставить |
Цитата:
Да я понял что Вы имели ввиду. Идея классная, но прикол в том что этот слайдер еще и должен по времени сам листаться. и еще в чем прикол что картинки которые по бокам должны быть в background, так как ширина не должна превышать 1000 pх. Почитаю еще документацию. Если что напишу еще! Пока что спс всем! |
Данная структура не мешает использовать setTimeout или setInterval. И background-м они тоже вполне могут быть.
О переносе слайдов в начало/конец почитайте про insertAfter(), insertBefore() и appendTo() (методы jQuery) |
Цитата:
<script src="http://code.jquery.com/jquery-latest.js"></script> <style type="text/css"> #Wrap { width:480px; position:relative; text:align:center; } #SlideWrp{ display:inline-block; } #Prev,#Next { border:red solid 1px; padding:2px; cursor:pointer; } #Prev { float:left; } #Next { float:right; } div.Slide { //float:left; float:right; height:100px!important; width:200px; padding:6px; border:blue solid 1px; } #SlideWrp { height:114px; //height+border+padding; overflow-y:hidden; //не расширение до $(".Slide:not('.active')").hide(); width:430px; } #indexActive{ float:right; margin-right:50px; margin-top:10px; } span[id^="active_Ind"]{ float:right; border:blue solid 2px; height:3px; width:3px; margin:3px; } span[id^="active_Ind"].active{ border: red solid 2px; } </style> <div id="Wrap"> <span id="Prev">←</span><span id="Next">→</span> <div id="SlideWrp"> <div class="Slide active">1</div> <div class="Slide active">2</div> <div class="Slide">3</div> <div class="Slide">4</div> <div class="Slide">5</div> </div><br /> <div id="indexActive"></div> </div> <script type="text/javascript"> $(document).ready(function(){ $(".Slide:not('.active')").hide(); var intervalAutoId; var LsL=$(".Slide").length; $(".Slide").each(function(i){ $(this).attr('data',i); $("#indexActive").prepend('<span id="active_Ind_'+i+'"></span>') });$("#indexActive #active_Ind_0").addClass('active'); function setIndActive(){ var j=$(".Slide.active:first").attr('data'); $("#indexActive span[id^='active_Ind_']").removeClass('active'); $("#indexActive span[id='active_Ind_"+j+"']").addClass('active'); } $("#Next").click(function(){ UserNoActSlide=false; $(".Slide:first").removeClass('active').hide('slow',function () {$(this).appendTo("#SlideWrp")}); $(".Slide:eq(2)").addClass('active').show('slow'); setIndActive(); }); $("#Prev").click(function(){ UserNoActSlide=false; $(".Slide.active:last").removeClass('active').hide('slow'); $(".Slide:last").prependTo("#SlideWrp").addClass('active').show('slow'); setIndActive() }); // АВТОПРОКРУТКА var UserNoActSlide=true; $("#Wrap").bind('mouseenter mousemove',function(){ //Cброс автозапуска по наведению UserNoActSlide=false;//alert("A") clearInterval(intervalAutoId); UserNoActSlide=false; }).mouseleave(function(){ //Разрешаем автозапуск по сходу курсора clearInterval(intervalAutoId); UserNoActSlide=true; }); setInterval(function(){ //Периодический тест активности и автозапуск if(UserNoActSlide){ intervalAutoId=setInterval(function(){ UserNoActSlide=false; $("#Next").click(); },3000); // Интервал автопрокрутки } },10000); // Интервал Теста; }); </script> |
Deff,
Да это оно спасибо огромное... Есть еще одна проблемка мне для навигации не нужны стрелочки, переход на определенную картинку должен быть при нажатии на нижние квадратики, которые находятся в блоке indexActive подскажите что прописать в ссылку? вот в этом месте $(".Slide").each(function(i){ $(this).attr('data',i); $("#indexActive").prepend('<a href=" "><span id="active_Ind_'+i+'">'+(i+1)+'</span></a>') });$("#indexActive #active_Ind_0").addClass('active'); |
Как я понял мне надо прописать функцию для клика на id="active_Ind"
Вот что я написал но оно не хочет работать $("#indexActive span[id^='active_Ind_']").click(function(){ var goToNum = attr('data'); animSlide(goToNum); }); |
IgorArhangel,
Чичас гляну... полчаса потерпите |
и еще интересно если разместить в background картинки.. они большие в ширину 700 пикселей.
ясно дело что на экран не поместятся. С помощью какой функции можно сделать чтоб ширина слайдера была 1000 пх, а отображалась одна картинка по центре а две которые по бокам на половину? |
IgorArhangel,
<script src="http://code.jquery.com/jquery-latest.js"></script> <style type="text/css"> #Wrap { width:480px; position:relative; text:align:center; } #SlideWrp{ display:inline-block; } #Prev,#Next { border:red solid 1px; padding:2px; cursor:pointer; } #Prev { float:left; } #Next { float:right; } div.Slide { //float:left; float:right; height:100px!important; width:200px; padding:6px; border:blue solid 1px; } #SlideWrp { height:114px; //height+border+padding; overflow-y:hidden; //не расширение до $(".Slide:not('.active')").hide(); width:430px; } #indexActive{ float:right; margin-right:30px; margin-top:10px; } span[id^="active_Ind"]{ cursor:pointer; float:right; border:blue solid 2px; height:6px; width:6px; margin:6px; } span[id^="active_Ind"].active{ border: red solid 2px; } </style> <div id="Wrap"> <span id="Prev">←</span><span id="Next">→</span> <div id="SlideWrp"> <div class="Slide active">1</div> <div class="Slide active">2</div> <div class="Slide">3</div> <div class="Slide">4</div> <div class="Slide">5</div> </div><br /> <div id="indexActive"></div> </div> <script type="text/javascript"> $(document).ready(function(){ $(".Slide:not('.active')").hide(); var intervalAutoId; var LsL=$(".Slide").length; $(".Slide").each(function(i){ $(this).attr('data',i); $("#indexActive").prepend('<span id="active_Ind_'+i+'"></span>') });$("#indexActive #active_Ind_0").addClass('active'); function setIndActive(){ var j=$(".Slide.active:first").attr('data'); $("#indexActive span[id^='active_Ind_']").removeClass('active'); $("#indexActive span[id='active_Ind_"+j+"']").addClass('active'); } $("#Next").click(function(){ UserNoActSlide=false; $(".Slide:first").removeClass('active').hide('slow',function () {$(this).appendTo("#SlideWrp")}); $(".Slide:eq(2)").addClass('active').show('slow'); setIndActive(); }); $("#Prev").click(function(){ UserNoActSlide=false; $(".Slide.active:last").removeClass('active').hide('slow'); $(".Slide:last").prependTo("#SlideWrp").addClass('active').show('slow'); setIndActive() }); $("#indexActive > span[id^='active_Ind']").click(function(){ UserNoActSlide=false; $("#indexActive span[id^='active_Ind_']").removeClass('active'); $(this).addClass('active'); var Id= '' + $(this).attr('id').substring(11);//alert(Id); $(".Slide").each(function(i){ if($(this).attr('data')==Id) return false; $(this).appendTo("#SlideWrp"); }); $(".Slide.active:first").removeClass('active').hide(); $(".Slide:eq(0)").addClass('Preactive').show('slow'); $(".Slide.active:last").removeClass('active').hide(); $(".Slide:eq(1)").show('slow').addClass('active'); $(".Slide:eq(0)").show('slow').toggleClass('Preactive,active'); }); // АВТОПРОКРУТКА var UserNoActSlide=true; $("#Wrap").bind('mouseenter mousemove',function(){ //Cброс автозапуска по наведению UserNoActSlide=false;//alert("A") clearInterval(intervalAutoId); UserNoActSlide=false; }).mouseleave(function(){ //Разрешаем автозапуск по сходу курсора clearInterval(intervalAutoId); UserNoActSlide=true; }); setInterval(function(){ //Периодический тест активности и автозапуск if(UserNoActSlide){ intervalAutoId=setInterval(function(){ UserNoActSlide=false; $("#Next").click(); },3000); // Интервал автопрокрутки } },10000); // Интервал Теста; }); </script> Цитата:
2. Укажите нужные высоту и ширину картинок( пока только ширина) Цитата:
|
Цитата:
![]() картинки которые не помещаются они будут но за экраном.. на картинке нарисован экран монитора... если монитор будет большой будет влазить большая часть изображения. Огромное спасибо за помощь!!! |
Цитата:
|
Цитата:
================================================== = Цитата:
|
Deff,
Вы прописывали для 2 картинок. Я переделал на 3 картинки но оно работает не так как надо. Желательно чтоб активная картинка была по центру. $(".Slide.active:first").removeClass('active').hide(); $(".Slide:eq(0)").addClass('Preactive').show('slow'); $(".Slide.active:last").removeClass('active').hide(); $(".Slide:eq(2)").show('slow').addClass('active'); $(".Slide:eq(1)").show('slow').addClass('active'); $(".Slide:eq(0)").show('slow').toggleClass('Preactive,active'); но я хотел чтоб при прокрутке просто приезжала на центр нужная картика. А они все появляются и исчезают(( |
Deff,
Буду очень признателен если поможете. Подскажите книги именно чтоб по этой теме почитать. |
Цитата:
Нашел в интернете кое-что но оно не подходит. |
IgorArhangel,
завтра вечером раскажу, может чо и сваяю(но не гарантирую |
Цитата:
Deff, Может подскажете что-нибудь? |
Может еще кто-то подобное видел или может подсказать принцип?
|
Deff,
Не выделите немного времени? |
IgorArhangel,
О - я забыл про Вас - чо нидь завтра сделаю Тут только с наклоноcтью блоков пока не думал - у Вас идеи есть? |
Цитата:
Сделать их png и наложить друг на друга.. у меня отлично получилось!!! margin отрицательный. Я только и сделал что выстроил их |
IgorArhangel,
:) Ясн - я думал ротированием |
Цитата:
Буду ждать Вас |
IgorArhangel,
Седни не успею, доделывать буду завтра, Но скрытия и упразрачнивания скорее не будет, картинки будут перекатываться, одна позиция сменяться другой и скрываться за краем обрамляющего блока. Все это из-за требования центрального блока и возможности скрытия боковых при мелком экране. |
Цитата:
Это не то что мне нужно... Мне такие эффекты не нужны! мне нужны тупо переключатели на все слайды |
IgorArhangel,
делаю... неохотно, поскольку не выспался |
Цитата:
Если у Вас нет времение опишите логику и примерно как функции написать? я пока что сделал просто ротатор. картинки на фоне. они меняются. мне не хватает только переключателей внизу. Как я понял необходимо каждой картинке присвоить определенный переключатель. А вот как реализовать пока затрудняюсь |
Вроде сделал, мне картинки нужны,
Выложите пару ссылок на картинки - залить можно сюда, http://uploads.ru/ поскольку margin - cущественно влияет на центрирование |
Вылаживаю
Тут 6 картинок png |
<!DOCTYPE> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <title>Слайд шоу на библиотеке jQuery</title> <style type="text/css"> body { margin:0; padding; 0; } #Wrap { border:red solid 1px; width: 100%; overflow-x:hidden; height:auto; margin:0; padding; 0; text-align:left; position:relative; } #slideWrp { height:356px!important; overflow-x:hidden; display:inline-block; white-space:nowrap!important; padding:0; margin:0; border:red solid 1px; } .slide { float:left; height:356px!important; width:577px; margin:0 -1px 0 -1px; padding:0; border:transparent solid 1px; } .slide img{ margin-left:-47px; } #Wrap { max-width: 1470px;/* max-width = 490px*3 (Три ширины слайд картинок);*/ } #indexActive{ float:right; margin-right:30px; margin-top:10px; } span[id^="active_Ind"]{ cursor:pointer; float:right; border:blue solid 2px; height:6px; width:6px; margin:6px; } span[id^="active_Ind"].active{ border: red solid 2px; float:right; } </style> <script src="http://code.jquery.com/jquery-latest.js"></script> <script type="text/javascript"> $(document).ready(function(){ var slideWIDTH = 490; var SLlength = $(".slide").length; $('#slideWrp').width(490*SLlength) var ReSlide = (SLlength - (1-SLlength%2)); //Тест на четность function MarginSet(){ var margLeft = parseInt(($("#Wrap").width()-ReSlide*(1+$(".slide:first").width()))/2)+'px'; $("#slideWrp").css({'margin-left':margLeft}) } MarginSet(); $(window).resize(function(){ MarginSet(); }); //===========================// var a=$('#slideWrp'); var b=a.width; a.css({'width':b}) $(".slide").each(function(i){ $(this).attr('id','Slide-'+i); $("#indexActive").prepend('<span id="active_Ind_'+i+'"></span>') });$("#indexActive #active_Ind_0").addClass('active'); var starT=true; function ReplacSL(N){//alert(N) var slide=$(".slide:first"); var W = parseInt(slide.width()); var time = parseInt(410/Math.sqrt((N+1))) var marginLft = slide.css('margin-left'); slide.animate({'margin-left':'-'+W+'px'},time,"linear", function(){ slide.appendTo('#slideWrp');slide.css({'margin-left':marginLft}); N--;if(N){ReplacSL(N);} else {starT=true;} }); } function slideReplac(a,b){ if(!starT) return; starT=false; if(a!=b){var N=b-a; if(+a>+b)N=b+SLlength-a; ReplacSL(N); } } var s = SLlength - parseInt(ReSlide/2) for(var i=0; i<s; i++){ $(".slide:first").appendTo('#slideWrp') } $("#indexActive > span[id^='active_Ind']").click(function(){ UserNoActSlide=false; var startI = +$("#indexActive > span.active").attr('id').replace('active_Ind_',''); $("#indexActive > span.active").removeClass('active'); $(this).addClass('active'); var nextI = +$(this).attr('id').replace('active_Ind_',''); slideReplac(startI,nextI) }); // АВТОПРОКРУТКА var intervalAutoId; var UserNoActSlide=true; $("#Wrap").bind('mouseenter mousemove',function(){ //Cброс автозапуска по наведению UserNoActSlide=false;//alert("A") clearInterval(intervalAutoId); UserNoActSlide=false; }).mouseleave(function(){ //Разрешаем автозапуск по сходу курсора clearInterval(intervalAutoId); UserNoActSlide=true; }); setInterval(function(){ //Периодический тест активности и автозапуск if(UserNoActSlide){ clearInterval(intervalAutoId); intervalAutoId=setInterval(function(){ UserNoActSlide=false; var id= $("span[id^='active_Ind_'].active").attr('id'); id = (+(id.replace('active_Ind_',''))+SLlength- 1)% SLlength; $('#active_Ind_'+ id).click(); },4000); // Интервал автопрокрутки } },10000); // Интервал Теста; }); </script> </head> <body style="margin:0;padding:0;height:100%;width:100%;top:0;background: #FFFFFF url(http://hostjs-mybb2011.narod.ru/img/bg000000.gif) repeat-x 50%;"> <div style="padding:40px 40px;width:90%;margin:0 auto;background-color:#fff;"> <div id="Wrap"> <div id="slideWrp"> <div class="slide"><img src="http://s3.uploads.ru/UnR4O.png"/></div> <div class="slide"><img src="http://s3.uploads.ru/xd2BS.png"/></div> <div class="slide"><img src="http://s3.uploads.ru/oPsTG.png"/></div> <div class="slide"><img src="http://s3.uploads.ru/aGCih.png"/></div> <div class="slide"><img src="http://s2.uploads.ru/zrZwu.png"/></div> <div class="slide"><img src="http://s3.uploads.ru/ej8UB.png"/></div> <!----> </div> <div id="indexActive"></div> </div> </div> </body> </html> <!-- //Конец страницы //--> |
Deff,
Спасибо огромное! То что надо.. Немного подпилю.. Супер!!!! |
Часовой пояс GMT +3, время: 16:04. |