js实现轮播图原理及示例(转)

2023-11-07

网上有很多的例子介绍,在这里我所做的**无缝滚动**就是 通过改变元素的left值让图片呈现左右滚动的效果。
我们首先看一下 div+css 的结构样式:
这里写图片描述
div+css代码

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            *{
                margin: 0;
                padding: 0;
            }
            ul,ol{
                list-style: none;
            }
            /*消除图片底部3像素距离*/
            img{
                vertical-align: top;
            }
            .scroll{
                width: 500px;
                height: 200px;
                margin: 100px auto;
                border: 1px solid #ccc;
                padding: 7px;
                overflow: hidden;
                position: relative;
            }
            .box{
                width: 500px;
                height: 200px;
                overflow: hidden;
                position: relative;
            }
            .box ul{
                width: 600%;
                position: absolute;
                left: 0;
                top: 0;
            }
            .box ul li{
                float: left;
            }
            .scroll ol{
                position: absolute;
                right: 10px;
                bottom: 10px;

            }
            .scroll ol li{
                float: left;
                width: 20px;
                height: 20px;
                background: pink;
                text-align: center;
                line-height: 20px;
                border-radius: 50%;
                background-color: pink;             
                margin-left:10px ;
                cursor: pointer;
            }
            .scroll ol li.current{
                background-color: purple;
            }
        </style>
    </head>
    <body>
        <div id="scroll" class="scroll">
            <div id="box" class="box">
                <ul id="ul">
                    <li><img src="images/1.jpg" width="500" height="200"></li>
                    <li><img src="images/2.jpg" width="500" height="200"></li>
                    <li><img src="images/3.jpg" width="500" height="200"></li>
                    <li><img src="images/4.jpg" width="500" height="200"></li>
                    <li><img src="images/5.jpg" width="500" height="200"></li>
                </ul>
                <ol id="ol">
                    <li class="current">1</li>
                    <li>2</li>
                    <li>3</li>
                    <li>4</li>
                    <li>5</li>
                </ol>
            </div>
        </div>
    </body>
</html>

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86

展示效果如图:
这里写图片描述
接下来我们要将js 代码 ,
再此之前 我们要明白,小圆点 1 2 3 并不是写死的,它是根据ul li中的图片张数来决定的 ,所以 我们要先把div中ol li中的代码去掉
要实现无缝滚动 就需要多一张图片才行 ,即克隆第一张图片,放到最后面。此时css布局保留,div中只剩下:

<body>
        <div id="scroll" class="scroll">
            <div id="box" class="box">
                <ul id="ul">
                    <li><img src="images/1.jpg" width="500" height="200"></li>
                    <li><img src="images/2.jpg" width="500" height="200"></li>
                    <li><img src="images/3.jpg" width="500" height="200"></li>
                    <li><img src="images/4.jpg" width="500" height="200"></li>
                    <li><img src="images/5.jpg" width="500" height="200"></li>
                </ul>               
            </div>
        </div>
    </body>
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

此时我们用js代码生成小圆点

var scroll = document.getElementById("scroll"); // 获得大盒子
        var ul = document.getElementById("ul"); // 获得ul
        var ulLis = ul.children;// 获得ul的盒子 以此来生成ol中li的个数
        var liWidth = ul.children[0].offsetWidth;// 获得每个li的宽度
        // 操作元素
        // 因为要做无缝滚动,所以要克隆第一张,放到最后一张后面
        // 1. 克隆元素
        ul.appendChild(ul.children[0].cloneNode(true));

        // 2.创建ol 和li
        var ol = document.createElement("ol");//创建ol元素
        scroll.appendChild(ol);// 把ol放到scroll盒子里面去
        for (var i=0;i<ulLis.length-1;i++) {
            var li = document.createElement("li");// 创建li元素
            li.innerHTML = i + 1;// 给li里面添加文字  1 2 3 4 5
            ol.appendChild(li);// 将li元素添加到ol里面
        }
        ol.children[0].className = "current";// ol中的第一个li背景色为purple
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

此时ol li元素即小圆点创建完毕 我们接着用js做动画
动画部分包括:
1.鼠标经过第几个小圆点,就要展示第几张图片,并且小圆点的颜色也发生变化
2.图片自动轮播,(这需要一个定时器)
3.鼠标经过图片,图片停止自动播放(这需要清除定时器)
4.鼠标离开图片,图片继续自动轮播 (重新开始定时器)
这里我们封装了一个animate()动画函数

// 动画函数 第一个参数,代表谁动  第二个参数 动多少
        // 让图片做匀速运动,匀速动画的原理是 当前的位置 + 速度  即 offsetLeft + speed

        function animate(obj,target){
            // 首先清除掉定时器
            clearInterval(obj.timer);
            // 用来判断 是+ 还是 -  即说明向左走还是向右走
            var speed = obj.offsetLeft < target ? 15 : -15;
            obj.timer = setInterval(function(){
                var result = target - obj.offsetLeft;//它们的差值不会超过speed
                obj.style.left = obj.offsetLeft + speed + "px";
                // 有可能有小数的存在,所以在这里要做个判断             
                if (Math.abs(result) <= Math.abs(speed)) {
                    clearInterval(obj.timer);
                    obj.style.left = target + "px";
                }
            },10);
        }
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

定时器 函数

var timer = null; // 轮播图的定时器
        var key = 0;// 控制播放的张数
        var circle = 0;// 控制小圆点

        timer = setInterval(autoplay,1000);// 自动轮播
        function autoplay(){
            /*自动轮播时,要对播放的张数key进行一个判断,如果播放的张数超过ulLis.length-1,
            就要重头开始播放.  因为我们克隆了第一张并将其放在最后面,所以我们要从第二张图片开始播放*/
            key++; // 先++
            if(key > ulLis.length-1){// 后判断

                ul.style.left = 0; // 迅速调回
                key = 1; // 因为第6张是第一张,所以播放的时候是从第2张开始播放
            }
            // 动画部分
            animate(ul,-key*liWidth);
            // 小圆点circle   当显示第几张图片是,对应的小圆点的颜色也发生变化 

            /*同理,对小圆点也要有一个判断*/
            circle++;
            if (circle > olLis.length-1) {
                circle = 0;
            }
            // 小圆点颜色发生变化
            for (var i = 0 ; i < olLis.length;i++) {
                // 先清除掉所用的小圆点类名
                olLis[i].className = ""; 
            }
            // 给当前的小圆点 添加一个类名
            olLis[circle].className = "current";

        }

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

好啦,这里我们展示了主要代码,具体代码,查看这里下载js实现轮播效果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

js实现轮播图原理及示例(转) 的相关文章

  • 了解如何在20分钟内创建您的第一个Angular应用

    Angular is a JavaScript framework created my Misko Hevery and maintained by Google It s an MVC Model View Vontroller You
  • 多维数组变成一维数组

    这个问题来源于一个朋友曾经问过我的问题 当时是一个二维数组变成一维数组 后面我想整理一下 整理一个多维 并且是不定维的数组 一 二维数组变成一维数组 1 遍历数组 将元素一个个放入新数组 结果 如果元素不是数组 将会报错 下面是改良版 这样
  • jsp页面兼容谷歌浏览器相关问题

    1 js按键事件兼容 function document oncontextmenu ie8可运行 谷歌改为function document onkeydown 2 触发事件对象 IE浏览器支持window event srcElemen
  • JS中的发布-订阅

    发布订阅模式 什么是发布 订阅模式 发布 订阅模式的实现 发布 订阅实现思路 总结 优点 缺点 Vue 中的实现 观察者模式和发布订阅的区别 观察者模式 发布订阅模式 什么是发布 订阅模式 发布 订阅模式其实是一种对象间一对多的依赖关系 当
  • 问题记录:js的=>和function

    这个问题搞了一整天 是这么一个功能
  • js 微观任务、宏观任务、循环机制

    javascript是单线程语言 就是因为单线程的特性 就不得不提js中的同步和异步 同步和异步 所谓单线程 无非就是同步队列和异步队列 js代码是自上向下执行的 在主线程中立即执行的就是同步任务 比如简单的逻辑操作及函数 而异步任务不会立
  • Vue中鼠标悬停更换图片/文字内容,动态展示/修改某些属性

    Vue中鼠标悬停更换图片 文字内容 动态展示 修改某些属性 鼠标悬停时 mouseenter 鼠标离开时 mouseleave 利用以上来绑定相应方法 例如 div 分别为鼠标悬停时和离开时绑定方法changeImageSrc 并传递参数
  • QRCode简单生成二维码

    QRCode简单生成二维码 1 导包 2 jsp的body里 div div
  • [Vue warn]: Error in render: “TypeError: cellValue.replaceAll is not a function

    去除中括号 如 车门 车门 let reg new RegExp g return str replaceAll reg 上面方法 在edge浏览器 谷歌浏览器没问题 但是在搜狗和QQ浏览器就报错 解决办法 return str repla
  • IntelliJ IDEA 15款 神级超级牛逼插件推荐(自用,真的超级牛逼)

    来源 http suo im 5X5Rql 满满的都是干货 所有插件都是在 ctrl alt s 里的plugins 里进行搜索安装 1 CodeGlance 代码迷你缩放图插件 2 Codota 代码提示工具 扫描你的代码后 根据你的敲击
  • Umi+Dva初印象<基础应用,结构,流转逻辑>

    目录 前言 知识储备 generator函数 Dva初识 实际交互 函数式组件 class组件 前言 项目初始为umi脚手架进行初始化 lt 初始化过程 http t csdn cn cuTaY gt 工程中加载了umi自带的antd ui
  • js 字符串拼接的4种方法

    一 使用连接符 把想要连接的字符串串起来 let shy 帅哥 let a 我是 shy console log a 我是帅哥 二 模板字符串 模板字符串 template string 是增强版的字符串 用反引号 标识 特点 1 字符串中
  • JavaScript every() 方法:提示、技巧和用例

    JavaScript 巩固了其作为世界上最流行和最广泛使用的编程语言之一的地位 这是有充分理由的 它的动态特性和多功能性使其成为 Web 开发 从客户端交互到服务器端编程 的首选 提高其效率的一个重要因素是内置方法的多样性 其中一种有用的方
  • JavaScript 分支结构语句

    JavaScript 分支结构语句 1 if语句 2 if else语句 双分支语句 3 if else if 语句 多分支语句 4 三元表达式 5 switch语句 语句 也称为流控制语句 通常使用一或多个关键字完成既定的任务 语句可以简
  • 微信小程序之map地图规划路线以及显示距离

    有个问题 在选择公交路线 包含步行和公交 时 怎么才能让不同的路线显示不同的颜色 ps 有个方式 自己写坐标解压往后的存入新数组 把步行时的数据标注下 有什么简单的方法呢 自定义函数文件 自动获取定位信息 function getLocat
  • js formatDate 时间转换

    formatDate function time fmt type type 类型 0 时间为秒 1 时间为毫秒 var date new Date type 0 time 1000 time var o M date getMonth 1
  • 6.js--布尔值和null

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 目录 1 布尔数据 boolean 2 null 3 null和undefined的意义 1 布尔数据 boolean var a true var b false
  • WPF 路径动画PathAnimations的使用

    在wpf中让一个控件按照一定的路径运行的动画 叫做路径动画 这个示例演示了让一个rectangle按照一个s形曲线反复运行的动画 效果 只有一个文件 全部代码如下
  • 学习笔记——SVG.js中形状元素的创建及其相关方法

    CreateElement 1 创建svg元素 在svg js中 每个元素都是一个对象 可以通过构造它来创建 import Rect from svgdotjs svg js var rect new Rect size 100 100 a
  • JS实现成才网注册系统(网页数据验证)

    主代码

随机推荐

  • 贪心法--背包问题(不是0/1背包问题)

    课后习题 习题七第1题 问 用贪心法求解如下背包问题的最优解 有7个物品 重量分别为 2 3 5 7 1 4 1 价值分别为 10 5 15 7 6 18 3 背包容量W 15 写出求解过程 答 1 单价分别为 5 5 3 3 1 6 4
  • 史上最全的Jackson框架使用教程

    简单介绍 别再使用 fastJson 了 漏洞天天报 Bug 修不完 快来拥抱 Jackson 吧 Jackson 是用来序列化和反序列化 json 的 Java 的开源框架 Spring MVC 的默认 json 解析器便是 Jackso
  • pymunk怎么创建弯曲实体

    要在pymunk中创建弯曲实体 需要使用pymunk的弯曲约束 Curve Constraint 这种约束可以用来限制两个物体的运动方向 以实现弯曲效果 首先 你需要创建物体并将它们添加到物理空间中 然后 使用pymunk的pymunk c
  • Ubuntu&树莓派的putty、ftp、Xming、VNC远程连接操作教程

    目录 任务大纲 一 远程操作前的准备 1 Ubuntu设置桥接并新建用户 2 树莓派新建用户 二 Win10 下用 puTTY 远程登录 1 远程登录Ubuntu 2 远程登录树莓派 三 Win10 下用 FTP 远程传输文件 1 Ubun
  • MySQL和PgSQL的区别

    2018 6 11 1 问题 如果打算为项目选择一款免费 开源的数据库 那么你可能会在MySQL与PostgreSQL之间犹豫不定 MySQL与PostgreSQL都是免费 开源 强大 且功能丰富的数据库 你主要的问题可能是 哪一个才是最好
  • Leetcode数据结构算法—求最大子数组和

    文章目录 一 题目描述 二 题目解法 一 题目描述 二 题目解法 解题思路 用 temp 记录局部最优值 用 result 记录全局最优值 每遍历一个新元素时 判断 已遍历的连续子数组的和 加上 当前元素值 与 当前元素值 对比谁更大 1
  • 新手VMware安装CentOS 7,一学就会!

    首先我们需要明白一点 虚拟机 是通过软件虚拟出来计算机 使用过程中的体验与真实计算机没有区别 虚拟机比较吃计算机配置 因此对于计算机硬件配置低的小伙伴 安装完毕后可能会出现卡顿 无法启动虚拟机 无法关闭虚拟机 无法关闭VMware等情况 如
  • vue针对正式和测试环境打不同的包

    一开始我是直接在pro env js里面配置了两个地址 每次打包时注释掉不要的就好了 但打包频繁了 越发觉得很不方便 然后就有了后面的方法 一 模仿npm run build 新建一个新的命令 npm run sit 通过新建命令 npm
  • 海外专线网络费用

    在企业海外扩展和开展业务时 建立可靠的网络连接是至关重要的 而海外SD WAN专线网络作为一种优化广域网连接的解决方案 提供更好的连接质量和性能 本文将介绍海外SD WAN专线网络的费用组成 帮助企业更好地了解和规划网络投资 1 专线租用费
  • 【Windows基础】本地安全策略

    本地安全策略基本内容 概念 对登陆到计算机上的账号定义一些安全设置 在没有活动目录集中管理的情况下 本地管理员必须为计算机进行设置以确保其安全 主要是对登录到计算机得账户进行一些安全设置 主要影响是本地计算机安全设置 打开方式 三种方式 开
  • html5页面适配方法,H5案例分享:HTML5移动页面适配方法

    HTML5移动页面适配方法 之前做过PC页面时考虑最多的是兼容 这是因为浏览器之间的差异引起的 而移动端是基本没有 兼容 的问题了 全是CSS3 是不是很开心 但是开心早了 因为适配的问题来了 痛哭 什么是 适配 简单除暴点讲就是当我们开始
  • visual studio2022没有c++ window的空项目

    选择安装
  • hugo+GitHub搭建博客网站

    准备工具 Git 设置 Linux命令行下载就可以 arch Linux安装命令 sudo pacman S git Debian 和 Ubuntu 安装命令 sudo apt get install git Windows 的Git 下载
  • 西门子S7通信协议以及JAVA版的实现

    西门子S7协议实现 采用java的方式实现西门子S7协议 链接地址 iot communication github https github com xingshuangs iot communication gitee https gi
  • Leetcode437. 路径总和 III(C语言)

    Leetcode437 路径总和 III C语言 数据结构 树 算法与数据结构参考 题目 给定一个二叉树 找出路径和等于给定数值的路径总数 路径不需要从根节点开始 也不需要在叶子节点结束 路径方向必须向下 二叉树不超过1000个节点 且节点
  • Vue 运行后自动打开浏览器的解决办法(vuecli2和vuecli3+的区别)

    一 Vue JavaScript 需要项目npm run dev运行后自动打开浏览器 VueCli2 1 1 版本说明 vue 2 5 2 vue router 3 0 1 vuecli2 1 2 修改项目目录下 config index
  • 验证码识别+爆破

    碰到比较简单 很好辨认的验证码可以尝试此种方法爆破 审查元素 找到验证码对应URL 复制到域名后面访问一下 确定是验证码URL 然后 打开工具PKAV HTTP FUzzer 开始尝试自动识别验证码 工具下载地址 https sec kim
  • svn使用记录

    File not found transaction 109 3q path trunk Setting Config cs You have to update your working copy first 好像是本地的 svn库中包含
  • 大模型基础03:Embedding 实战本地知识问答

    大模型基础 Embedding 实战本地知识问答 Embedding 概述 知识在计算机内的表示是人工智能的核心问题 从数据库 互联网到大模型时代 知识的储存方式也发生了变化 在数据库中 知识以结构化的数据形式储存在数据库中 需要机器语言
  • js实现轮播图原理及示例(转)

    网上有很多的例子介绍 在这里我所做的 无缝滚动 就是 通过改变元素的left值让图片呈现左右滚动的效果 我们首先看一下 div css 的结构样式 div css代码