用jQuery和原生js實現圖片左右輪播

實現一個輪播圖的功能

  1. 圖片數量及URL均在HTML中寫好
  2. 能夠配置輪播的順序(正序、逆序)、是否循環、間隔時長
  3. 圖片切換的動畫流暢
  4. 在輪播圖下方自動生成對應圖片的小點,點擊小點,輪播圖自動動畫切換到對應的圖片

大體思路:

將圖片設爲向左浮動,再經過jQuery中animate函數,左右滑動顯示圖片,使用setInterval()定時函數控制循環,間隔時長javascript


思路實現:

https://jsfiddle.net/donqi/df3dzsme/css

html結構:html

 
<div class="showbox">
        <div class="imagebox"> //放置圖片
            <img src="image/1.jpg" alt="1.jpg">
            <img src="image/2.jpg" alt="2.jpg">
            <img src="image/3.jpg" alt="3.jpg">
            <img src="image/4.jpg" alt="4.jpg">
        </div>
        <div class="icobox"> //放置圖標
            <pan rel="0" class="active">0</span>
            <span rel="1">1</span>
            <span rel="2">2</span>
            <span rel="3">3</span>
        </div>
    </div>

css:java

.showbox{
    position: relative;
    height: 300px;
    width: 570px;
    overflow: hidden;
    border: 10px solid #eee;
    background-color: #eee;
    border-radius: 10px;
    -webkit-border-radius:10px;
    -moz-border-radius:10px;
}

.imagebox{
    position: relative;
    height: 270px;
    width: 570px;
    top: 0;
    left: 5px;
    overflow: hidden; 
}

.imagebox img{
    display: block;
    width: 570px;
    height: 270px;
    float: left;

}

.icobox{
    position: absolute;
    border: none;
    width: 120px;
    height: 12px;
    left: 220px;
    bottom: 10px;
    text-align: center;
    line-height: 40px;
    overflow: hidden;
}

.icobox span{
    background: url("../image/ico.png") 0px 0px no-repeat;
    width: 12px;
    height: 12px;
    cursor: pointer;
    float: left;
    margin-left: 3px;
}

.icobox span.active{
    background: url("../image/ico.png") 0px -12px no-repeat;
    cursor: default;
}

javascript:web

$(document).ready(function() {
    var imagebox=$(".showbox").children('.imagebox')[0],//得到圖片容器
        icobox=$(".showbox").children('.icobox')[0],//得到圖標容器
        ico=$(icobox).children('span'),//得到圖標數組
        imagenum=$(imagebox).children().size(),//得到圖片數量
        imageboxWidth=$(imagebox).width(),//得到圖片容器的寬度
        imagewidth=imageboxWidth*imagenum,//得到圖片的總寬度
        activeID = parseInt($($(icobox).children(".active")[0] ).attr("rel")),//得到激活的圖標ID
        nextID=0,//下一個圖標的ID
        intervalID,//setInterval()函數的ID
        delaytime=4000,//延遲的時間
        speed=700;//執行速度
        $(imagebox).css({'width' : imagewidth + "px"});

        var rotate=function(clickID) { //圖片滑動函數
            if (clickID+1){
                nextID=clickID;
            }else{
                nextID=(activeID+1)%4;
            };
            $(ico[activeID]).removeClass('active');
            $(ico[nextID]).addClass('active');
            $(imagebox).animate({left:"-"+nextID*imageboxWidth+"px"}, speed);//jQuery中的animate函數
            activeID=nextID;
        }

        intervalID=setInterval(rotate,delaytime);//循環函數

        $.each(ico, function(index, val) {
            $(this).click(function(event) {
                clearInterval(intervalID);//清楚以前的定時任務
                 var clickID = index;
                 rotate(clickID);//運行一次帶參數的rotate函數
                 intervalID = setInterval(rotate,delaytime);
            });
        });
});

注意:

  1. 給容器設置overflow:hidden十分重要
  2. 點擊小圓點時,必定要清除上一次的定時器,從新開始定時器時,要給intervalID從新賦值
  3. imagebox的寬度要和image的寬度相等,不然循環顯示時,就會出現box中有一大一小兩張圖片

待改進:

從最後一張圖片到第一張圖片時,要經歷中間全部的圖片,若能實現單向循環,最後一張圖片右滑到第一張圖片。數組

改進

將第一張圖片用animate將其寬度變爲0,放到最後img列表的最後一位,這樣能保證是一個方向,不過圖片寬度是縮減爲0,看起來效果也不是很好app

代碼改動以下:函數

setInterval(function(){
                $('.imagebox').append($('.imagebox img').first());
                $('.imagebox img').last().css({'width' :  "570px"});
                $('.imagebox img').first().animate({'width':'0px'},1000);
            },3000)

簡單demo以下:
https://jsfiddle.net/donqi/20yxy062/1/embedded/動畫

說明

用上面這種辦法橫向滾動效果不太好,可是縱向效果挺好,下面是縱向滾動的demo:
https://jsfiddle.net/donqi/87qqjm4z/this

相關文章
相關標籤/搜索