纯js实现无缝滑动轮播

效果如下:(点击我查看效果

 

原理:盒子内套入一个绝对定位的盒子,改变left值,实现轮播

           滑动的核心是每轮一个元素,嵌入缓动动画

           无缝的核心是复制第一个元素放到最后,在滑动到最后一个时,迅速切换到第2个

通常滑动的小圆点也是动态生成,因为很多时候,我们拿到的数据都是动态的

1、准备html和css

 

<style>
    * {
        margin: 0;
        padding: 0;
    }

    ul, li, ol {
        list-style: none;
    }

    .slider {
        width: 590px;
        height: 470px;
        border: 1px solid #eee;
        margin: 100px auto;
        padding: 5px;
        position: relative;
    }

    .inner {
        width: 100%;
        height: 100%;
        background: pink;
        position: relative;
        overflow: hidden;
    }

    .inner img {
        display: block;
    }

    .inner ul {
        width: 800%;
        position: absolute;
        top: 0;
        left: 0;
    }

    .inner li {
        float: left;
    }

    .slider ol {
        position: absolute;
        left: 50%;
        margin-left: -80px;
        bottom: 10px;
    }

    .slider ol li {
        float: left;
        width: 18px;
        height: 18px;
        background: #fff;
        margin-right: 10px;
        text-align: center;
        line-height: 18px;
    }

    .slider ol li.current {
        background: coral;
        cursor: pointer;
    }
</style>
<div class="slider" id="slider">
    <div class="inner">
        <ul>
            <li><a href="#"><img src="img/l1.jpg" alt=""></a></li>
            <li><a href="#"><img src="img/l2.jpg" alt=""></a></li>
            <li><a href="#"><img src="img/l3.jpg" alt=""></a></li>
            <li><a href="#"><img src="img/l4.jpg" alt=""></a></li>
            <li><a href="#"><img src="img/l5.jpg" alt=""></a></li>
            <li><a href="#"><img src="img/l6.jpg" alt=""></a></li>
        </ul>
    </div>
</div>

2、准备缓动动画函数

 

// 缓动动画函数
var leader = 0;//缓动动画变量
function animate(obj, target) {
    clearInterval(obj.timer); // 清除定时器
    /*定时任务,缓动轮播 30毫秒到target位置*/
    obj.timer = setInterval(function () {
        leader = leader + (target - leader) / 10;//缓动动画公式
        obj.style.left = leader + "px";
    }, 10);
}

3、动态复制第一个元素放到最后

 

// 1、动态复制最后一张图
ul.appendChild(ullis[0].cloneNode(true));

4、动态生成小圆点

 

// 2、动态生成小圆点
var ol = document.createElement("ol");
slider.appendChild(ol);
for (var i = 0; i < ullis.length - 1; i++) {
    var li = document.createElement("li");
    li.innerHTML = i + 1;
    ol.appendChild(li);
}
ol.children[0].setAttribute("class", "current");

5、鼠标经过小圆点时,切换圆点样式

 

// 3、鼠标经过小圆点  圆点事件
var ollis = ol.children;
for (var i = 0; i < ollis.length; i++) {
    ollis[i].index = i; // 自定义属性
    ollis[i].onmouseover = function () {
        for (var j = 0; j < ollis.length; j++) { // 去掉所有小圆点的class
            ollis[j].removeAttribute("class");
        }
        ollis[this.index].setAttribute("class", "current"); // 保留当前小圆点的class

        // 图片动画
        animate(ul, -this.index * ullis[0].offsetWidth);

        key = point = this.index; // 从当前开始动画
    }
}

6、轮播的核心,定时器

 

// 4、轮播图定时器
var timer = null;
timer = setInterval(autoplay, 3000);
var key = 0; // 控制播放张数
var point = 0; // 控制小圆点
function autoplay() {
    // 播放张数
    key++;
    if (key > ullis.length - 1) { // 判断是否播放完
        leader = 0; // 迅速跳回
        key = 1; // 下次播放第二张
    }
    animate(ul, -key * ullis[0].offsetWidth);

    // 小圆点
    point++;
    if (point > ollis.length - 1) {
        point = 0;
    }
    for (var i = 0; i < ollis.length; i++) { // 先清除所有的
        ollis[i].removeAttribute("class");
    }
    ollis[point].setAttribute("class", "current") // 再保留现在的
}

7、最后,贴上所有js代码

 

<script>
    // 获得元素
    var slider = document.getElementById("slider");
    var ul = slider.children[0].children[0];
    var ullis = ul.children;

    // 1、动态复制最后一张图
    ul.appendChild(ullis[0].cloneNode(true));

    // 2、动态生成小圆点
    var ol = document.createElement("ol");
    slider.appendChild(ol);
    for (var i = 0; i < ullis.length - 1; i++) {
        var li = document.createElement("li");
        li.innerHTML = i + 1;
        ol.appendChild(li);
    }
    ol.children[0].setAttribute("class", "current");

    // 3、鼠标经过小圆点  圆点事件
    var ollis = ol.children;
    for (var i = 0; i < ollis.length; i++) {
        ollis[i].index = i; // 自定义属性
        ollis[i].onmouseover = function () {
            for (var j = 0; j < ollis.length; j++) { // 去掉所有小圆点的class
                ollis[j].removeAttribute("class");
            }
            ollis[this.index].setAttribute("class", "current"); // 保留当前小圆点的class

            // 图片动画
            animate(ul, -this.index * ullis[0].offsetWidth);

            key = point = this.index; // 从当前开始动画
        }
    }

    // 缓动动画函数
    var leader = 0;//缓动动画变量
    function animate(obj, target) {
        clearInterval(obj.timer); // 清除定时器
        /*定时任务,缓动轮播 30毫秒到target位置*/
        obj.timer = setInterval(function () {
            leader = leader + (target - leader) / 10;//缓动动画公式
            obj.style.left = leader + "px";
        }, 10);
    }

    // 4、轮播图定时器
    var timer = null;
    timer = setInterval(autoplay, 3000);
    var key = 0; // 控制播放张数
    var point = 0; // 控制小圆点
    function autoplay() {
        // 播放张数
        key++;
        if (key > ullis.length - 1) { // 判断是否播放完
            leader = 0; // 迅速跳回
            key = 1; // 下次播放第二张
        }
        animate(ul, -key * ullis[0].offsetWidth);

        // 小圆点
        point++;
        if (point > ollis.length - 1) {
            point = 0;
        }
        for (var i = 0; i < ollis.length; i++) { // 先清除所有的
            ollis[i].removeAttribute("class");
        }
        ollis[point].setAttribute("class", "current") // 再保留现在的
    }

    // 5、鼠标经过事件
    slider.onmouseover = function () {
        clearInterval(timer);
    }
    slider.onmouseout = function () {
        timer = setInterval(autoplay, 3000);
    }
</script>

菜鸟献丑,欢迎指正

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值