原生js实现轮播图

原生js 使用for循环和排他思想实现轮播图 轮播、切换功能。
这里排他思想指的是排除其他,保留自己,方法就是最开始将所有的项包括选中项都设置为默认样式,再遍历数组给相应的选中项设置自己的样式
具体代码和注释如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        ul,ol{
            list-style: none;
        }
        .box{
            position: relative;
            width:980px;
            height: 545px;
            border: 1px solid #333;
            margin: 20px auto;
        }
        .box .pics li{
            position: relative;
            left: 0;
            top: 0;
            width: 980px;
            height: 545px;
            display: none;
        }
        .box .pics .current{
            display: block;
        }
        /* 按钮 */
        .box .btn a{
            position: absolute;
            top: 50%;
            width: 40px;
            height: 40px;
            margin-top: -20px;
            background-color: rgba(255, 255, 255, 0.192);
            font: 20px/40px "宋体";
            text-align: center;
            color: rgba(255, 255, 255);
            text-decoration: none;
            font-weight: bold;
        }
        
        .box .btn .left-btn{
            left: 10px;
        }
        .box .btn .right-btn{
            right: 10px;
        }
        .box .btn a:hover{
            background-color: rgba(255, 255, 255, 0.5);
        }
        /* 下标 */
        .box .sub{
            position: absolute;
            left: 450px;
            bottom: 30px;
            width: 300px;
        }
        .box .sub li{
            float: left;
            width: 10px;
            height: 10px;
            margin-right: 20px;
            background-color: rgb(255, 255, 255,0.3);
            font: 8px/10px "微软雅黑";
            text-align: center;
            color: #666;
            cursor: pointer;
        }
        .box .sub .current{
            background-color: rgba(255, 254, 254, 0.884);

        }
    </style>
</head>
<body>
    <div class="box" id="box">
        <!-- 图片 -->
        <ul class="pics" id="pics">
            <li class="current"><img src="../../../imgs/1.jpg" alt=""></li>
            <li><img src="../../../imgs/2.jpg" alt=""></li>
            <li><img src="../../../imgs/3.jpg" alt=""></li>
            <li><img src="../../../imgs/4.jpg" alt=""></li>
        </ul>

        <!-- 按钮 -->
        <div class="btn" id="btn">
            <a href="javascript:;" class="left-btn" id="left-btn">&lt;</a>
            <a href="javascript:;" class="right-btn" id="right-btn">&gt;</a>
        </div>
        
        <!-- 小圆点 -->
        <ol class="sub" id="sub">
            <li class="current"></li>
            <li></li>
            <li></li>
            <li></li>
        </ol>
        
        
    </div>

    <script>
        var box = document.getElementById("box");
        var pics = document.getElementById("pics");
        var sub = document.getElementById("sub");
        var imgs = pics.children;
        var subs = sub.children;
        var btnl = document.getElementById("left-btn");
        var btnr = document.getElementById("right-btn");
        
        // 全局信号量,存储的是要展示的图片所在li的下标
        var n = 0;
        //1 右按钮点击切换
        btnr.onclick =rightRun;

        //2 左按钮同理
        btnl.onclick = function(){
            n --; 
            //判断n是否超过最大下标,若是,就要从第一张换到最后一张切
            if(n < 0){
               // 第一张切换最后一张图片
               n = imgs.length-1;
                
            }
              //调用切换函数
              change();
            
        }
        
        //3 小圆点点击切换
        for(var i = 0;i < subs.length;i ++){
            // 存储自己的下标
            subs[i].index = i;
            // 添加点击事件
            subs[i].onclick = function(){
               n = this.index;
               //调用切换函数
               change();

            };
        };

        //4 定时轮播,这里定时器里的方法直接使用已经写好的切换下一张图片的方法
        var timer = setInterval(rightRun,3000);

        //5 鼠标移上轮播图 停止轮播
        box.onmouseover = function(){
            clearInterval(timer);
        }

        //6 鼠标离开轮播图 重新开启
        box.onmouseout = function(){
            timer = setInterval(rightRun,3000);
        }
        //定义右按钮式事件
        function rightRun(){
            // 下标自加
            n ++; 
            //判断n是否超过最大下标,若是,就要从最后一张切换到第一张
            if(n > imgs.length-1){
               // 最后一张图片切换第一张
               n = 0;
            }
             //调用切换函数
             change();
        }

        //定义切换函数
        function change(){
            
            //排他一下
            for(var i = 0;i < imgs.length;i ++){
                imgs[i].className = ""; 
                subs[i].className = "";
            }
            //保留自己
            imgs[n].className = "current";
            subs[n].className = "current";
        }
    </script>
</body>
</html>

posted @ 2021-03-03 23:01  小白可别不举铁  阅读(128)  评论(0编辑  收藏  举报