1. 程式人生 > >JS_定時器輪播圖

JS_定時器輪播圖

定時器無限輪播圖

<!doctype html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>定時器無限輪播圖</title>
    <style type="text/css">
        *{ padding:0; margin:0; list-style:none; border:0;}
        .all{
            width
:500px
; height:200px; padding:7px; border:1px solid #ccc; margin:100px auto; position:relative; }
.screen{ width:500px; height:200px; overflow:hidden; position:relative; } .screen
li{ width:500px; height:200px; overflow:hidden; float:left;} .screen ul{ position:absolute; left:0; top:0px; width:3000px;} .all ol{ position:absolute; right:10px; bottom:10px; line-height:20px; text-align:center;} .all ol li{ float:left; width:20px; height:20px; background:#fff; border:1
px solid #ccc
; margin-left:10px; cursor:pointer;}
.all ol li.current{ background:yellow;} #arr {display: none;} #arr span{ width:40px; height:40px; position:absolute; left:5px; top:50%; margin-top:-20px; background:#000; cursor:pointer; line-height:40px; text-align:center; font-weight:bold; font-family:'黑體'; font-size:30px; color:#fff; opacity:0.3; border:1px solid #fff;} #arr #right{right:5px; left:auto;}
</style> </head> <body> <div class="all" id='all'> <div class="screen" id="screen"> <ul id="ul"> <li><img src="images/1.jpg" width="500" height="200" /></li> <li><img src="images/2.jpg" width="500" height="200" /></li> <li><img src="images/3.jpg" width="500" height="200" /></li> <li><img src="images/4.jpg" width="500" height="200" /></li> <li><img src="images/5.jpg" width="500" height="200" /></li> </ul> <ol> </ol> <div id="arr"> <span id="left"><</span> <span id="right">></span> </div> </div> </div> </body> </html>
<script>
        //需求:無縫滾動。
        //思路:賦值第一張圖片放到ul的最後,然後當圖片切換到第五張的時候
        //     直接切換第六張,再次從第一張切換到第二張的時候先瞬間切換到
        //     第一張圖片,然後滑動到第二張
        //步驟:
        //1.獲取事件源及相關元素。(老三步)
        //2.複製第一張圖片所在的li,新增到ul的最後面。
        //3.給ol中新增li,ul中的個數-1個,並點亮第一個按鈕。
        //4.滑鼠放到ol的li上切換圖片
        //5.新增定時器
        //6.左右切換圖片(滑鼠放上去隱藏,移開顯示)


        //1.獲取事件源及相關元素。(老三步)
        var all = document.getElementById("all");
        var screen = all.firstElementChild || all.firstChild;
        var imgWidth = screen.offsetWidth;
        var ul = screen.firstElementChild || screen.firstChild;
        var ol = screen.children[1];
        var div = screen.lastElementChild || screen.lastChild;
        var spanArr = div.children;

        //2.複製第一張圖片所在的li,新增到ul的最後面。
        var ulNewLi = ul.children[0].cloneNode(true);
        ul.appendChild(ulNewLi);
        //3.給ol中新增li,ul中的個數-1個,並點亮第一個按鈕。
        for(var i=0;i<ul.children.length-1;i++){
            var olNewLi = document.createElement("li");
            olNewLi.innerHTML = i+1;
            ol.appendChild(olNewLi)
        }
        var olLiArr = ol.children;
        olLiArr[0].className = "current";

        //4.滑鼠放到ol的li上切換圖片
        for(var i=0;i<olLiArr.length;i++){
            //自定義屬性,把索引值繫結到元素的index屬性上
            olLiArr[i].index = i;
            olLiArr[i].onmouseover = function () {
                //排他思想
                for(var j=0;j<olLiArr.length;j++){
                    olLiArr[j].className = "";
                }
                this.className = "current";
                //滑鼠放到小的方塊上的時候索引值和key以及square同步
//                    key = this.index;
//                    square = this.index;
                key = square = this.index;
                //移動盒子
                animate(ul,-this.index*imgWidth);
            }
        }

        //5.新增定時器
        var timer = setInterval(autoPlay,1000);

        //固定向右切換圖片
        //兩個計數器(一個記錄圖片,一個記錄小方塊)
        var key = 0;
        var square = 0;
        function autoPlay(){
            //通過控制key的自增來模擬圖片的索引值,然後移動ul
            key++;
            if(key>olLiArr.length){
                //圖片已經滑動到最後一張,接下來,跳轉到第一張,然後在滑動到第二張
                ul.style.left = 0;
                key = 1;
            }
            animate(ul,-key*imgWidth);
            //通過控制square的自增來模擬小方塊的索引值,然後點亮盒子
            //排他思想做小方塊
            square++;
            if(square>olLiArr.length-1){//索引值不能大於等於5,如果等於5,立刻變為0;
                square = 0;
            }
            for(var i=0;i<olLiArr.length;i++){
                olLiArr[i].className = "";
            }
            olLiArr[square].className = "current";
        }

        //滑鼠放上去清除定時器,移開後在開啟定時器
        all.onmouseover = function () {
            div.style.display = "block";
            clearInterval(timer);
        }
        all.onmouseout = function () {
            div.style.display = "none";
            timer = setInterval(autoPlay,1000);
        }

        //6.左右切換圖片(滑鼠放上去顯示,移開隱藏)
        spanArr[0].onclick = function () {
            //通過控制key的自增來模擬圖片的索引值,然後移動ul
            key--;
            if(key<0){
                //先移動到最後一張,然後key的值取之前一張的索引值,然後在向前移動
                ul.style.left = -imgWidth*(olLiArr.length)+"px";
                key = olLiArr.length-1;
            }
            animate(ul,-key*imgWidth);
            //通過控制square的自增來模擬小方塊的索引值,然後點亮盒子
            //排他思想做小方塊
            square--;
            if(square<0){//索引值不能大於等於5,如果等於5,立刻變為0;
                square = olLiArr.length-1;
            }
            for(var i=0;i<olLiArr.length;i++){
                olLiArr[i].className = "";
            }
            olLiArr[square].className = "current";
        }
        spanArr[1].onclick = function () {
            //右側的和定時器一模一樣
            autoPlay();
        }


        function animate(ele,target){
            clearInterval(ele.timer);
            var speed = target>ele.offsetLeft?10:-10;
            ele.timer = setInterval(function () {
                var val = target - ele.offsetLeft;
                ele.style.left = ele.offsetLeft + speed + "px";
                if(Math.abs(val)<Math.abs(speed)){
                    ele.style.left = target + "px";
                    clearInterval(ele.timer);
                }
            },10)
        }
</script>