1. 程式人生 > >js實現輪播圖原理及示例(轉)

js實現輪播圖原理及示例(轉)

網上有很多的例子介紹,在這裡我所做的**無縫滾動**就是 通過改變元素的left值讓圖片呈現左右滾動的效果。
我們首先看一下 div+css 的結構樣式:
這裡寫圖片描述
div+css程式碼

<!DOCTYPE html>
<html>
    <head>
        <metacharset="UTF-8">
        <title></title>
        <styletype="text/css">
            *{
                margin:0;
                
padding:0; }
ul,ol{ list-style: none; }/*消除圖片底部3畫素距離*/img{ vertical-align: top; }.scroll{ width:500px; height:200px; margin:100px auto; border:1px solid #ccc; padding
:7px
; overflow: hidden; position: relative; }
.box{ width:500px; height:200px; overflow: hidden; position: relative; }.boxul{ width:600%; position: absolute
; left:0; top:0; }
.boxulli{ float: left; }.scrollol{ position: absolute; right:10px; bottom:10px; }.scrollolli{ float: left; width:20px; height:20px; background: pink; text-align: center; line-height:20px; border-radius:50%; background-color: pink; margin-left:10px ; cursor: pointer; }.scrollolli.current{ background-color: purple; }
</style> </head> <body> <divid="scroll"class="scroll"> <divid="box"class="box"> <ulid="ul"> <li><imgsrc="images/1.jpg"width="500"height="200"></li> <li><imgsrc="images/2.jpg"width="500"height="200"></li> <li><imgsrc="images/3.jpg"width="500"height="200"></li> <li><imgsrc="images/4.jpg"width="500"height="200"></li> <li><imgsrc="images/5.jpg"width="500"height="200"></li> </ul> <olid="ol"> <liclass="current">1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> </ol> </div> </div> </body> </html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86

展示效果如圖:
這裡寫圖片描述
接下來我們要將js 程式碼 ,
再此之前 我們要明白,小圓點 1 2 3 並不是寫死的,它是根據ul li中的圖片張數來決定的 ,所以 我們要先把div中ol li中的程式碼去掉
要實現無縫滾動 就需要多一張圖片才行 ,即克隆第一張圖片,放到最後面。此時css佈局保留,div中只剩下:

<body>
        <divid="scroll"class="scroll">
            <divid="box"class="box">
                <ulid="ul">
                    <li><imgsrc="images/1.jpg"width="500"height="200"></li>
                    <li><imgsrc="images/2.jpg"width="500"height="200"></li>
                    <li><imgsrc="images/3.jpg"width="500"height="200"></li>
                    <li><imgsrc="images/4.jpg"width="500"height="200"></li>
                    <li><imgsrc="images/5.jpg"width="500"height="200"></li>
                </ul>               
            </div>
        </div>
    </body>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

此時我們用js程式碼生成小圓點

var scroll = document.getElementById("scroll"); // 獲得大盒子
        var ul = document.getElementById("ul"); // 獲得ul
        var ulLis = ul.children;// 獲得ul的盒子 以此來生成ol中li的個數
        var liWidth = ul.children[0].offsetWidth;// 獲得每個li的寬度
        // 操作元素
        // 因為要做無縫滾動,所以要克隆第一張,放到最後一張後面
        // 1. 克隆元素
        ul.appendChild(ul.children[0].cloneNode(true));

        // 2.建立ol 和li
        var ol = document.createElement("ol");//建立ol元素
        scroll.appendChild(ol);// 把ol放到scroll盒子裡面去
        for (var i=0;i<ulLis.length-1;i++) {
            var li = document.createElement("li");// 建立li元素
            li.innerHTML = i + 1;// 給li裡面新增文字  1 2 3 4 5
            ol.appendChild(li);// 將li元素新增到ol裡面
        }
        ol.children[0].className = "current";// ol中的第一個li背景色為purple
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

此時ol li元素即小圓點建立完畢 我們接著用js做動畫
動畫部分包括:
1.滑鼠經過第幾個小圓點,就要展示第幾張圖片,並且小圓點的顏色也發生變化
2.圖片自動輪播,(這需要一個定時器)
3.滑鼠經過圖片,圖片停止自動播放(這需要清除定時器)
4.滑鼠離開圖片,圖片繼續自動輪播 (重新開始定時器)
這裡我們封裝了一個animate()動畫函式

// 動畫函式 第一個引數,代表誰動  第二個引數 動多少
        // 讓圖片做勻速運動,勻速動畫的原理是 當前的位置 + 速度  即 offsetLeft + speed

        functionanimate(obj,target){
            // 首先清除掉定時器
            clearInterval(obj.timer);
            // 用來判斷 是+ 還是 -  即說明向左走還是向右走
            var speed = obj.offsetLeft < target ? 15 : -15;
            obj.timer = setInterval(function(){
                var result = target - obj.offsetLeft;//它們的差值不會超過speed
                obj.style.left = obj.offsetLeft + speed + "px";
                // 有可能有小數的存在,所以在這裡要做個判斷             
                if (Math.abs(result) <= Math.abs(speed)) {
                    clearInterval(obj.timer);
                    obj.style.left = target + "px";
                }
            },10);
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

定時器 函式

var timer = null; // 輪播圖的定時器
        var key = 0;// 控制播放的張數
        var circle = 0;// 控制小圓點

        timer = setInterval(autoplay,1000);// 自動輪播
        functionautoplay(){
            /*自動輪播時,要對播放的張數key進行一個判斷,如果播放的張數超過ulLis.length-1,
            就要重頭開始播放.  因為我們克隆了第一張並將其放在最後面,所以我們要從第二張圖片開始播放*/
            key++; // 先++
            if(key > ulLis.length-1){// 後判斷

                ul.style.left = 0; // 迅速調回
                key = 1; // 因為第6張是第一張,所以播放的時候是從第2張開始播放
            }
            // 動畫部分
            animate(ul,-key*liWidth);
            // 小圓點circle   當顯示第幾張圖片是,對應的小圓點的顏色也發生變化 

            /*同理,對小圓點也要有一個判斷*/
            circle++;
            if (circle > olLis.length-1) {
                circle = 0;
            }
            // 小圓點顏色發生變化
            for (var i = 0 ; i < olLis.length;i++) {
                // 先清除掉所用的小圓點類名
                olLis[i].className = ""; 
            }
            // 給當前的小圓點 新增一個類名
            olLis[circle].className = "current";

        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

好啦,這裡我們展示了主要程式碼,具體程式碼,檢視這裡下載js實現輪播效果