JS實現輪播圖思路整理

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">&lt;</a>
        <a href="javascript:;" id="next" class="arrow">&gt;</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();

        });
相關文章
相關標籤/搜索