Простейший слайдер
Всем привет. Решил запилить слайдер. он работает, но у меня вопрос именно по реализации. Код вы можете посмотреть по этой ссылке.
http://jsfiddle.net/k6gj1ksp/2/ Есть 2 вопроса: 1) Как должна быть построена логика работы программы, чтобы при перелистывании салйдера (кнопками вперед и назад) нижние кнопки загорались правильно? и при этом нужно, чтобы при нажатии на отдельную кнопку она загоралась, а предыдущая исчезала. ЗЫ как мне кажется, тут нужно менять логику работы программы полностью. 2) менее важный, но все же. здесь я в каждой функции обращаюсь к свойству background так "container.style.background". когда я сохраняю это в переменную, допустим так "var containerBackground = container.style.background" это не работает. скажу сразу, я не прошу вас сделать работу за меня. мне просто нужно понять, как это должно делаться. Спасибо ! =) |
Smike,
если картинку меняите зачем таскать остальные параметры |
container.style.backgroundImage=
Чтобы работали кнопки произвольного доступа им надо просто втыкать подсветку по индексу. Ну то есть это css |
Цитата:
if (bg === 'array[0]') { rule[0].classList.add('active');} |
Цитата:
|
Ну да, хороший вопрос, обычно такие вопросы тут не понимают, я уже привык и не заметил.
Произвольный доступ требует индексации. Каноничный код с которого все начинается, действующее вещество так сказать: var c=parseInt(event.target.getAttribute('data-index')); Не важно картинки или кнопки отвечающие за картинки или чего-то еще - надо сперва в единственном цикле в загрузке данных проиндексировать и затем ровно одним методом все будет крутиться и вертеться. Потому что нажали буттон 8 - значит пред 8-1, а след - 8+1. Все заранее известно. Соответственно нажали буттон след - в котором сейчас 8, значит пред - 8-1, след - 8+1 и форевер. |
Цитата:
|
Цитата:
типа вот так /* highlight page button */ item.classList.toggle(opts.active_page_class); if(last_index!=null) image_list[last_index].classList.toggle(opts.active_page_class); |
Smike,
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title> - jsFiddle demo</title> <style type='text/css'> * { margin: 0; padding: 0; } ul { list-style: none; } #container { position: relative; top: 20px; width: 640px; height: 480px; margin: 0 auto; box-shadow: 0 0 5px 5px rgba(0, 0, 0, .5); transition: all .2s; background: no-repeat center center; } #previous { position: absolute; left: 10px; top: 50%; margin-top: -20px; opacity: .5; cursor: pointer; } #previous:hover, #next:hover { opacity: 1; } #previous:active { margin-top: -18px; } #next:active { margin-top: -18px; } #next { position: absolute; right: 10px; top: 50%; margin-top: -20px; opacity: .3; cursor: pointer; } .nav { position: absolute; bottom: 0; left: 50%; width: 100px; margin-left: -50px; } .nav li { float: left; margin-right: 5px; margin-bottom: 5px; } .rule { display: block; height: 10px; width: 10px; border: 2px solid #fff; border-radius: 50%; } .active { background-color: red; } </style> <script> window.onload = function() { (function() { var container = document.getElementById("container"), button = document.getElementById("next"), previous = document.getElementById("previous"), array = ["http://www.umnet.com/pic/diy/screensaver/3845b123-a01a.jpg", "http://www.iceis.pl/640x480/640x480_-_niagarafalls640x480.jpg", "http://www.umnet.com/pic/diy/screensaver/87832121-ea64.jpg", "http://www.blackberry-wallpapers.com/uploads/allimg/110514/2-1105142029510-L.jpg"], sliderRules = document.querySelectorAll(".rule"), old, i = 0, j = sliderRules.length - 1; function slideMove() { i += this.id == "next" ? 1 : -1; if (i === array.length) { i = 0; } if (i < 0) { i = (array.length - 1); } sliderRules[i].click() } if (document.addEventListener) { button.addEventListener("click", slideMove, false); previous.addEventListener("click", slideMove, false); } for (; j > -1; j--) { var sliderRule = sliderRules[j]; sliderRule.indx = j; // dataset sliderRule.addEventListener("click", setImage, false); } sliderRule.click(); function setImage(e) { e = e || window.event; var link = this.href; container.style.backgroundImage = "url(" + link + ")"; old && old.classList.remove("active"); old = this; i = +this.indx; old.classList.add("active"); e.preventDefault(); } }()); } </script> </head> <body> <div id="container"> <img src="https://www.gentec-eo.com/Content/images/home/slider/left-arrow.png" id="previous" width="40" height="40" > <img src="https://www.gentec-eo.com/Content/images/home/slider/right-arrow.png" id="next" width="40" height="40" > <ul class="nav"> <li><a class="rule" href="http://www.umnet.com/pic/diy/screensaver/3845b123-a01a.jpg"></a></li> <li><a class="rule" href="http://www.iceis.pl/640x480/640x480_-_niagarafalls640x480.jpg"></a></li> <li><a class="rule" href="http://www.umnet.com/pic/diy/screensaver/87832121-ea64.jpg"></a></li> <li><a class="rule" href="http://www.blackberry-wallpapers.com/uploads/allimg/110514/2-1105142029510-L.jpg"></a></li> </ul> </div> </body> </html> |
Цитата:
Рони решил, что я безнадежен и сделал сам =))))) Спасибо большое, Рони. Но перед тем, как ответить что-то осмысленное, мне нужно переварить этот код. |
Цитата:
по пункту 2 - путь сохранить нельзя, можно только значения но для сокращения кода можно так ... строки 88 и 116 ниже <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title> - jsFiddle demo</title> <style type='text/css'> * { margin: 0; padding: 0; } ul { list-style: none; } #container { position: relative; top: 20px; width: 640px; height: 480px; margin: 0 auto; box-shadow: 0 0 5px 5px rgba(0, 0, 0, .5); transition: all .2s; background: no-repeat center center; } #previous { position: absolute; left: 10px; top: 50%; margin-top: -20px; opacity: .5; cursor: pointer; } #previous:hover, #next:hover { opacity: 1; } #previous:active { margin-top: -18px; } #next:active { margin-top: -18px; } #next { position: absolute; right: 10px; top: 50%; margin-top: -20px; opacity: .3; cursor: pointer; } .nav { position: absolute; bottom: 0; left: 50%; width: 100px; margin-left: -50px; } .nav li { float: left; margin-right: 5px; margin-bottom: 5px; } .rule { display: block; height: 10px; width: 10px; border: 2px solid #fff; border-radius: 50%; } .active { background-color: red; } </style> <script> window.onload = function() { (function() { var container = document.getElementById("container"), button = document.getElementById("next"), previous = document.getElementById("previous"), array = ["http://www.umnet.com/pic/diy/screensaver/3845b123-a01a.jpg", "http://www.iceis.pl/640x480/640x480_-_niagarafalls640x480.jpg", "http://www.umnet.com/pic/diy/screensaver/87832121-ea64.jpg", "http://www.blackberry-wallpapers.com/uploads/allimg/110514/2-1105142029510-L.jpg"], sliderRules = document.querySelectorAll(".rule"), old, i = 0, j = sliderRules.length - 1, imgSet = function(link) { container.style.backgroundImage = "url(" + link + ")"; }; function slideMove() { i += this.id == "next" ? 1 : -1; if (i === array.length) { i = 0; } if (i < 0) { i = (array.length - 1); } sliderRules[i].click() } if (document.addEventListener) { button.addEventListener("click", slideMove, false); previous.addEventListener("click", slideMove, false); } for (; j > -1; j--) { var sliderRule = sliderRules[j]; sliderRule.indx = j; // dataset sliderRule.addEventListener("click", setImage, false); } sliderRule.click(); function setImage(e) { var link = this.href; imgSet(link); old && old.classList.remove("active"); old = this; i = +this.indx; old.classList.add("active"); e.preventDefault(); } }()); } </script> </head> <body> <div id="container"> <img src="https://www.gentec-eo.com/Content/images/home/slider/left-arrow.png" id="previous" width="40" height="40" > <img src="https://www.gentec-eo.com/Content/images/home/slider/right-arrow.png" id="next" width="40" height="40" > <ul class="nav"> <li><a class="rule" href="http://www.umnet.com/pic/diy/screensaver/3845b123-a01a.jpg"></a></li> <li><a class="rule" href="http://www.iceis.pl/640x480/640x480_-_niagarafalls640x480.jpg"></a></li> <li><a class="rule" href="http://www.umnet.com/pic/diy/screensaver/87832121-ea64.jpg"></a></li> <li><a class="rule" href="http://www.blackberry-wallpapers.com/uploads/allimg/110514/2-1105142029510-L.jpg"></a></li> </ul> </div> </body> </html> |
То есть на словах нельзя передать, непременно требуется носом ткнуть, а значит написать куда ткнуть. Ну, может в этом есть та самая сермяжная правда. Если бы на словах все понимали, кто б тогда вообще писал.
проиграйте http://learn.javascript.ru/play/wE82ub Текст действующего вещества (под нетронутую тряхомудию в исходнике) window.onload = function() { var image = document.getElementById("container"), next = document.getElementById("next"), prev = document.getElementById("previous"), image_list = document.querySelectorAll(".rule"), last; for(var i=0;i<image_list.length;i++) image_list[i].dataset.index=i; next.dataset.index=0; function render_image(e) { var index = parseInt(e.target.getAttribute('data-index')); var length=image_list.length; prev.dataset.index=(index-1 in image_list)?index-1:length-1; next.dataset.index=(index+1 in image_list)?index+1:0; var img = new Image(); img.onload=function(){ image.style.backgroundImage='url(\''+this.src+'\')'; }; img.src=e.target.href; e.target.classList.toggle('active'); if(last!=null) last.classList.toggle('active'); last=e.target; e.stopPropagation(); e.preventDefault() return false; } document.querySelector(".nav").addEventListener('click',render_image,true); next.addEventListener('click',function(){image_list[this.dataset.index].click();}); prev.addEventListener('click',function(){image_list[this.dataset.index].click();}); next.click(); } Как видите не одного текстового ключа, что, в том числе, позволяет смело смотреть in коллекцию, ибо невразумительно там найти иные ключи цифрами кроме тех, которые отождествляют искомое. Все тупо сделано на индексации, которая, собственно, рулит, а хрень типа if(name='next') - сосет. |
Кстати, насчет left-arrow.png Есть такая вот фишка
transform:scaleX(-1) которая из левой кнопки делает точно такую же - но правую. То есть нуна ровно 1 картинка, что в случае base64 весьма актуально. Да, не во всех браузерах, но во всех которыми современные люди пользуются, а на динозавров кладите. Тем не менее у меня в бланшете браузер под названием Интернет показал сука две левых кнопки, когда я зашел проверить как оно там. |
|
kostyanet,
вроде и оптимизировал и всё хорошо ... но грусно с вами ... да и защиту от дурака бы поставили, раз решили 1 клик на все ... типа if(!e.target.href) return; |
Poznakomlus,
человек именно хотел повелосипедить но не дали :cray: |
Цитата:
|
С вами рони похоже все потеряно, потому что тема прорезалась между несколько раз, вы демонстрировали мелкий прогресс, а понимать на словах не хотели.
Дело не в этом глупом коде, а в том что я в отличии от вас - старпер и все-таки научился принимать новое и проверять советы, а вы - молодой человек, уже все давным-давно решили и усугубляете своим примером жизнь тем, кому еще решать, а они уже тоже, типа, все решили, все им давно известно. Это нашефсе, национальное, кстати. Так вот, фишка в том если ссылки живые, то ответ на самый первый вопрос звучит так http://learn.javascript.ru/play/AHKQf потому что это ж ссылки - делай им фокус и браузер сам все за вас сделает. Подсветит в фокусе, погасит не в фокусе. Но живые ссылки как-то опасно выглядят. Одно неровное движение скрипта и юзер ухуярил на просмотр картинки в целом. Ну там можно поставить защиту типа target="_blank", конечно. Ну и второе, как раз живые ссылки на именно картинки, случай в практике редкий. Как правило мы имеем href ведущий на страницу, а картинки надо или вычислять из src тумбов, или заранее куда-то постить адреса полного размера чтобы взять и показать. ЗЫ Нахера там был какой-то массив я так и не понял. Из него кагбе подразумевалось делались линки что ли? Потому что если надо было юзать сам массив, то нахера там линки. |
kostyanet,
снова не понял ничего что вы написали, обидно :lol: впрочем как обычно. |
kostyanet,
error как выскакивал так и выскакивает, ещё и красное пропадает с кнопок. |
Рони, я единственное не понял в примере, который вы скинули.
вот строка кода в функции setImage: "old && old.classList.remove("active");" откуда мы берем значение в переменной old (чтобы понять, в какой именно кнопке необходимо убрать красное свечение)? ЗЫ. всем остальным. я не скрываю, что плохо знаю js. если бы моей задачей было просто прикрутить слайдер на какой-нибудь говносайт, я бы за полминуты нашел пример, сделанный на jquery. я пишу на этом форуме, чтобы научиться. не думаю, что здесь есть люди, которые хорошо изучили js за пару месяцев (если это их первый язык программирования) |
Нет там old, поскольку нет new. Последний щелкнутый элемент это стек глубиной вложения 1. Его можно расширить заменив переменную на массив: втыкать спереди, вытыкать сзади, получится типа хронология.
Ваш велосипед не имеет смысла потому что у вас href занят. Каким членом вы теперь откроете страницу по ссылке с картинки? А чтобы беспонту крутить картинки js вообще не нужен - для этого давно юзают CSS3 |
Цитата:
Цитата:
old = this; в этой строке храним нажатый так как первый раз old пуст делаем проверку, чтоб неполучить ошибку. if(old) {old.classList.remove("active")}; ну и конечно в коде бессмысленно болтается массив со ссылками. |
Цитата:
|
Smike,
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title> - jsFiddle demo</title> <style type='text/css'> * { margin: 0; padding: 0; } ul { list-style: none; } #container { position: relative; top: 20px; width: 640px; height: 480px; margin: 0 auto; box-shadow: 0 0 5px 5px rgba(0, 0, 0, .5); transition: all .2s; background: no-repeat center center; } #previous { position: absolute; left: 10px; top: 50%; margin-top: -20px; opacity: .5; cursor: pointer; } #previous:hover, #next:hover { opacity: 1; } #previous:active { margin-top: -18px; } #next:active { margin-top: -18px; } #next { position: absolute; right: 10px; top: 50%; margin-top: -20px; opacity: .3; cursor: pointer; } .nav { position: absolute; bottom: 0; left: 50%; width: 100px; margin-left: -50px; } .nav li { float: left; margin-right: 5px; margin-bottom: 5px; display: block; height: 10px; width: 10px; border: 2px solid #fff; border-radius: 50%; } .active { background-color: red; } </style> <script> window.onload = function() { (function() { var container = document.getElementById("container"), button = document.getElementById("next"), previous = document.getElementById("previous"), array = ["http://www.umnet.com/pic/diy/screensaver/3845b123-a01a.jpg", "http://www.iceis.pl/640x480/640x480_-_niagarafalls640x480.jpg", "http://www.umnet.com/pic/diy/screensaver/87832121-ea64.jpg", "http://www.blackberry-wallpapers.com/uploads/allimg/110514/2-1105142029510-L.jpg"], sliderRules = document.querySelectorAll(".nav li"), old, i = 0, j = sliderRules.length - 1, imgSet = function(link) { container.style.backgroundImage = "url(" + link + ")"; }; function slideMove() { i += "next" == this.id ? 1 : -1; i == array.length && (i = 0); 0 > i && (i = array.length - 1); sliderRules[i].click() }; button.addEventListener("click", slideMove, false); previous.addEventListener("click", slideMove, false); for (; j > -1; j--) { var sliderRule = sliderRules[j]; sliderRule.dataset.indx = j; sliderRule.addEventListener("click", setImage, false); }; sliderRule.click(); function setImage(e) { i = +this.dataset.indx; var link = array[i]; var img = new Image(); img.onload = function() { imgSet(link); }; img.src = link; img.complete && img.onload(); old && old.classList.remove("active"); old = this; old.classList.add("active"); e.preventDefault(); } }()); } </script> </head> <body> <div id="container"> <img src="https://www.gentec-eo.com/Content/images/home/slider/left-arrow.png" id="previous" width="40" height="40" > <img src="https://www.gentec-eo.com/Content/images/home/slider/right-arrow.png" id="next" width="40" height="40" > <ul class="nav"> <li></li> <li></li> <li></li> <li></li> </ul> </div> </body> </html> |
Цитата:
говнокод где надо думать что к чему, хотя думать тут не о чем: old && old.classList.remove("active"); old = this; old.classList.add("active"); код, где думать не о чем, поскольку все самоочевидно: this.classList.add("active"); if(old) old.classList.remove("active"); old=this; все потому что по-нашему нельзя чтобы все было просто и понятно - нация не оценит; по-нашему надо все простое и понятное превратить в замудреное гавно, чтоб оно плющило и таращило, чтобы такие как ТС задавали "глупые" вопросы что такое и откуда old. Поэтому у вас дохуя очков, а у меня нихуя - вы протагонист национальной традиции. |
Smike,
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title> - jsFiddle demo</title> <style type='text/css'> * { margin: 0; padding: 0; } ul { list-style: none; } #container { position: relative; top: 20px; width: 640px; height: 480px; margin: 0 auto; box-shadow: 0 0 5px 5px rgba(0, 0, 0, .5); transition: all .2s; background: no-repeat center center; } #previous { position: absolute; left: 10px; top: 50%; margin-top: -20px; opacity: .5; cursor: pointer; } #previous:hover, #next:hover { opacity: 1; } #previous:active { margin-top: -18px; } #next:active { margin-top: -18px; } #next { position: absolute; right: 10px; top: 50%; margin-top: -20px; opacity: .3; cursor: pointer; } .nav { position: absolute; bottom: 0; left: 50%; width: 100px; margin-left: -50px; } .nav li { float: left; margin-right: 5px; margin-bottom: 5px; display: block; height: 10px; width: 10px; border: 2px solid #fff; border-radius: 50%; } .active { background-color: red; } </style> <script> window.onload = function() { (function() { var container = document.getElementById("container"), button = document.getElementById("next"), previous = document.getElementById("previous"), array = ["http://www.umnet.com/pic/diy/screensaver/3845b123-a01a.jpg", "http://www.iceis.pl/640x480/640x480_-_niagarafalls640x480.jpg", "http://www.umnet.com/pic/diy/screensaver/87832121-ea64.jpg", "http://www.blackberry-wallpapers.com/uploads/allimg/110514/2-1105142029510-L.jpg"], sliderRules = document.querySelectorAll(".nav li"), j = sliderRules.length - 1, imgSet = function(link) { container.style.backgroundImage = "url(" + link + ")"; }; container.addEventListener("click", newX, false); for (; j > -1; j--) { var sliderRule = sliderRules[j]; sliderRule.dataset.indx = j; }; sliderRule.classList.add("active"); sliderRule.click(); function newX(e) { var elem = e.target; var i = +elem.dataset.indx; if (isNaN(i)) return; var next = i + 1; next == array.length && (next = 0); var prev = i - 1; 0 > prev && (prev = array.length - 1); button.dataset.indx = next; previous.dataset.indx = prev; document.querySelector('.active').classList.remove("active"); sliderRules[i].classList.add("active") var link = array[i]; var img = new Image(); img.onload = function() { imgSet(link); }; img.src = link; img.complete && img.onload(); e.preventDefault(); } }()); } </script> </head> <body> <div id="container"> <img src="https://www.gentec-eo.com/Content/images/home/slider/left-arrow.png" id="previous" width="40" height="40" > <img src="https://www.gentec-eo.com/Content/images/home/slider/right-arrow.png" id="next" width="40" height="40" > <ul class="nav"> <li></li> <li></li> <li></li> <li></li> </ul> </div> </body> </html> |
На сайте SO в старых ответах внизу, там где рейтинги нуль или меньше, можно наблюдать или тупейший ответ, или маргинальный ответ. Я много фишек нашел именно в том самом низе. Напишет понимающий правильный ответ, но никто не понял, пролетело. Ну или дурачок рядом изложит свое баянистое мировоззрение.
Буквально вчера было - http://stackoverflow.com/questions/2...y-key-of-table - самый популярный ответ вовсе не самый ответ, а ответ с тремя баллами - самый ответ. Ну вот, я думаю Рони бы ошивался там в подвале со своими баянами, как и я со своими баянами. Потому что все делается вообще не так и так никто не делает как мы тут обсуждаем. Нормальные люди берут JQ, плугин и нахер им думать о баянах. |
Огромное спасибо за помощь, Рони, я правда ценю то, что вы потратили свое время.
Увидимся в следующих темах) ЗЫ. думал, что на прогерских форумах не ругаются так. =))) |
Это все баттхерт, я в нете трещу уже лет 20, навидался. Роне он в ноги поклонится, так принято, а сделает как проще, поскольку не враг сам себе. Ну, если только интеллигент, тогда сделает как враг себе.
|
Часовой пояс GMT +3, время: 14:20. |