實現通用輪播圖插件

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <style>
            #banner {
                width: 533px;
                height: 300px;
                outline: 10px solid #fff666;
                margin: 0 auto;

            }
        </style>
    </head>

    <body>
        <div id="banner">

        </div>
        <script src="./demo.js"></script>
        <script>
            var bannerDiv = document.getElementById("banner");
            createBannerArea(bannerDiv, [{
                imgurl: "./imge/5d734abfdd0e92fa29f402056fc4560c.jpg"
            },
            {
                imgurl: "./imge/5fee9229ca1f6274651495b51f1e8187.jpg"
            },
            {
                imgurl: "./imge/aa988a78864d1f98ca563e5298ce7f93 (1).jpg"
            }
            ])
        </script>
    </body>

</html>
/**
 * 
 * @param {*} areaDom dom元素,輪播區域
 * @param {*} options 輪播配置
 */

function createBannerArea(areaDom, options) {
    var imgArea = document.createElement('div'); //圖片區域
    var numberArea = document.createElement('div'); //角標
    var curIndex = 0; //圖片顯示的第幾張
    var changeTimer = null; //角標定時器
    var changeDuration = 3000; //圖片切換定時器時間
    var timer = null; //圖片定時器
    //創建圖片區域
    initImge();

    //角標區域
    inittNumbers();

    //設置狀態
    setStatus();

    autoChange();

    //插入圖片和樣式
    function initImge() {
        imgArea.style.wdith = '100%';
        imgArea.style.height = '100%';
        imgArea.style.display = 'flex';
        imgArea.style.overflow = 'hidden';
        for (var i = 0; i < options.length; i++) { //循環創建
            var obj = options[i];
            var img = document.createElement('img')
            img.src = obj.imgurl;
            img.style.wdith = '100%';
            img.style.height = '100%';
            img.style.marginLeft = '0';
            img.style.cursor = 'pointer';
            img.addEventListener('click', function () { //圖片鏈接事件
                location.herf = options[i].link;
            })
            imgArea.appendChild(img); //插入

        }
        imgArea.addEventListener('mouseenter', function () { //鼠標懸浮和離開時候的運動停止和開始
            clearInterval(changeTimer);
            changeTimer = null;
        })
        imgArea.addEventListener('mouseleave', function () {
            autoChange();
        })
        areaDom.appendChild(imgArea); //再插入
    }
    //加入角標
    function inittNumbers() {
        numberArea.style.textAlign = 'center';
        numberArea.style.marginTop = '-25px';
        for (let i = 0; i < options.length; i++) {
            var sp = document.createElement('span');
            sp.style.width = '12px';
            sp.style.height = '12px';
            sp.style.background = 'lightgray';
            sp.style.display = 'inline-block';
            sp.style.margin = '0 7px';
            sp.style.borderRadius = '50%';
            sp.style.cursor = 'pointer';
            sp.addEventListener('click', function () { //角標點擊事件
                curIndex = i; //更改值
                setStatus(); //進行再運動
            })
            numberArea.appendChild(sp); //插入

        }
        areaDom.appendChild(numberArea); //再插入
    }

    //區域狀態
    function setStatus() {
        //角標
        for (var i = 0; i < options.length; i++) {
            if (i === curIndex) { //x選中
                numberArea.children[i].style.background = '#be926f'
            } else { //普通狀態
                numberArea.children[i].style.background = 'lightgray'

            }

        }
        //圖片切換運動
        var start = parseInt(imgArea.children[0].style.marginLeft); //當前元素外邊距
        // console.log(start);
        var end = curIndex * -100; //要達到的邊距
        var dis = end - start; //要運動的邊距
        var duration = 500;
        var speed = dis / duration; //取得速度

        if (timer) {
            clearInterval(timer); //判斷存在
        }
        timer = setInterval(function () { //賦值
            start += speed * 20;
            imgArea.children[0].style.marginLeft = start + '%';
            if (Math.abs(end - start) < 1) {
                imgArea.children[0].style.marginLeft = end + '%';
                clearInterval(timer); //清除
            }
        }, 20);



    }


    //運動定時器
    function autoChange() {
        if (changeTimer) { //判斷存在
            return;
        }
        changeTimer = setInterval(function () {
            if (curIndex === options.length - 1) {
                curIndex = 0;
            } else {
                curIndex++;
            }
            setStatus();
        }, changeDuration);
    }


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章