JS連續滾動幻燈片:原理與實現


什么是連續滾動幻燈片?打開一些網站的首頁,你會發現有一塊這樣的區域:一張圖片,隔一段時間滑動切換下一張;同時,圖片兩端各有一個小按鈕,供你手動點選下一張;底部有一排小圓圈,供你選定特定的某幀圖片。這就是“連續滾動幻燈片”(我自己的叫法,當然它也可能叫焦點輪播圖,輪播圖等等等等),本文單講手動連續切換,不涉及自動播放和底部小圓圈。

實現這種幻燈片有幾個難點:

1.圖片放置:你需要把所有圖片放入一個div(這里就把它的class叫做pics吧)中,再把pics放入一個更大的div(就命名為container吧)中,然后把container的寬度設為一張圖片的寬度,再給它設置overflow:hidden。然后把pics的寬度設置為所有圖片的總寬度。這樣方便后面從左向右切換。如下圖所示:

2.圖片輪播。基本要領是,當點擊next按鈕的時候,將pics容器的left屬性定義到下一張圖片的位置,從而移動到下一張圖片,例如,假設當前是第二張圖片,那么點擊按鈕的時候應該把pics的left值設為-640*2 + 'px'(因為我這里用的圖片都是-640px的)(當然這里還要加入一個計數器,當點到最后一張圖片的時候,計數器置0)。

如果你不打算加入平滑移動的動畫,那到這里就可以結束了。但是如果你打算加入動畫,這里就有一個問題:當移動到最后一張圖片的時候,繼續點擊,圖片組會由最后一張長途跋涉回滾到第一張,這樣用戶體驗很不好。理想的狀態應當是,當你滾動到最后一張繼續滾動的時候,應當像之前滾向下一張一樣無縫滾動。不知道我說的清不清楚,大致就是:像手機屏幕一樣,當你滑動到最后一屏的時候接着滑動,會直接滑回一屏,也就是循環滑動。

本文的主要目的就是說明這種循環滑動的實現方法。

它的基本原理是,你要在正常的圖片組的最后面加入一張緩沖圖片(src和第一張圖片相同),當幻燈片正處於最后一張圖片的時候,點擊滑動按鈕,平滑滑動到這張緩沖圖片,當用戶下一次點擊的時候,再悄悄地把圖片置換回真正的第一張圖片,然后再執行動畫。由於置換回第一張圖片的時候是立即執行的,所以用戶不會發現圖片已經回到了真正的第一張,這就實現了循環滑動。下面請看具體代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>無限滾動</title>
    <style type="text/css">
        .main{position:relative;height:360px;width:640px;overflow: hidden;}
        .pics{position:absolute;top:0;left:0;height:360px;width:3200px;}
        .pics img{float:left;height:100%;width:20%;}
    </style>
</head>
<body>
    <!--
    為了行文簡單,我這里只添加了一個next按鈕,如果你還要添加prev按鈕,那應該在
    第一張圖片之前也加入一張緩沖圖片,src和最后一張圖片相同。
    -->    
    <div class="main">
        <div class="pics">
            <img class="mainflow" src="img/0.jpg" alt="" />
            <img class="mainflow" src="img/1.jpg" alt="" />
            <img class="mainflow" src="img/2.jpg" alt="" />
            <img class="mainflow" src="img/3.jpg" alt="" />
            <!--↑↑↑真正的最后一張-->
            <img class="mainflow" src="img/0.jpg" alt="" />
            <!--↑↑↑緩沖圖-->
        </div>
    </div>
        <div>
            <div class="btn"><button>NEXT</button></div>
        </div>
        <script type="text/javascript">
            var btn = document.getElementsByClassName("btn")[0];
            var pics =  document.getElementsByClassName("pics")[0];
            var mainflow =  document.getElementsByClassName("mainflow");
            var cnt = 0;//計數器
            //主函數
            btn.onclick = function(){
                if(-cnt == mainflow.length - 1){
                    //如果達到最后一張圖片,就要特殊處理。
                    //當按下NEXT按鈕時,應該先把圖片瞬間從緩沖圖切換到真正的
                    //第一張,然后再執行動畫。
                    pics.style.left = "0px";
                    cnt = 0;
                    //這里我一開始用CSS3自帶的transition動畫,結果發現它太不好控制了,
                    //掙扎了很久,自己寫了動畫。
                    animate(pics,(--cnt)*640);

                }else{
                    //一般情況,直接執行切換動畫。
                    animate(pics,(--cnt)*640);
                }
            }

            //動畫函數開始,target代表要對誰進行滾動,offset代表滾動的距離,
            //也就是一張圖片的寬度。
            function animate(target,offset){
                //先用offsetLeft儲存好target.style.left,因為后面要用到它,
                //style.left本身只能讀取內聯樣式style="xxxx"里面的樣式,如果沒有內聯樣式
                //就直接讀取,只會返回空值。
                target.style.left = target.offsetLeft;

                //這里是主要部分
                function go(){
                    //每隔15毫秒,向左移動16個像素。這兩個值要多試幾次,不然動畫會一卡一卡
                    target.style.left = (parseInt(target.style.left) - 16) +"px";
                    timer = setTimeout(go,15);
                    //如果到目的地了就停止滾動
                    if(parseInt(target.style.left) == offset) clearTimeout(timer);
                }
                //別忘了執行一下它。。
                go();
            }
        </script>
</body>
</html>

 

 

參考資料:

1.慕課網課程,焦點輪播圖特效。http://www.imooc.com/learn/18


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM