原生js+css3实现轮播图效果。

441 阅读4分钟

demo展示地址:calmsteady.github.io/RotationCha…

之前实现轮播图主要是利用原生js写个动画加计时器实现,非常的麻烦且bug多。本篇主要利用css3:transition实现轮播图效果,简便美观无bug。话不多说,直接上代码。(demo加载的比较慢,因为图片体积较大。。。)

html和css部分:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>轮播图</title>
    <link rel="stylesheet" href="index.css">
    <script src="index.js"></script>
</head>

<body>
    <div class="main">
        <ul class="container">
            <li class="banner">
                <a href=""><img src="1.jpg" alt="" style="width: 1000px;height: 500px;"></a>
            </li>
            <li class="banner">
                <a href=""><img src="2.jpg" alt="" style="width: 1000px;height: 500px;"></a>
            </li>
            <li class="banner">
                <a href=""><img src="3.jpg" alt="" style="width: 1000px;height: 500px;"></a>
            </li>
            <li class="banner">
                <a href=""><img src="4.jpg" alt="" style="width: 1000px;height: 500px;"></a>
            </li>
            <li class="banner">
                <a href=""><img src="5.jpg" alt="" style="width: 1000px;height: 500px;"></a>
            </li>
            <div class="tabs">
                <span></span>
                <span></span>
                <span></span>
                <span></span>
                <span></span>
            </div>
            <i class="next"></i>
            <i class="prev"></i>
        </ul>



    </div>

</body>

</html>
* {
    margin: 0;
    padding: 0;
}

.main {
    margin: 0 auto;
    width: 1000px;
    height: 500px;
}

.main .container {
    width: 1000px;
    height: 500px;
    margin: 30px auto;
    position: relative;
}

.main .container .banner {
    list-style: none;
    display: block;
    position: absolute;
    top: 0;
    opacity: 0;
    transition: opacity 2s;
}

.main .container .banner a {
    display: block;
    width: 100%;
    height: 100%;
}

.main .container .tabs {
    position: absolute;
    bottom: 10px;
    left: 85%;
}

.main .container .tabs span {
    cursor: pointer;
    display: inline-block;
    box-sizing: border-box;
    width: 12px;
    height: 12px;
    margin: 1px;
    border: 1px solid royalblue;
    border-radius: 50%;
}

.main .container .tabs span:hover {
    background-color: lightgrey;
}

.main .container .tabs .current {
    background-color: lightgrey;
}

.main .container .next {
    cursor: pointer;
    width: 41px;
    height: 69px;
    display: block;
    position: absolute;
    right: 10px;
    top: 50%;
    background-image: url('./icon-slides.png');
    background-position: 41px;
}

.main .container .prev {
    cursor: pointer;
    width: 41px;
    height: 69px;
    display: block;
    position: absolute;
    left: 10px;
    top: 50%;
    background-image: url('./icon-slides.png');
    background-position: 82px;
}

.main .container .next:hover,
.main .container .prev:hover {
    background-color: lightslategrey;
}

首先让每张图的透明度opacity为0.且设置transition: opacity 2s ,不了解transition的建议先花2分钟学习一下这个属性,这边不在阐述。

重点:js部分

window.addEventListener('load', function() {
    // 先获取界面中所有相关的元素.
    var container = this.document.querySelector('.container');
    var banners = document.querySelectorAll('.banner');
    var spans = document.querySelector('.tabs').children;
    var next = document.querySelector('.next');
    var prev = document.querySelector('.prev');
    banners[0].style.opacity = 1; // 先让第一张banner显示出来.
    spans[0].className = 'current'; //先让第一个小圆点变颜色.

    //给小圆点添加点击事件,出现相应的banner;
    for (var i = 0; i < spans.length; i++) {
        spans[i].index = i; //给每一份span添加代表自是第几个的属性。
        spans[i].addEventListener('click', function() {
            for (var j = 0; j < spans.length; j++) { //排他思想
                spans[j].className = '';
                banners[j].style.opacity = 0;
            }
            this.className = 'current'; //当前事件监听器绑定哪个对象,this就指向这个对象。
            banners[this.index].style.opacity = '1'; //
        })
    }
    //给右侧按钮添加点击事件;
    next.addEventListener('click', function() {
        for (var j = 0; j < spans.length; j++) {
            if (spans[j].className == "current") {
                // 先找出当前在哪个span,找到了之后 令当前的banner消失,小圆圈变回无色,然后给下一个小圆圈上色,让下一个banner出现。
                spans[j].className = "";
                banners[j].style.opacity = "0";
                j++;

                if (j > 4) { //如果正好是最后一个banner,则下一个banner是第一个。j=0;
                    j = 0;
                }
                spans[j].className = "current";
                banners[j].style.opacity = "1";
            }
        }

    })
    //给右侧按钮添加点击事件;
    prev.addEventListener('click', function() {
        for (var j = 0; j < spans.length; j++) {
            if (spans[j].className == "current") {
                // 先找出当前在哪个spans,找到了之后 令当前的banner消失,小圆圈变回无色,然后给下一个小圆圈上色,让下一个banner出现。
                spans[j].className = "";
                banners[j].style.opacity = "0";
                j--;

                if (j < 0) { //如果正好是最第一个banner,则下一个banner是最后一个。j=4;
                    j = 4;
                }
                spans[j].className = "current";
                banners[j].style.opacity = "1";
            }
        }
    })
    //设置定时器,window载入时出发。
    var timer = setInterval(function() { 
        next.click();
    }, 3000)
    //设置鼠标移入时定时器消失
    container.addEventListener('mouseenter', function() { //不要用mouseout 和mouseover 会冒泡 一直触发事件 乱套了。

        clearInterval(timer);
        timer = null;


    })
    //设置鼠标移出时定时器消失。
    container.addEventListener('mouseleave', function() {


        timer = setInterval(function() {
            next.click();
        }, 3000)

    })




})

具体的思路都注释在代码部分了,在理解算法的基础上就可以轻易的写出这个demo,多看多思考一定可以理解。如果对您有帮助的话记得点个赞谢谢。