原生js实现无缝轮播图效果

这篇博客介绍了一个使用HTML、CSS和JavaScript实现的图片轮播效果。通过点击左右箭头或设置定时器,图片可以平滑地从一张过渡到下一张,同时底部的导航点会随着图片变化而更新选中状态。该轮播组件考虑了图片循环展示的逻辑,当到达最后一张图片时会跳转回第一张,反之亦然。此外,当鼠标悬停在导航点上时,图片会快速切换到对应位置。这个轮播组件适用于网站的横幅广告或产品展示区域。
摘要由CSDN通过智能技术生成

主要是利用运动轨迹的思想来进行实现
代码:
首先写一个简单的html布局

<div class="win">
   <ul>
       <li><img src="image/banner1.jpeg"></li>
       <li><img src="image/banner2.jpeg"></li>
       <li><img src="image/banner3.jpeg"></li>
       <li><img src="image/banner4.jpeg"></li>
       <li><img src="image/banner1.jpeg"></li>
   </ul>
   <div class="left">&lt;</div>
   <div class="right">&gt;</div>
   <ol>
       <li class="active"></li>
       <li></li>
       <li></li>
       <li></li>
   </ol>
</div>

基础的style样式


```css
<style>
    * {
        padding: 0;
        margin: 0;
        list-style: none;
    }

    .win {
        width: 799px;
        height: 300px;
        margin: 0 auto;
        position: relative;
        overflow: hidden;
    }

    .left,
    .right {
        width: 40px;
        height: 40px;
        background-color: white;
        font-size: 20px;
        text-align: center;
        line-height: 40px;
        top: 35%;
        position: absolute;
    }

    .left {
        left: 0;
    }

    .right {
        right: 0;
    }

    ol li {
        width: 30px;
        height: 10px;
        float: left;
        margin-right: 10px;
        background-color: white;
    }

    ol {
        width: 160px;
        height: 20px;
        position: absolute;
        bottom: 5px;
        left: 50%;
        margin-left: -80px;
    }

    ul li {
        width: 799px;
        height: 300px;
        float: left;
    }

    ul {
        height: 300px;
        width: 7995px;
        position: absolute;
        top: 0;
        left: 0;
    }

    .active {
        background-color: red;
    }
</style>

js实现逻辑


```javascript
var left = document.querySelector(".left"),
            right = document.querySelector(".right"),
            imgWidth = document.querySelector(".win").offsetWidth,
            ul = document.querySelector("ul"),
            list = document.querySelectorAll("ol li"),
            index = 0,
            time,
            indexTime,
            win = document.querySelector(".win");
        // 点击右边按钮
        right.onclick = function () {
            // index 判断走几张图
            if (index == 4) {
                index = 0;
                // 位置也要回归到第1张图的位置
                ul.style.left = "0px";
            }
            index++
            speed()
            console.log("ul的left=" + ul.offsetLeft);
            console.log("要走的距离=" + -index * imgWidth);
        }
        // 点击左边按钮
        left.onclick = function () {
            if (index == 0) {
                index = 4
                // 位置也要到第5张图的位置
                ul.style.left = "-920px";
            }
            index--;
            speed()
        }


        // 运动函数
        function speed() {
            clearInterval(time);
            // 停止定时器,避免动画重复
            time = setInterval(function () {
                // 每一次保证走1张图,分成10小份 
                var motion = (-index * imgWidth - ul.offsetLeft) / 10;
                // -index * imgWidth 要走几张图的距离 - ul.offsetLeft 当前的距离
                // -230 / 10 23 -- -230 - 23 
                // -230 - -230 == 0
                if (motion > 0) {
                    motion = Math.ceil(motion);
                } else {
                    motion = Math.floor(motion);
                }
                // 赋值ul的位置 0 + 23 + 46
                // 当motion归0时 = ul赋值 230 + 0 = 230
                ul.style.left = ul.offsetLeft + motion + "px";
            }, 30);

            // ol li 的样式
            var value = index;
            if (index == 4) {
                value = 0
            }
            for (var x = 0; x < list.length; x++) {
                list[x].className = "";
            }
         list[value].className = "active";
        }

        // 鼠标划入ol li
        // onmouseover    onmouseenter 阻止冒泡
     for (var y = 0; y < list.length; y++) {
         (function (y) {
             list[y].onmouseover = function () {
                 // 清除其他的样式
                 for (var z = 0; z < list.length; z++) {
                     list[z].className = "";
                 }
                 // 选中的样式
                 list[y].className = "active";
                 // 让图片的index和li的y对应上
                 index = y;
                 speed()
             }
         }(y))
     }
     // 定时器,让图片自己走
     indexTime = setInterval(function () {
         if (index == 4) {
             index = 0
             ul.style.left = "0px";
         }
         index++
         speed()
     }, 1000);
      // 进入窗口时,停止自动走的定时器
     win.onmouseover = function () {
         clearInterval(indexTime);
     }
     win.onmouseout = function () {
         indexTime = setInterval(function () {
             if (index == 4) {
                 index = 0
                 ul.style.left = "0px";
             }
             index++
             speed()
         }, 2000);
     }

主要的逻辑就是:
1.点击箭头,让ul去走1张图的距离
2.图片走的过程要有动画
3.当图片走到第1张时,位置改成最后1张的位置,当图片走到最后1张的位置时,位置改成第1张的位置
4.下面选中的样式,要跟着图片改变
5.当鼠标滑过对应的ol下的li时,动画到对应的图片上
6.加定时器,让它自己动
7.鼠标划入窗口时,定时器要停止

大概实现效果:
实现效果展示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

是小许同学吖

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

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

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

打赏作者

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

抵扣说明:

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

余额充值