jQuery 实现轮播图效果

jQuery 实现轮播图效果

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>Document</title>
    <link rel="stylesheet" href="css/index.css">
    <script src="js/jquery.js"></script>
</head>

<body>
    <div class="container">
        <div class="content">
            <div class="paper">
                <ul class="list list-1">
                
                    <li>
                        <img src="./img/1.jpg" alt="">
                    </li>
                    <li>
                        <img src="./img/2.jpg" alt="">
                    </li>
                    <li>
                        <img src="./img/3.jpg" alt="">
                    </li>
                    <li>
                        <img src="./img/4.jpg" alt="">
                    </li>
                </ul>
            </div>
            <div class="prev"></div>
                <div class="next"></div>
                <div class="circle">
                    <ul>
                        <li class="active" ></li>
                        <li ></li>
                        <li ></li>
                        <li ></li>
                    </ul>
                </div>
        </div>
    </div>
    <script src="js/index.js"></script>
</body>

</html>

css部分

*{
    margin: 0;
    padding: 0;
}


ul{
    list-style-type: none;
    margin: 0;
    padding: 0;
}

.container{
    width: 100%;
    .content{
        margin: auto;
        width: 800px;
        height: 450px;
        position: relative;
        overflow: hidden;
        .paper{
            width: 4800px;
            position: absolute;
            left: -800px;
            top: 0;
            .list{
                display: flex;
                height: 450px;
                img{
                    width: 800px;
                    height: 450px;
                }
            }
           
        }
        .next,.prev{
            width: 50px;
            height: 80px;
            background-color: rebeccapurple;
            position: absolute;
            top: 50%;
        
            transform: translateY(-50%);
        }
        .next{
            right: 0;
        }

        .circle{
            ul{
                display: flex;
                li{
                    width: 20px;
                    height: 20px;
                    background-color: red;
                    border-radius: 50%;
                    margin: 5px;
                }
                .active{
                    background-color: saddlebrown;
                }
            }
            position: absolute;
            bottom: 20px;
            left: 50%;
            transform:translateX(-50%);
        }
    }
}

js部分

$(function () {
    function autopaly() {
        //控制移动的距离
        let index = 1;
        //图片的宽度
        let imgWidth = $('img').width()
        let time = 2500;
        //存放定时器
        let timer = null
        //存放高亮的小圆点下标
        let circleIndex = 0
        //存放上次点击图片移动的时间戳
        let firstTime = 0
        //存放当前点击的时间戳
        let curentTime = 0
        return function () {
            //将第一张img复制插入到最后面,来实现无缝播放效果
            let img1 = $('.list').find('li').eq(0).clone()
            $('.list').append(img1)
            //将最后一张img复制插入到最前面,来实现无缝播放效果
            let img2 = $('.list').find('li').eq($('.list').find('li').length - 2).clone()
            $('.list').prepend(img2)
            //图片总数
            let len = $('.list').eq(0).children().length


            //在每个小圆点上挂载一个对应的下标数据
            $('.circle').find('li').each((index,item)=>{
                $(item).data('action',index)
            })

            //开始自动轮播
            run(time)

            //鼠标移入轮播图中,自动轮播暂停
            $('.content').hover(function () {
                //清除当前的定时器
                clearInterval(timer)
            }, function () {
                //鼠标移出继续自动轮播
                run(time)
            })


            //切换到上一张
            $('.prev').on('click', function () {
                //利用时间戳实现节流避免点击切换过快
                curentTime = Date.now()
                if (curentTime - firstTime > 400) {
                    //如果图片移到了第一张
                    if (index <= 1) {
                        //重新赋值index
                        index = len - 2
                        //让外部容器移动到-(len - 1) * imgWidth位置(第一张与轮播图要轮播的最后一张张相同,并不会有视觉影响)
                        $('.paper').css('left', -(len - 1) * imgWidth)
                    } else {
                        //否则继续移动
                        index--
                    }
                    //图片对应小圆点的下标
                    circleIndex--
                    
                    circleRun()
                    //图片继续运动
                    $('.paper').animate({ 'left': -index * imgWidth }, 400)
                    //重新赋值时间戳
                    firstTime = curentTime
                }

            })

            //切换到下一张
            $('.next').on('click', function () {
                //利用时间戳实现节流避免点击切换过快
                curentTime = Date.now()
                if (curentTime - firstTime > 400) {
                    //当图片移到最后一张时
                    if (index >= len - 1) {
                        //重新复制index
                        index = 2
                        //让外部容器立即移动到-${imgWidth}的位置(最后一张与轮播图要轮播的第一张相同,并不会有视觉影响)
                        $('.paper').css('left', `-${imgWidth}px`)
                    } else {
                        index++
                    }
                    //图片继续运动
                    $('.paper').animate({ 'left': -index * imgWidth }, 400) 
                    circleIndex++
                    circleRun()
                    firstTime = curentTime
                }
            })

            //点击小圆点实现切换效果
            $('.circle').on('click', 'li', function () {
                //获取其身上挂载的下标数据
                circleIndex = +$(this).data('action')
                //如果图片刚好显示到最后一张
                if (index >= len - 1) {
                    //将整个容器瞬间显示到第二张图片(最后一张与轮播图要轮播的第一张相同,并不会有视觉影响)
                    $('.paper').css({ 'left': `-${imgWidth}px` })
                }
                //重新赋值index
                index = circleIndex + 1
                //移动容器实现点击滑动到对应的图片
                $('.paper').animate({ 'left': -index * imgWidth }, 400)
                //改变小圆点高亮
                circleRun()
            })

            //自动轮播函数
            function run(time) {
                //开启定时器
                timer = setInterval(() => {
                    //index++
                    index++;
                    //当index大于等于图片长度时
                    if (index >= len) {
                        //将index重新赋值为2
                        index = 2;
                        //停止后续动画
                        $('.paper').finish()
                        //将大移动的容器移动到第一张的位置
                        $('.paper').css('left', `-${imgWidth}px`)
                    }
                    //继续移动图片
                    $('.paper').animate({ 'left': -index * imgWidth }, 400)
                    //更换
                    circleIndex++
                    circleRun()
                }, time);
            }

            //小圆点与图片一一对应变色
            function circleRun() {
                circleIndex = circleIndex > $('.circle').find('ul').children().length - 1 ? 0 : circleIndex < 0 ? $('.circle').find('ul').children().length - 1 : circleIndex
                $('.circle').find('ul').children().eq(circleIndex).addClass('active').siblings().removeClass('active')
            }

        }
    }

    var run = autopaly();
    //调用函数开启动画
    run()
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值