用Jquery制作一個無縫滾動輪播

這篇文章的目的是幫助自己復習,還有寫東西的時候的思路。


Paste_Image.png

首先我們看一下制作一個輪播的思路:

  • 先把輪播的HTML和CSS給寫好,這一步就不多講,本文章主要講的是JS的實現。
  • 既然是無縫的輪播,那么首先圖片就要排成一排
  • 有一個視口,超出視口的圖片要隱藏(在CSS實現,overflow:hidden
  • 滾動的時候視口進行偏移,偏移到下個圖片
  • 到最后一張(或第一張往前)的時候,要連續的滾動,而不是瞬間回滾到第一張
    有了思路就可以開始實現JS了
    先附上HTML結構:
    <body>
    <div class="ct">
        <ul class="img-ct">
            <li><a href="#"><div></div>![](http://upload-images.jianshu.io/upload_images/1469441-9585c5b76366d055.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)</a></li>
            <li><a href="#">![](http://upload-images.jianshu.io/upload_images/1469441-ba3e88027c3139a0.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)</a></li>
            <li><a href="#">![](http://upload-images.jianshu.io/upload_images/1469441-7a64285ff69de434.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)</a></li>
            <li><a href="#">![](http://upload-images.jianshu.io/upload_images/1469441-af3eeeddd9808e10.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)</a></li>
        </ul>
        <a class = 'pre  arrow' href="#"><</a>
        <a class = 'next arrow' href="#">></a>
        <ul class="nav">
            <li class = 'setcolor'></li>
            <li></li>
            <li></li>
            <li></li>
        </ul>
    </div>
</body>

首先我們寫效果的第一步是什么?就是拿到相應的DOM節點

 var    $ct = $('.img-ct'),      //獲取視口節點
        $items = $ct.children(), //獲取視口下需要輪播的圖片元素
        $pre = $('.pre'),       //獲取上一張功能按鈕
        $next = $('.next'),     //獲取下一張功能按鈕
        imgWidth = $items.width(),//獲取滾動元素的寬
        imgCount = $ct.children().size(),//獲取有多少個滾動的元素

下面的代碼是要實現思路4,5的核心,很重要!

        $ct.prepend($items.last().clone()),
        $ct.append($items.first().clone());
        imgnewwidth = $ct.children().size();
        $ct.css({left:0-imgWidth,width:imgnewwidth*imgWidth})
  • 第一行首先獲取到輪播圖片元素的最后一張然后clone,然后將clone后的副本prepend到視口的第一個
  • 第二行同理,把第一張clone一下append到最后面
  • 第三行重新計算元素的數量,原本是4個。現在變成了6個(這里要注意!重新計算數量要重新查找DOM元素,不能直接利用上面的$items.size來計算,要重新使用$ct.children().size),不然還是4張!)
  • 第四行設置視口的初始位置和它的總寬度
    然后元素的排列就變成了如下視口圖(自己畫的有點丑)
Paste_Image.png

其中數字代表的是圖片的順序,因為我們上面設置了視口的初始位置(left:0-imgWidth這里我給設置的圖片寬度為500px),那么初始位置就變成了-500px,那么顯示的圖片就是第一張了(按上面那張圖就是第二張)。
接下來開始綁定事件,我們想實現一個功能的時候,要先想能做什么,在去想要怎么做:

    $next.on('click',function(){
                playnext();
            })
    $pre.on('click',function(){
                playpre();
            })

這里我們為前進和后退按鈕綁定了事件,當我點前進按鈕的時候就會執行playnest函數,然后我們下面再想playnext函數的實現。

        var curidx =0;//聲明初始的坐標
        var mov = 1;//移動的次數
            function playnext(){
                $ct.animate({left:'-='+mov*imgWidth},function(){
                    //當點擊后,會執行這個動畫,把視口向右移動一個圖片寬度的距離,就剛好像滾動一樣
                    curidx+=mov;//然后坐標加1,表明移動一格
                    if(curidx===imgCount){
                        $ct.css({left:0-imgWidth});
                        curidx=0;
                    }
                    //如果已經移動到了最后一張圖片,也就是末尾clone的1圖片,就馬上將視口設置為剛開始那樣,因為同一張圖片的變換人是看不出來的,然后再把坐標給設置回0.
                })
            }

反之,后退按鈕是一樣的:

    function playpre(){
                $ct.animate({left:'+='+mov*imgWidth},function(){
                    curidx-=mov;
                    if(curidx===(-1)){
                        $ct.css({left:0-imgWidth*imgCount});
                        curidx=3;
                    }
                })
            }

就是修改了下其中的參數,具體可以參考之前的視口圖食用。
這樣就完成啦!看看效果吧!
這是源碼
無縫輪播demo

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容