1. 程式人生 > >三十五、jquery動畫 無縫滾動兩種方式

三十五、jquery動畫 無縫滾動兩種方式

無縫輪播有兩種方式,一種可以讓ul中的每個li進行移動,另外一種時令整個ul進行移動。無縫輪播效果之前用js寫過一次,以下是用jQuery分別實現這兩種方式;

 

一、第一種 控制每個li標籤移動實現無縫輪播

1.基本佈局樣式

2.實現自動向左輪播

採用列舉物件封裝函式的方法,封裝自動輪播的方法:利用jQuery的自定義動畫animate改變第一張圖片的marginLeft令其向左移動,當移動結束時將第一張圖片追加到末尾。(注意還需修改其marginLeft0)

animate({執行動畫屬性},執行時間,運動方式,動畫完成回撥函式)

var Animate={
    

//自動輪播
    imganimate:function(){
        $(".ulinfo li").first().animate({
            marginLeft:"-600px"
        },1000,"linear",function(){
            
$(".ulinfo").append($(this));
            $(this).css("marginLeft","0px");
        })
    }
}

 

3.滑鼠進入圖片停止輪播離開繼續輪播

採用鏈式操作;移除繫結定時器;

//滑鼠進入停止 離開繼續
pauseimg:function(){
    

$(".block").mouseenter(function(){
        clearInterval(time);
    }).mouseleave(function(){
        time=setInterval("Animate.imganimate()",1500);
    });
},

 

4.封裝索引圈建立方法及跟隨圖片自動轉換

利用jQuery動態建立dom元素建立索引圈;

//索引圈建立
circleCreate:function(){
   var lenth=$(".ulinfo li").length;
   for (var i=0;i<lenth;i++){
       var circle=$("<div></div>");
       circle.addClass("dian");
       $(".circle").append(circle);
   }
   $(".dian").eq(0).css("backgroundColor","red");
}

定義全域性變數,在自動輪播封裝方法新增索引圈自動跟隨變換;

注意:count這裡%6,當然也可以if判斷設定count=0;

//索引圈自動跟隨轉換
count++;
$(".dian").css("backgroundColor","");
$(".dian").eq(count%6).css("backgroundColor","red");

 

5.封裝任意進入某個索引圈對應圖片跟隨轉換

首先任意進入一個索引圈,其他索引圈為白,當前為紅;

求當前進入索引圈索引值與圖片索引值(count%6)的差值,判斷差值正負,正值則進入圈在播放圖片之後,負值則進入圈在播放圖片之前,這時就需要處理差值,根據這個值確定圖片輪轉的次數;

注意:這裡需要處理兩個bug

A. 反覆進入同一個圈的bug

B. 當快速滑過幾個索引圈,上一個還未結束下一個操作被觸發的bug(遞迴方法,移除繫結事件;或者定義標誌位處理bug)

//進入索引圈對應圖片跟隨變換
incircle:function(){
    $(".dian").each(function(index){
        $(this).mouseenter(function(){
            //解綁其它索引圈進入事件
            $(".dian").css("backgroundColor","").unbind("mouseenter");
            $(this).css("backgroundColor","red");
            //計算輪播次數
            var num=(index-count%6)<0?index-count%6+6:index-count%6;
            //處理反覆進入同一索引圈的bug
            if(num==0){
                Animate.incircle();
                return;
            }

            shift();
            var shiftnum=0;//定義實際輪播次數
            function shift(){
                $(".ulinfo li").first().animate({
                    marginLeft:"-600px"
                },1000/num,function(){
                    $(".ulinfo").append($(this));
                    $(this).css("marginLeft","0px");

                    shiftnum++;
                    if(shiftnum>=num){
                        count=index;
                        Animate.incircle();
                        return;
                    }

                    shift();//遞迴呼叫
                });

            }
        });
    })

},

//進入索引圈對應圖片跟隨變換
incircle:function(){
    $(".dian").each(function(index){
        $(this).mouseenter(function(){
            //解綁其它索引圈進入事件
            $(".dian").css("backgroundColor","").unbind("mouseenter");
            $(this).css("backgroundColor","red");
            //計算輪播次數
            var num=(index-count%6)<0?index-count%6+6:index-count%6;
            //處理反覆進入同一索引圈的bug
            if(num==0){
                Animate.incircle();
                return;
            }

            shift();
            var shiftnum=0;//定義實際輪播次數
            function shift(){
                $(".ulinfo li").first().animate({
                    marginLeft:"-600px"
                },1000/num,function(){
                    $(".ulinfo").append($(this));
                    $(this).css("marginLeft","0px");

                    shiftnum++;
                    if(shiftnum>=num){
                        count=index;
                        Animate.incircle();
                        return;
                    }

                    shift();//遞迴呼叫
                });

            }
        });
    })

},

5.左右箭頭點選事件

需要注意的是點選右邊時,輪播是反方向,需要每次將最後一張新增到最前面,原本第一張向後調整600px,另外索引圈也是反方向轉;

注意:通過移除繫結事件處理多次連續點選的bug

  點選右側反向,需要改變ulmarginleft值處理空白的bug; 

is() 根據選擇器/元素/jQuery 物件檢查匹配元素集合,如果存在至少一個匹配元素,則返回 true

 

//左右點選
AddClick:function(){
    $("#left,#right").on('click',addclick);

    function addclick() {
        var that=$(this);
        that.unbind("click",addclick);

        if($(this).is("#left")){//判斷左右
            //left
            $(".ulinfo li:first").animate({
                marginLeft:"-600px"
            },500,"linear",function(){
                $(this).appendTo($(this).parent());
                $(this).css("marginLeft","0px");
                //索引圈也得跟隨
                count++;
                $(".dian").css("backgroundColor","");
                $(".dian").eq(count%6).css("backgroundColor","red");

                //重新繫結事件
                $(that).bind("click", addclick)
            })
        }else{
            //right
            $(".ulinfo li:first").animate({
                marginLeft: "600px"
            },500, "linear", function () {
                $(".ulinfo li:last").prependTo($(this).parent());
                $(this).css("marginLeft","0px");

                count--;
                $(".dian").css("backgroundColor", "");
                $(".dian").eq(count % 6).css("backgroundColor", "red");

                //重新繫結事件
                $(that).bind("click",addclick);
            });
        }
    }
}

 

二、第二種 控制整個ul標籤移動實現無縫輪播(較第一種簡單)

 

1.基本結構樣式一致

2.自動向左輪播:將整個ul向左移動,當移動完最後一張圖片,整體調回原來的位置,這樣會有一個空白閃回的bug,所有需要複製第一張到末尾;

clone() 生成被選元素的副本 即複製;

var count=0;//定義變數控制輪播
var time;
$(function(){
    //複製
    ($(".ulinfo li").first().clone()).appendTo($(".ulinfo"));
    //自動輪播
    time=setInterval(shift,1000);
    function shift(){
        count++;
        $(".ulinfo").animate({
            marginLeft:(-600*count)+"px"
        },500,"linear",function(){
           if(count>=$(".ulinfo li").length-1){
               $(".ulinfo").css("marginLeft","0px");
               count=0;
           }
        })
    }
})

 

3.新增索引點自動跟隨輪播及任意進入事件

這裡首先得建立索引點,建立方法和li輪播一致;

自動跟隨可直接新增到圖片自動輪播內;

任意進入執行動畫事件,只需利用遍歷點的當前索引值控制整個ul的移動即可,之前向右滑動,之後向左滑動,近慢遠快;

注意:當移動結束後將當前點的索引值賦給count,令自動輪播緊接著這個點繼續;

  還需新增shop()動畫,處理多次滑動的bug;

//任意點進入執行動畫
$(".dian").each(function(index){
    $(this).mouseenter(function(){
        $(".dian").css("backgroundColor","");
        $(this).css("backgroundColor","red");

        $(".ulinfo").stop().animate({
            marginLeft:(-600*index)+"px"
        },500,"linear",function(){
            count=index;
        });
    });
});

 

4.滑鼠進入 離開事件與li方式一致

5.新增左右單擊事件

點選左邊即自動輪播方向,直接呼叫封裝好的函式即可;

點選右邊則反方向執行,需要簡單的改變;

 

//左右兩邊
$("#left,#right").click(function(){
    if($(this).is("#left")){
        shift();
    }else{
        count--;
        if(count<0){
            count=5;
            $(".ulinfo").css("marginLeft","-3600px")
        }
        $(".ulinfo").stop().animate({
            marginLeft:(-600*count)+"px"
        },500,function(){
            //索引點跟隨
            $(".dian").css("backgroundColor","");
            $(".dian").eq(count).css("backgroundColor","red")
        })
    }
});

三、完整程式碼

1.li方式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        *{margin: 0;padding: 0;}
        .block{
            width: 600px;
            height: 330px;
            margin: 20px auto;
           /* border: 1px solid black;*/
            overflow: hidden;
            position: relative;
        }
        .ulinfo{
            width: 4200px;
            height: 300px;
            margin-left: -600px;
        }
        .ulinfo li{
            width: 600px;
            height: 300px;
            list-style: none;
            float: left;
        }
        img{
            width: 100%;
            height: 100%;
        }
        .circle{
            width: 170px;
            height: 20px;
            /*border: 1px solid red;*/
            margin: 0 auto;
        }
        .dian{
            width: 10px;
            height: 10px;
            border-radius: 50%;
            border: 1px solid black;
            margin: 5px 8px;
            float: left;
        }
        .click{
            position: absolute;
            width: 100%;
        }
        #left,#right{
            width: 70px;
            height: 300px;
            display: none;
        }
        #left{
            background: linear-gradient(90deg,rgba(255,255,255,0.8),rgba(255,255,255,0.1));
            float: left;
        }
        #right {
            background: linear-gradient(90deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.8));
            float: right;
        }
    </style>
    <script src="js/jquery-3.0.0.js"></script>
    <script>
        var count=0;//索引圈變數
        var time;
        $(function(){
           time=setInterval("Animate.imganimate()",1500);
           Animate.circleCreate();
           Animate.pauseimg();
           Animate.incircle();
           Animate.AddClick();
        });
        var Animate={
            //自動輪播
            imganimate:function(){
                $(".ulinfo li").first().animate({
                    marginLeft:"-600px"
                },1000,"linear",function(){
                    $(".ulinfo").append($(this));
                    $(this).css("marginLeft","0px");

                    //索引圈自動跟隨轉換
                    count++;
                    $(".dian").css("backgroundColor","");
                    $(".dian").eq(count%6).css("backgroundColor","red");
                })
            },
            //索引圈建立
            circleCreate:function(){
               var lenth=$(".ulinfo li").length;
               for (var i=0;i<lenth;i++){
                   var circle=$("<div></div>");
                   circle.addClass("dian");
                   $(".circle").append(circle);
               }
               $(".dian").eq(0).css("backgroundColor","red");
            },
            //滑鼠進入停止 離開繼續
            pauseimg:function(){
                $(".block").mouseenter(function(){
                    clearInterval(time);
                    $("#left,#right").css("display","block");
                }).mouseleave(function(){
                    time=setInterval("Animate.imganimate()",1500);
                    $("#left,#right").css("display","none");
                });
            },
            //進入索引圈對應圖片跟隨變換
            incircle:function(){
                $(".dian").each(function(index){
                    $(this).mouseenter(function(){
                        //解綁其它索引圈進入事件
                        $(".dian").css("backgroundColor","").unbind("mouseenter");
                        $(this).css("backgroundColor","red");
                        //計算輪播次數
                        var num=(index-count%6)<0?index-count%6+6:index-count%6;
                        //處理反覆進入同一索引圈的bug
                        if(num==0){
                            Animate.incircle();
                            return;
                        }

                        shift();
                        var shiftnum=0;//定義實際輪播次數
                        function shift(){
                            $(".ulinfo li").first().animate({
                                marginLeft:"-600px"
                            },1000/num,function(){
                                $(".ulinfo").append($(this));
                                $(this).css("marginLeft","0px");

                                shiftnum++;
                                if(shiftnum>=num){
                                    count=index;
                                    Animate.incircle();
                                    return;
                                }

                                shift();//遞迴呼叫
                            });

                        }
                    });
                })

            },
            //左右點選
            AddClick:function(){
                $("#left,#right").on('click',addclick);

                function addclick() {
                    var that=$(this);
                    that.unbind("click",addclick);

                    if($(this).is("#left")){//判斷左右
                        //left
                        $(".ulinfo li:first").animate({
                            marginLeft:"-600px"
                        },500,"linear",function(){
                            $(this).appendTo($(this).parent());
                            $(this).css("marginLeft","0px");
                            //索引圈也得跟隨
                            count++;
                            $(".dian").css("backgroundColor","");
                            $(".dian").eq(count%6).css("backgroundColor","red");

                            //重新繫結事件
                            $(that).bind("click", addclick)
                        })
                    }else{
                        //right
                        $(".ulinfo li:first").animate({
                            marginLeft: "600px"
                        },500, "linear", function () {
                            $(".ulinfo li:last").prependTo($(this).parent());
                            $(this).css("marginLeft","0px");

                            count--;
                            $(".dian").css("backgroundColor", "");
                            $(".dian").eq(count % 6).css("backgroundColor", "red");

                            //重新繫結事件
                            $(that).bind("click",addclick);
                        });
                    }
                }
            }
        }
    </script>
</head>
<body>
<div class="block">
    <div class="click">
        <div id="left"></div>
        <div id="right"></div>
    </div>
    <ul class="ulinfo">
        <li><img src="image/demo1.jpg"></li>
        <li><img src="image/demo2.jpg"></li>
        <li><img src="image/demo3.jpg"></li>
        <li><img src="image/demo4.jpg"></li>
        <li><img src="image/demo5.jpg"></li>
        <li><img src="image/demo6.jpg"></li>
    </ul>
    <div class="circle"></div>
</div>
</body>
</html>

2.ul方式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        *{margin: 0;padding: 0;}
        .block{
            width: 600px;
            height: 330px;
            margin: 20px auto;
            /* border: 1px solid black;*/
            overflow: hidden;
            position: relative;
        }
        .ulinfo{
            width: 4200px;
            height: 300px;
        }
        .ulinfo li{
            width: 600px;
            height: 300px;
            list-style: none;
            float: left;
        }
        img{
            width: 100%;
            height: 100%;
        }
        .circle{
            width: 170px;
            height: 20px;
            /*border: 1px solid red;*/
            margin: 0 auto;
        }
        .dian{
            width: 10px;
            height: 10px;
            border-radius: 50%;
            border: 1px solid black;
            margin: 5px 8px;
            float: left;
        }
        .click{
            position: absolute;
            width: 100%;
        }
        #left,#right{
            width: 70px;
            height: 300px;
            display: none;
        }
        #left{
            background: linear-gradient(90deg,rgba(255,255,255,0.8),rgba(255,255,255,0.1));
            float: left;
        }
        #right {
            background: linear-gradient(90deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.8));
            float: right;
        }
    </style>
    <script src="js/jquery-3.0.0.js"></script>
    <script>
        var count=0;//定義變數控制輪播
        var time;
        $(function(){
            //複製
            ($(".ulinfo li").first().clone()).appendTo($(".ulinfo"));
            //自動輪播
            time=setInterval(shift,1000);
            //建立索引圈
            for(var i=0;i<$(".ulinfo li").length-1;i++){
                var dian=$('<div></div>');
                dian.addClass("dian");
                $(dian).appendTo($(".circle"));
            }
            $(".dian").eq(0).css("backgroundColor","red");
            //滑鼠進入停止 離開繼續
            $(".block").mouseenter(function(){
                clearInterval(time);
                $("#left,#right").css("display","block");
            }).mouseleave(function(){
                time=setInterval(shift,1000);
                $("#left,#right").css("display","none");
            });
            //任意點進入執行動畫
            $(".dian").each(function(index){
                $(this).mouseenter(function(){
                    $(".dian").css("backgroundColor","");
                    $(this).css("backgroundColor","red");

                    $(".ulinfo").stop().animate({
                        marginLeft:(-600*index)+"px"
                    },500,"linear",function(){
                        count=index;
                    });
                });
            });
            //左右兩邊
            $("#left,#right").click(function(){
                if($(this).is("#left")){
                    shift();
                }else{
                    count--;
                    if(count<0){
                        count=5;
                        $(".ulinfo").css("marginLeft","-3600px")
                    }
                    $(".ulinfo").stop().animate({
                        marginLeft:(-600*count)+"px"
                    },500,function(){
                        //索引點跟隨
                        $(".dian").css("backgroundColor","");
                        $(".dian").eq(count).css("backgroundColor","red")
                    })
                }
            });
            //自動輪播封裝
            function shift(){
                count++;
                $(".ulinfo").animate({
                    marginLeft:(-600*count)+"px"
                },500,"linear",function(){
                   if(count>=$(".ulinfo li").length-1){
                       $(".ulinfo").css("marginLeft","0px");
                       count=0;
                   }

                   //索引點跟隨
                    $(".dian").css("backgroundColor","");
                    $(".dian").eq(count).css("backgroundColor","red");
                })
            }
        })
    </script>
</head>
<body>
<div class="block">
    <div class="click">
        <div id="left"></div>
        <div id="right"></div>
    </div>
    <ul class="ulinfo">
        <li><img src="image/demo1.jpg"></li>
        <li><img src="image/demo2.jpg"></li>
        <li><img src="image/demo3.jpg"></li>
        <li><img src="image/demo4.jpg"></li>
        <li><img src="image/demo5.jpg"></li>
        <li><img src="image/demo6.jpg"></li>
    </ul>
    <div class="circle"></div>
</div>
</body>
</html>