0

0

JavaScript如何实现动态轮播图效果?(代码示例)

青灯夜游

青灯夜游

发布时间:2019-11-30 17:05:33

|

3667人浏览过

|

来源于cnblogs

转载

本篇文章给大家带来的内容是javascript如何实现动态轮播图效果?(代码示例)。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

JavaScript如何实现动态轮播图效果?(代码示例)

功能描述:

1.鼠标经过 左右侧箭头显示,鼠标离开 箭头隐藏

2.动态添加底部小圆圈并绑定单击事件,并且让小圆圈的点击事件和左右箭头点击事件同步

立即学习Java免费学习笔记(深入)”;

3.拷贝第一张图片添加到ul最后可以实现动态添加图片

Teleporthq
Teleporthq

一体化AI网站生成器,能够快速设计和部署静态网站

下载

4.给箭头绑定单击事件,并且使图片可以无缝轮播

5.实现自动轮播(动画函数)

具体实现代码:

1.鼠标移入左右侧箭头显示,鼠标离开箭头隐藏

con.addEventListener('mouseenter', function() {
    arrow_l.style.display = 'block';  // 将左右箭头的display设为block
    arrow_r.style.display = 'block';
});
con.addEventListener('mouseleave', function() {
    arrow_l.style.display = 'none';  // 将左右箭头display设为none
    arrow_r.style.display = 'none';
});

2.动态添加底部小圆圈并绑定单击事件,并且让小圆圈的点击事件和左右箭头点击事件同步

立即学习Java免费学习笔记(深入)”;

 for(var i = 0; i < ul.children.length; i++) {
    var li = document.createElement('li');
    li.setAttribute('index', i);  // 通过添加自定义属性来记录小圆圈索引号
    ol.appendChild(li);      // 将创建的li添加进ol里
    // 生成小圆圈的同时就可以给它绑定单击事件
    li.addEventListener('click', function() {
        // 排他思想 干掉所有人,留下我自己
        for(var i = 0; i < ol.children.length; i++) {  // 先把所有的小圆圈改为未选中状态
            ol.children[i].className = '';
        }
        // 再把当前小圆圈改为选中状态
        this.className = 'current';
        var index = this.getAttribute('index');  // 获取当前小圆圈的索引
        // 将index值赋值给num以及circle,将小圆圈的点击事件和左右箭头点击事件同步
        num = index;
        circle = index;
        animate(ul, - index * conWidth);
    })
}

3.拷贝第一张图片添加到ul最后可以实现动态添加图片

// 克隆第一张图片
var first = ul.children[0].cloneNode(true); // true 深拷贝
ul.appendChild(first); // 拷贝第一张图片添加到ul最后

4.给箭头绑定单击事件,并且使图片可以无缝轮播

①右侧箭头的单击事件

var num = 0;    // 用来存储点击后图片序号
var circle = 0;   // 用来存储点击后小圆圈序号
var flag = true;   // flag 节流阀 防止用户点击过快 图片播放太快
// 右侧箭头点击播放
arrow_r.addEventListener('click', function() {
    if(flag) {
        // 点击后先关闭节流阀
        flag = false;
        // 如果播放到了最后一张,就把left直接值设为0从头播放,同时还原num
        if(num == ul.children.length - 1) {
            ul.style.left = 0;
            num = 0;
        }
        num++;
        animate(ul, - num * conWidth, function() {
            // 回调函数 动画执行完后开启节流阀
            flag = true;
        });
        // 小圆圈和箭头一起变化
        circle++;
        /* if(circle == ol.children.length) {
              circle = 0;
           } */
        // 可以用三元运算符判断小圆圈是否到了最后一个,如果是最后一个就还原circle
        circle == ol.children.length ? circle = 0 : circle;
        circleChange();   // 使当前小圆圈为选中状态(重复代码封装到一个函数里了)
    }
})

②左侧箭头的单击事件

arrow_l.addEventListener('click', function() {
    if(flag) {
        // 首先关闭节流阀
        flag = false;
        // 如果播放到了第一张,就把left值设为最后一张的值
        if(num == 0) {
            num = ul.children.length - 1;
            ul.style.left = - num * conWidth + 'px';
        }
        num--;
        animate(ul, - num * conWidth, function() {
            flag = true;
        });
        // 小圆圈和箭头一起变化 
        circle--;
        // 三元表达式   circle < 0 时说明是第一张图片,将小圆圈改为第四个(索引为3)
        circle < 0 ? circle = ol.children.length - 1 : circle;
        circleChange();
    }
})

circleChange();函数代码

// 小圆圈的选中状态(相同代码可以封装为一个函数,使代码更简洁)
function circleChange() {
    // 排他思想
    for(var i = 0; i < ol.children.length; i++) {
        ol.children[i].className = '';
    }
    ol.children[circle].className = 'current';
}

5.实现自动轮播(动画函数)

// 自动播放轮播图,相当于隔一段时间调用一次右侧箭头点击事件
 var timer = setInterval(function() {
     // 手动调用点击事件
     arrow_r.click();
}, 2000);

动画函数 animate.jsps:我没有把这个写入下边index.js里,这个要你自己弄进去哦,可以作为animate.js文件引入进去或者直接粘贴到你的js代码里边)

// obj 动画对象
// target 目标位置
// callback 回调函数
function animate(obj, target, callback) {
    clearInterval(obj.timer);
    obj.timer = setInterval(function() {
        var step = (target - obj.offsetLeft) / 10;  // step步长值
        step = step > 0 ? Math.ceil(step) : Math.floor(step); // 大于零向上取整,小于零向下取整
        if(obj.offsetLeft == target) {
            clearInterval(obj.timer);
            // if(callback) { // 判断是否传了回调函数
            //     callback(); // 回调函数,当动画执行完后才执行
            // }
            // &&是短路运算符,存在callback时才会继续执行callback()
            callback && callback();
        }
        obj.style.left = obj.offsetLeft + step + 'px';
    }, 15)
}

具体实现代码如下:

HTML代码:

ps: 我左右侧小箭头是使用的Iconfont图标(iconarrow_left,iconarrow_right),要引入进去

CSS代码:

详细JavaScript代码(index.js)

 window.addEventListener('load', function() {   // 等页面加载完毕
    // 获取需要用到的的元素
    var arrow_l = document.querySelector('.arrow-l');
    var arrow_r = document.querySelector('.arrow-r');
    var con = document.querySelector('.con');
    var conWidth = con.offsetWidth;
    // 鼠标经过箭头显示,鼠标离开箭头隐藏
    con.addEventListener('mouseenter', function() {
        arrow_l.style.display = 'block';  // 将左右箭头的display设为block
        arrow_r.style.display = 'block';
        // 鼠标经过停止定时器
        clearInterval(timer);
        timer = null; // 释放定时器变量
    });
    con.addEventListener('mouseleave', function() {
        arrow_l.style.display = 'none';  // 将左右箭头display设为none
        arrow_r.style.display = 'none';
        // 鼠标离开再重新开启定时器
        timer = setInterval(function() {
            // 手动调用点击事件
            arrow_r.click();  // 自动轮播
        }, 2000);
    });
    
    var ul = con.querySelector('ul');
    var ol = con.querySelector('ol');
    // 动态添加底部小圆圈
    for(var i = 0; i < ul.children.length; i++) {
        var li = document.createElement('li');
        // 通过添加自定义属性来记录小圆圈索引号
        li.setAttribute('index', i);
        ol.appendChild(li);
        // 生成小圆圈的同时就可以给它绑定单击事件
        li.addEventListener('click', function() {
            // 排他思想 干掉所有人,留下我自己
            for(var i = 0; i < ol.children.length; i++) {  // 先把所有的小圆圈改为未选中状态
                ol.children[i].className = '';
            }
            // 再把当前小圆圈改为选中状态
            this.className = 'current';
            var index = this.getAttribute('index');  // 获取当前小圆圈的索引
            // 将index值赋值给num以及circle,将小圆圈的点击事件和左右箭头点击事件同步
            num = index;
            circle = index;
            animate(ul, - index * conWidth);
        })
    }
    // 让第一个小圆圈底色为白色(选中状态)
    ol.children[0].className = 'current';
    // 克隆第一张图片
    var first = ul.children[0].cloneNode(true);  // true 深拷贝
    ul.appendChild(first); // 拷贝第一张图片添加到ul最后

    var num = 0;    // 用来存储点击后图片序号
    var circle = 0;   // 用来存储点击后小圆圈序号
    var flag = true;   // flag 节流阀 防止用户点击过快 图片播放太快
    // 右侧箭头点击播放
    arrow_r.addEventListener('click', function() {
        if(flag) {
            // 点击后先关闭节流阀
            flag = false;
            // 如果播放到了最后一张,就把left直接值设为0从头播放,同时还原num
            if(num == ul.children.length - 1) {
                ul.style.left = 0;
                num = 0;
            }
            num++;
            animate(ul, - num * conWidth, function() {
                // 回调函数 动画执行完后开启节流阀
                flag = true;
            });
            // 小圆圈和箭头一起变化
            circle++;
            /* if(circle == ol.children.length) {
                  circle = 0;
               } */
            // 可以用三元运算符判断小圆圈是否到了最后一个,如果是最后一个就还原circle
            circle == ol.children.length ? circle = 0 : circle;
            circleChange();   // 使当前小圆圈为选中状态
        }
    })

    // 左侧箭头点击播放
    arrow_l.addEventListener('click', function() {
        if(flag) {
            // 关闭节流阀
            flag = false;
            // 如果播放到了第一张,就把left值设为最后一张的值
            if(num == 0) {
                num = ul.children.length - 1;
                ul.style.left = - num * conWidth + 'px';
            }
            num--;
            animate(ul, - num * conWidth, function() {
                flag = true;
            });
            // 小圆圈和箭头一起变化 
            circle--;
            // circle < 0 时说明是第一张图片,将小圆圈改为第四个(索引为3)
            if(circle < 0) {
                circle = ol.children.length - 1;
            }
            circleChange();
        }
    })
    // 小圆圈的选中状态(相同代码可以封装为一个函数,使代码更简洁)
    function circleChange() {
        // 排他思想
        for(var i = 0; i < ol.children.length; i++) {
            ol.children[i].className = '';
        }
        ol.children[circle].className = 'current';
    }
    // 自动播放轮播图,相当于隔一段时间调用一次右侧箭头点击事件
    var timer = setInterval(function() {
        // 手动调用点击事件
        arrow_r.click();
    }, 2000);
})

更多炫酷CSS3、html5、javascript特效代码,尽在:javascript特效大全

JavaScript如何实现动态轮播图效果?(代码示例)JavaScript如何实现动态轮播图效果?(代码示例)JavaScript如何实现动态轮播图效果?(代码示例)JavaScript如何实现动态轮播图效果?(代码示例)JavaScript如何实现动态轮播图效果?(代码示例)

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

19

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

61

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

87

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

39

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

19

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

160

2026.01.18

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

164

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.9万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.3万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号