js 原生JS實現輪播圖


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>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: 1px solid #ccc;
            margin-left: 10px;
            cursor: pointer;
        }

        .all ol li.current {
            background: #DB192A;
        }

        #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='box'>
    <div class="screen"><!--相框-->
        <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>
    <div id="arr">
        <span id="left">
            &lt;
        </span>
        <span id="right">
            &gt;
        </span>
    </div>
</div>
<script src="common.js"></script>
<script>
    var box = my$('box');
    //最外層div
    var screen = box.children[0];
    //相框
    var screenWidth = screen.offsetWidth;
    //相框的寬度
    var ulobj = screen.children[0];
    //整個ul
    var list = ulobj.children;
    //ul里面的每個li
    var olobj = screen.children[1];
    //ol
    var arr = my$('arr');
    //獲取左右按鍵

    //設置一個全局變量為了后面可以使用
    var index = 0;
    //根據ui里的li的個數 循環添加ol里面的小按鈕
    for (var i = 0; i < list.length; i++) {
        //創建一個li
        var liobj = document.createElement('li');
        //追加到ol里面
        olobj.appendChild(liobj);
        //設置li的內容
        liobj.innerHTML = (i + 1);
        //為每個li添加自定義屬性 保存其索引值
        liobj.setAttribute("index", i);
        //為每個li注冊鼠標進入事件
        liobj.onmouseover = function () {
            //排他功能
            for (var j = 0; j < olobj.children.length; j++) {
                //移除全部li的樣式
                olobj.children[j].removeAttribute('class');
            }
            //設置當前的li的樣式
            this.className = 'current';
            //獲取當前li的索引值
            index = this.getAttribute("index");
            //調用動畫函數 傳入要移動的ul 和 位置(移動的是負數)
            animate(ulobj, -index * screenWidth);
        };
    }

    //設置ol中第一個li有背景顏色
    olobj.children[0].className = "current";

    //克隆一個第一個li到最后cloneNode() 方法克隆所有屬性以及它們的值。
    // 如果您需要克隆所有后代,請把 deep 參數設置 true,否則設置為 false。
    ulobj.appendChild(list[0].cloneNode(true));


    //自動播放
    var timeId = setInterval(clickHandle, 1000);

    //鼠標進入
    box.onmouseover = function () {
        //顯示兩邊的按鈕
        arr.style.display = 'block';
        //鼠標進入時候就清理定時器
        clearInterval(timeId);
    }
    //鼠標離開
    box.onmouseout = function () {
        //隱藏兩邊的按鈕
        arr.style.display = 'none';
        //鼠標離開時重新設置定時器(自動播放 其他就是右鍵的點擊事件)
        timeId = setInterval(clickHandle, 1000);
    }
    //為右鍵注冊點擊事件
    my$('right').onclick = clickHandle

    //右鍵事件函數
    function clickHandle() {
        //先判斷當前的索引值是否等於5 那就說明已經看到最后一張(也是第一張)那么立刻將索引重置為第一張 且將當前的最后一張切換到第一張
        if (index == list.length - 1) {
            index = 0;
            ulobj.style.left = 0 + "px";
        }
        //索引加1
        index++;
        //移動圖片
        animate(ulobj, -index * screenWidth);

        //判斷索引是不是第五個 如果是就說明是最后一張也是第一張 把最后一個索引的樣式取消 設置第一個的樣式
        if (index == list.length - 1) {
            olobj.children[olobj.children.length - 1].className = "";
            olobj.children[0].className = 'current';
        } else {
            //索引不是最后一個就正常按照索引值設置樣式
            for (var j = 0; j < olobj.children.length; j++) {
                olobj.children[j].removeAttribute('class');
            }
            olobj.children[index].className = 'current';
        }
    }

    //為左鍵注冊事件
    my$("left").onclick = function () {
        //判斷是不是第一張圖 如果是就立刻把索引改完最后一張的索引(最后一張與第一張一樣)切換成最后一張
        if (index == 0) {
            index = 5;
            ulobj.style.left = -index * screenWidth + "px";
        }
        index--;
        animate(ulobj, -index * screenWidth);
        //正常設置樣式
        for (var j = 0; j < olobj.children.length; j++) {
            olobj.children[j].removeAttribute('class');
        }
        //設置當前索引對於的樣式
        olobj.children[index].className = 'current';
    }


    //設置任意的一個元素,移動到指定的目標位置
    function animate(element, target) {
        clearInterval(element.timeId);
        //定時器的id值存儲到對象的一個屬性中
        element.timeId = setInterval(function () {
            //獲取元素的當前的位置,數字類型
            var current = element.offsetLeft;
            //每次移動的距離
            var step = 10;
            step = current < target ? step : -step;
            //當前移動到位置
            current += step;
            if (Math.abs(current - target) > Math.abs(step)) {
                element.style.left = current + "px";
            } else {
                //清理定時器
                clearInterval(element.timeId);
                //直接到達目標
                element.style.left = target + "px";
            }
        }, 5);
    }
</script>


</body>
</html>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM