html結構層javascript
<div class="index-banner" id="banner"> <div class="banner-list" id="banner_list" style="left:-1610px;"> <a href="http://www.icourse163.org/" class="banner3" target="_blank"></a> <a href="http://open.163.com/" class="banner1" target="_blank"></a> <a href="http://study.163.com/" class="banner2" target="_blank" ></a> <a href="http://www.icourse163.org/" class="banner3" target="_blank"></a> <a href="http://open.163.com/" class="banner1" target="_blank"></a> </div> <div class="slide" id="slideBtn"> <span index="1" class="active"></span> <span index="2"></span> <span index="3"></span> </div> <a href="javascript:;" id="prev" class="arrow"><</a> <a href="javascript:;" id="next" class="arrow">></a> </div>
css表現層css
.index-banner { position: relative; width:1610px; height: 461px; margin:0 auto; overflow: hidden; } .index-banner .banner-list{ position: absolute; width:8050px; height: 461px; z-index: 1; } .index-banner .banner-list a{ display: block; float: left; width:1610px; height:461px; } .banner1{ background: url("../images/banner1.jpg") no-repeat; } .banner2{ background: url("../images/banner2.jpg") no-repeat; } .banner3{ background: url("../images/banner3.jpg") no-repeat; } .index-banner .slide{ position: absolute; z-index: 2; left:50%; margin-left:-5px; bottom: 20px; } .index-banner .slide span{ display: inline-block; cursor: pointer; margin-right: 10px; width: 10px; height: 10px; border-radius: 50%; background-color: #fff; } .index-banner .slide .active{ background-color: #000; } .arrow { cursor: pointer; position: absolute; z-index: 2; top: 180px; display: none; line-height: 70px; text-align: center; vertical-align: middle; font-size: 35px; font-weight: bold; width: 50px; height: 70px; background-color: RGBA(0,0,0,.3); color: #fff; } .arrow:hover { background-color: RGBA(0,0,0,.7);} .index-banner:hover .arrow { display: block;} #prev { left: 20px;} #next { right: 20px;}
JS實現原理:經過改變圖片的偏移量來實現圖片的切換
實現步驟:一、經過documnet.getElementById()獲取頁面須要操做的元素html
window.onload=function(){ var banner=document.getElementById("banner");//獲取輪播圖父容器; var list=document.getElementById("banner_list");//獲取圖片列表; var buttons=document.getElementById("slideBtn").getElementsByTagName("span");//獲取圖片切換圓點按鈕; var pre=document.getElementById("prev");//獲取向左切換箭頭 var next=document.getElementById("next");//獲取向右切換箭頭;
二、實現左右箭頭的切換:給左右箭頭綁定點擊事件;
問題:在左右切換過程當中會在圖片切換完會顯示空白?
解決方法:使用無限滾動的技巧,即實現循環無縫切換:
1)在頁面圖片列表的開始加上最後一張圖片的附屬圖,在最後加上第一張圖片的附屬圖
2)每次切換時判斷切換後的位置是否大於-1610px或是小於-4830px(便是否切換到附屬圖的位置):
若是大於-1610px,就把圖片從新定位到真正的最後一張圖的位置:-4830px;
若是小於-4830px,就把圖片從新定位到真正的第一張圖的位置:-1610px;java
var index=1;//用於存放當前要顯示的圖片,初始值爲第一張圖片 var animated=false;//優化動畫執行效果,只有當前切換動畫未執行時,才能被執行。解決當前動畫執行未完成時,屢次點擊切換按鈕致使的頁面卡圖現象,初始值爲false pre.onclick=function(){ //切換到當前圖片左邊的圖片,若是當前是第一張,會切換到最後一張 if(index==1){ index=3; } //不然會切換到前一張,即index-1 else{ index-=1; } //每次點擊時,判斷animated爲false時執行切換 if(!animated){ animate(1610); } //設置當前圓點按鈕樣式切換到選中狀態,其餘圓點爲未選中狀態 showBtn(); } next.onclick=function(){ //切換到當前圖片右邊的圖片,若是當前是最後一張,會切換到第一張 if(index==3){ index=1; } //不然會切換到下一張,即index+1 else{ index+=1; } //每次點擊時,判斷animated爲false時執行動畫 if(!animated){ animate(-1610); } //設置當前圓點按鈕樣式切換到選中狀態,其餘圓點爲未選中狀態 showBtn(); } //將偏移的動做封裝到函數animate()中 function animate(offset){ animated=true;//調用animate()切換時設置爲true; var newleft=parseInt(list.style.left)+offset;//偏移以後的位置 var time=500;//位移總時間 var interval=10;//位移間隔時間 var speed=offset/(time/interval);//每次位移量 =總偏移量/次數 function go(){//遞歸,在函數內部調用自身實現入場圖片500ms淡入的效果 //判斷偏移量是否達到了目標值,若是沒有,在原來的基礎上繼續移動 if((speed<0 && parseInt(list.style.left)>newleft)||(speed>0 && parseInt(list.style.left)<newleft)){ list.style.left=parseInt(list.style.left) + speed +'px'; //設置定時器,每隔interval的時間調用一下go()函數 //setTimeout()函數只會被執行一次 setTimeout(go,interval); } //若是達到了目標值,就將newleft值設置爲目標值, else{ animated=false;//切換結束,設置爲false; //獲取當前圖片的left值:用list.style.left獲取left的字符串,須要parseInt()函數將字符串轉換爲數值 list.style.left = newleft+'px'; //設置無縫切換 if( newleft > -1610 ){ list.style.left='-4830px'; } if( newleft < -4830){ list.style.left='-1610px'; } } } go();//調用animate()時執行go()函數 } //將圓點按鈕樣式切換封裝到showBtn()函數中 function showBtn(){ //遍歷圓點按鈕數組 for(var i=0;i<buttons.length;i++){ var button=buttons[i]; //取消以前按鈕設置的active狀態 if(button.className == 'active'){ button.className=''; break; } } //設置當前圖片對應的圓點按鈕狀態爲active buttons[index-1].className='active'; }
三、實現圓點按鈕點擊切換:遍歷底部圓點按鈕數組,爲每一個按鈕添加點擊事件jquery
for(var i=0;i<buttons.length;i++){ var button=buttons[i]; button.onclick=function(){ //程序優化:若是點擊當前處於active狀態的按鈕,則不執行任何操做 if(this.className=='active'){ return;//當程序執行到這裏時會退出當前函數,不會再執行後面的語句 } //問題:如何在點擊圓點按鈕時,定位切換到對應的圖片上? //解決方法:獲取html頁面按鈕上自定義的index屬性值,經過該index值能夠算出每次點擊的按鈕距以前按鈕的偏移量, var myIndex=parseInt(this.getAttribute('index'));//獲取自定義的屬性的值並轉換爲數字 var offset=-1610 * (myIndex-index);//算出偏移量 if(!animated){ animate(offset);//調用animate實現切換 } index=myIndex;//更新當前的index值 showBtn();//調用showBtn實現按鈕的樣式切換 } }
四、實現圖片自動切換:實現每5s切換圖片,圖片循環播放;數組
var timer;//設置自動播放的定時器 function play(){ //設置定時器,每隔5s點擊右鍵頭切換按鈕 timer=setInterval(function(){ next.onclick(); },5000); } function stop(){ //暫停自動播放 clearInterval(timer); } banner.onmouseover=stop;//鼠標懸停某張圖片,則暫停切換; banner.onmouseout=play;//鼠標移除時,繼續自動切換; play();//初始化時執行自動播放 }//window.onload加載完成
使用jquery實現以下,思路不變:
$(function () { var banner= $('#banner'); var list = $('#banner_list'); var buttons = $('#slideBtn span'); var prev = $('#prev'); var next = $('#next'); var index = 1; var interval = 5000; var timer; function animate (offset) { var left = parseInt(list.css('left')) + offset; if (offset>0) { offset = '+=' + offset; } else { offset = '-=' + Math.abs(offset); } list.animate({'left': offset}, 500, function () { if(left > -1610){ list.css('left',-4830); } if(left < 4830) { list.css('left',-1610); } }); } function showButton() { buttons.eq(index-1).addClass('active').siblings().removeClass('active'); } function play() { timer = setTimeout(function () { next.trigger('click'); play(); }, interval); } function stop() { clearTimeout(timer); } next.bind('click', function () { if (list.is(':animated')) { return; } if (index == 3) { index = 1; } else { index += 1; } animate(-1610); showButton(); }); prev.bind('click', function () { if (list.is(':animated')) { return; } if (index == 1) { index = 3; } else { index -= 1; } animate(1610); showButton(); }); buttons.each(function () { $(this).bind('click', function () { if (list.is(':animated') || $(this).attr('class')=='active') { return; } var myIndex = parseInt($(this).attr('index')); var offset = -1610 * (myIndex - index); animate(offset); index = myIndex; showButton(); }) }); banner.hover(stop, play); play(); });