JavaScript实现轮播图

轮播图实现原理

原理:
1.在一个盒子content里面放一个ul,li浮动float:left,让图片行显示在同行
2.content设置overflow:hide,将超出的ul隐藏
3.通过创建一个定时器(setInterval(function,ms)),每过n毫秒,将该ul的left位置改变,实现视觉上的移动效果。当达到指定位置时,清除定时器

轮播图结构

html结构

<!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>轮播图</title>
    <link rel="stylesheet" href="./css/index.css">
    <script src="./js/animate.js"></script>
    <script src="./js/index1.js"></script>
</head>
<body>
    <div class="content">
        <a href="javascript:;" class="fl arrow">&lt;</a>
        <a href="javascript:;" class="fr arrow">&gt;</a>
        <ul class="picList">
            <li><img src="./img/img1.jpeg" alt=""></li>
            <li><img src="./img/img2.jpeg" alt=""></li>
            <li><img src="./img/img3.jpeg" alt=""></li>
            <li><img src="./img/img4.jpeg" alt=""></li>
            <li><img src="./img/img5.jpeg" alt=""></li>
        </ul>
        <ol class="circle">
        </ol>
    </div>
</body>
</html>

css结构

* {
    padding: 0px;
    margin: 0px;
}

.content {
    width: 500px;
    margin: 0 auto;
    height: 300px;
    overflow: hidden;
    position: relative;

}

.content ul {
    position: absolute;
    list-style: none;
    width: 700%;
    height: 300px;

}

.content ul img {
    width: 500px;
    height: 300px;
}

.content ul li {
    float: left;
}



.content a {
    text-decoration: none;
    top: 50%;
    color: black;
    display: none;
    position: absolute;
    background-color: pink;
    border-radius: 15%;
    width: 20px;
    height: 20px;
    line-height: 20px;
    text-align: center;
}

.content .fl {
    left: 0;
    z-index: 999;
}

.content .fr {
    right: 0;
    z-index: 999;
}

.content .circle {
    list-style: none;
    position: absolute;
    height: 300px;
    left: 50%;
    transform: translate(-50%, 0);
}

.content .circle li {
    width: 10px;
    height: 10px;
    background-color: red;
    border-radius: 50%;
    margin-right: 10px;
    float: left;
    margin-top: 285px;
}

.content .circle .discoloration {
    background-color: aqua;
}

重点解释一下JavaScript逻辑部分

window.addEventListener("load", function () {
    //获取元素
    var content = document.querySelector(".content")
    var fr = document.querySelector(".fr")//右边按钮
    var fl = document.querySelector(".fl")//左边按钮
    var ul = document.querySelector("ul")//获取ul
    var ol = document.querySelector("ol")//获取ol
    var img = document.querySelector("img")//图片标签
    var imgWidth = img.offsetWidth//获取图片宽度
    var num = 0;//点击按钮计数第几张图片
    var circle = 0;//点击左右按钮时为了小圆点计数
    //鼠标移入事件
    content.addEventListener("mouseenter", function () {
        //隐藏左右边按钮
        fr.style.display = 'block'
        fl.style.display = 'block'
        clearInterval(timer)//关闭定时器
    })
    //鼠标移出事件
    content.addEventListener("mouseleave", function () {
        //显示左右边按钮
        fr.style.display = 'none'
        fl.style.display = 'none'
        //开启定时器
        timer = setInterval(function(){
            fr.click()
        },2000)
    })

    //根据图片动态生成小圆点
    for (let i = 0; i < ul.children.length; i++) {
        var li = document.createElement("li")//生成li标签
        //为li标签设置自定义属性index,为了点击小圆圈计数
        li.setAttribute("index", i)//设置自定义属性  
        ol.appendChild(li)//放入容器中
        //小圆点点击事件(排他思想,干掉所有人,留下自己)
        li.addEventListener("click", function () {
            for (let j = 0; j < ol.children.length; j++) {
                //干掉所有人
                ol.children[j].className = '';
            }

            var index = this.getAttribute("index")//取出
            num = index//解决点击小圆点后,再点击左右按钮图片错位问题
            circle = index解决点击小圆点后,再点击左右按钮小圆点错位问题
            animate(ul, -index * imgWidth)
            //留下自己
            this.className = "discoloration"//discoloration为css自定义
        })
        ol.children[0].className = 'discoloration'//第一个默认
        animate(ul,)
    }


    var first = ul.children[0].cloneNode(true)
    ul.appendChild(first)



    //右边按钮点击事件
    fr.addEventListener("click", function () {
        if (num == ul.children.length - 1) {
            ul.style.left = 0 //到达最后一张图片时
            num = 0
        }
        num++;
        animate(ul, -num * imgWidth)
        circle++;
        if (circle == ol.children.length) {
            circle = 0;//小圆圈到达最后一个时 circle = 0;
        }
        circleChange()//调用函数
    })

    //左边按钮点击事件
    fl.addEventListener("click", function () {
        if (num == 0) {
            num = ul.children.length-1
            ul.style.left = -num*imgWidth+"px"
            
        }
        num--;
        animate(ul, -num * imgWidth)
        circle--;
        if (circle<0) {
            circle = ol.children.length-1;
        }
        circleChange()//调用函数
    })
    //封装小圆圈变化的函数
    function circleChange(){
        for (let i = 0; i < ol.children.length; i++) {
            ol.children[i].className = ""
        }
        ol.children[circle].className = "discoloration"
    }
  //定时器自动播放
   var timer = setInterval(function(){
        fr.click()
    },2000)
})   

主要思路:

  1. 鼠标移入和移出事件显示和隐藏左右按钮,通过改变属性display:block,display:none。
  2. JavaScript根据图片的数量动态生成下面轮播的小圆点,通过createElement和appendChild放入ol标签中
  3. 利用排他思想改变小圆圈的样式。循环所有的小圆圈,然后干掉所有的样式,然后为当前点击的小圆圈加上需要的样式。
  4. 点击按钮时调用动画函数(封装好的)代码放在最后面,当轮播到最后一张图片时要跳转到第一张图片,我的做法是:先提前把一张图片克隆出来,放在最后,然后通过改变 ul.style.left =0, num = 0,达到我们跳到第一张的目的。
  5. 自动轮播通过var timer = setInterval(function(){ fr.click() },2000)就可以达到我们的目的了

动画函数结构

function animate(obj, target,callback) {
    clearInterval(obj.timer)
     obj.timer = setInterval(() => {
        var step = (target-obj.offsetLeft)/10
        step = step>0 ? Math.ceil(step) : Math.floor(step)  
        if (obj.offsetLeft == target) {
            clearInterval(obj.timer)
            if(callback){
                callback()
            }
        }
        obj.style.left = obj.offsetLeft + step + "px"
    }, 20);
    
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小胡要努力啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值