【Javascript】【jQuery】jQuery实现轮播图

实现一个完整的轮播图用到的知识点
????元素在父容器中水平垂直居中
????利用CSS生成圆点
????让图片和父容器一样大,并隐藏多余部分
????均匀滑动
????循环滑动
????自动循环滑动
????点击圆点可以滑动到指定页面
????点击按钮可以前后滑动
????鼠标移入时,停止自动滑动
????滑动过程中,不可操作

html代码


<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>jQuery</title>
    </head>

    <link rel="stylesheet" type="text/css" href="../css/page_slide.css"/>
    <script type="text/javascript" src="../js/jquery-3.4.0.js"></script>
    <script type="text/javascript" src="../js/page_slide.js"></script>

    <body>
        <div id="container">
            <div id="image-list">
                <img src="../image/t05.jpg"/>
                <img src="../image/t01.jpg"/>
                <img src="../image/t02.jpg"/>
                <img src="../image/t03.jpg"/>
                <img src="../image/t04.jpg"/>
                <img src="../image/t05.jpg"/>
                <img src="../image/t01.jpg"/>
            </div>

            <div id="dot-list">
                <span></span>
                <span></span>
                <span></span>
                <span></span>
                <span></span>
            </div>

            <div id="buttons">
                <img src="../image/btn_pre.png" id="btn-pre"/>
                <img src="../image/btn_next.png" id="btn-next"/>
            </div>
        </div>
    </body>

</html>

css代码


* {
    padding: 0;
    margin: 0;
}

#container {
    width: 800px;
    height: 450px;
    position: absolute;
    left: 50%;
    top: 50%;
    margin-left: -400px;
    margin-top: -225px;
    overflow: hidden;
}

#dot-list {
    width: 100px;
    height: 20px;
    position: absolute;
    bottom: 0px;
    left: 50%;
    margin-left: -50px;
    margin-bottom: 10px;
    -webkit-user-select: none;
    z-index: 3;
}

#dot-list > span {
    width: 10px;
    height: 5px;
    box-sizing: border-box;
    border-radius: 5px;
    margin-left: 5px;
    cursor: pointer;
    display: inline-block;
    background: white;
}

#dot-list > span.selected {
    background: deepskyblue;
}

#image-list {
    width: 5600px;
    height: 450px;
    position: absolute;
    font-size: 0px;
}

#image-list > img {
    width: 800px;
    height: 450px;
}

#buttons {
    width: 800px;
    height: 450px;
    position: absolute;
    font-size: 0px;
    z-index: 2;
}

#btn-pre {
    width: auto;
    height: 150px;
    cursor: pointer;
    position: absolute;
    left: 0px;
    top: 50%;
    margin-top: -75px;
}

#btn-next {
    width: auto;
    height: 150px;
    cursor: pointer;
    position: absolute;
    right: 0px;
    top: 50%;
    margin-top: -75px;
}

#btn-pre:hover {
    background: rgba(255, 255, 255, 0.2);
}

#btn-next:hover {
    background: rgba(255, 255, 255, 0.2);
}

js代码


$(() => {
    //获取需要使用的元素
    $container = $("#container");
    $imageList = $("#image-list");
    $images = $("#image-list>img");
    $dot = $("#dot-list>span");
    $pre = $("#btn-pre");
    $next = $("#btn-next");

    //图片大小
    const imageWidth = $container.width();
    //当前图片
    let currentPage = 0;
    //要滑到的图片
    let targetPage = 0;
    //正在滑动
    let moving = false;
    //滑动一次需要的时间
    const duration = 800;

    //默认显示第一张图片
    $imageList.css("left", -imageWidth);

    //默认选中第一个圆点
    $($dot[0]).addClass("selected");

    //定时自动滑动
    let intervalId = autoSlide();

    //鼠标移入时,取消滑动,移出时继续
    $container.hover(() => {
        clearInterval(intervalId);
    }, () => {
        intervalId = autoSlide();
    });

    //点击圆点,滑动至对应页面
    $dot.click(function () {
        let index = $(this).index();
        if (index != currentPage)
            moveToPage(index);
    });

    //点击向前向后按钮,滑动至上一页下一页
    $pre.click(() => {
        moveToPage(currentPage - 1);
    });
    $next.click(() => {
        moveToPage(currentPage + 1);
    });

    //自动滑动
    function autoSlide() {
        return setInterval(() => {
            moveToPage(currentPage + 1);
        }, 3000);
    }

    //滑动页面,向前-1,向后1,指定页面target-current
    function moveToPage(page) {
        if (moving)
            return;
        moving = true;
        targetPage = page;
        let pageSize = page - currentPage;
        //每20ms滑动一帧
        let interval = 20;
        let offsetX = -(currentPage + 1) * imageWidth;
        let dx = pageSize * imageWidth * interval / duration;
        let intervalId = setInterval(() => {
            offsetX -= dx;
            $imageList.css("left", offsetX);
            //滑动完成
            if (offsetX == -(targetPage + 1) * imageWidth) {
                //如果滑动到首尾的辅助元素,则瞬移到对应的真实元素
                if (targetPage == 5)
                    targetPage = 0;
                if (targetPage == -1)
                    targetPage = 4;
                $imageList.css("left", -(targetPage + 1) * imageWidth);
                //同步变更圆点样式
                $($dot[currentPage]).removeClass("selected");
                $($dot[targetPage]).addClass("selected");
                //滑动结束,清除定时器
                clearInterval(intervalId);
                currentPage = targetPage;
                moving = false;
            }
        }, interval);
    }
});

效果图
【Javascript】【jQuery】jQuery实现轮播图