Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >jQuery实现轮播效果

jQuery实现轮播效果

作者头像
切图仔
发布于 2022-09-08 09:47:13
发布于 2022-09-08 09:47:13
6.1K00
代码可运行
举报
文章被收录于专栏:生如夏花绚烂生如夏花绚烂
运行总次数:0
代码可运行

HTML结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            padding:0;
            margin:0;
            text-decoration: none;
        }
        body{
            /* padding:20px; */
        }
        #container{
            width:600px;
            height: 400px;
            overflow: hidden; /*图片超出部分隐藏*/
            position: relative;
            margin:0 auto;
        }
        #list{
            width:3000px; /* 5张图片的宽度 5*600 */
            height: 400px;
            position: absolute;
            z-index: 1;
        }
        #list img{
            float:left;
            width: 600px;
            height: 400px;
        }
        #dot{
            position:absolute;
            height: 10px;
            width: 100px;
            z-index: 2;
            bottom:20px;
            left:250px;
        }
        #dot .on{
            background:orangered
        }
        #dot span{
            cursor:pointer;
            float:left;
            width: 15px;
            height: 15px;
            border-radius: 50%;
            margin:0 auto;
            background-color: rgba(0,0,0,.7);
        }
        .arrow{
            cursor:pointer;
            display: none;
            line-height: 39px;
            text-align: center;
            font-size: 36px;
            font-weight: bold;
            width: 40px;
            height: 40px;
            position: absolute;
            z-index: 2;
            top:180px;
            background-color: rgba(0,0,0,0.3);
            color:#fff;

        }
        .arrow:hover{
            background-color: rgba(0,0,0,.7);
        }
        /* 鼠标移动到整个div区域时 */
        #container:hover .arrow{
            display: block;
        }
        #prev{
            left:20px;
        }
        #next{
            right: 20px;
        }
    </style>
</head>
<body>
    <div id="container">
        <div id="list">
            <img src="./images/1.jpg" alt="">
            <img src="./images/2.jpg" alt="">
            <img src="./images/3.jpg" alt="">
            <img src="./images/4.jpg" alt="">
            <img src="./images/5.jpg" alt="">
        </div>
        <div id="dot">
            <span index="1" class="on"></span>
            <span index="2" class=""></span>
            <span index="3" class=""></span>
            <span index="4" class=""></span>
            <span index="5" class=""></span>
        </div>
        <a href="javascript:;" id="prev" class="arrow"><</a>
        <a href="javascript:;" id="next" class="arrow">></a>
    </div>
需求分析
  1. 点击向右(左)的图标 平滑到下一页
  2. 无限循环切换,第一页的上一页为最后页,最后一页的下页是第一页
  3. 每隔3s自动滑动到下一页
  4. 当鼠标进入图片区域时,自动切换停止,当鼠标离开后自动切换开始
  5. 切换页面时,下面的圆点同步更新
  6. 点击圆点图标切换到对应的页

点击向右(左)的图标 平滑到下一页 要实现点击箭头向做向右移动我们需要

  1. 设置每次偏移量 PAGE_WIDTH
  2. 设置翻页持续的时间 TIME
  3. 设置单元移动的间隔时间 ITEM_TIME
  4. 求出单元移动的偏移量 itemOffset = offset(偏移量)/(TIME/ITEM_TIME)
  5. 计算出要移动到的目标位置
  6. 循环定时器进行平滑移动

代码实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    $(function(){        
    var $container = $('#container')
    var $list = $('#list')
    var $dot = ('#dot span')
    var $prev = $('#prev')
    var $next = $('#next')
    var PAGE_WIDTH = 600 //偏移常量
    var TIME = 400 //翻页持续时间
    var ITEM_TIME = 20 //单元间隔时间

    //1.点击向右(左)的图标 平滑到下一页
    $next.click(function(){
            //平滑下一页
            nextPage(true)
    })
    $prev.click(function(){
            //平滑上一页
            nextPage(false)
    })

    /**
     平滑翻页
        true:下一页
        false:上一页
    */
    function nextPage(next){
         var offset = 0
         //计算offset 偏移量
         var offset = next ? -PAGE_WIDTH : PAGE_WIDTH
         //计算单元移动的偏移量 itemoffset
         var itemOffset = offset/(TIME/ITEM_TIME)
         //获取当前currentLeft
         var currentLeft = $list.position().left 
         //计算出目标处的left值
         var targetLeft = currentLeft + offset
         //循环定时器
         var timer  = setInterval(() => {
                 //计算最新的current
                 currentLeft += itemOffset
                 //判断是否到底目标位置
                 if(currentLeft ===targetLeft){
                         //清除定时器
                         clearInterval(timer) 
                 }
                 $list.css('left',currentLeft)

         }, ITEM_TIME);
    }
})

实现切换无缝滚动

为了实现无缝滚动的效果我们要在第一张图片前面添加最后一张图片,在最后一张图片后面添加第一张图片 当切换到克隆的(第一张/最后一张)图片时,跳转到真正的图片

修改css

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 #list{
    width:4200px; /* 7张图片的宽度 7*600 */
    height: 400px;
    position: absolute;
    z-index: 1;
}

修改html结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div id="list" style="left:-600px">
    <img src="./images/5.jpg" alt="">
    <img src="./images/1.jpg" alt="">
    <img src="./images/2.jpg" alt="">
    <img src="./images/3.jpg" alt="">
    <img src="./images/4.jpg" alt="">
    <img src="./images/5.jpg" alt="">
    <img src="./images/1.jpg" alt="">
</div>

js部分

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
var ITEM_TIME = 20 //单元间隔时间
 //获取图片数量
var imgCount = $dot.length;
...
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//定时器循环滚动
var timer = setInterval(() => {
    currentLeft+=itemOffset
    if(currentLeft === targetLeft){
            clearInterval(timer)
            //在滚动到最后一张图片的瞬间,跳转到第一张克隆的最后一张图片
            if(currentLeft === -(imgCount+1) * PAGE_WIDTH){
                    currentLeft = -PAGE_WIDTH
            }else if(currentLeft === 0){
                    //在滚动到第一张图片的瞬间(克隆的最后一张图片),跳转到最后一张克隆的第一张图片
                    currentLeft = - PAGE_WIDTH * imgCount
            }
    }

    $list.css('left',currentLeft)

},ITEM_TIME);

循环滚动实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
 $next.click(function(){
        //  下一页
        nextPage(true)
 })
//每隔3s自动切换
var timer = setInterval(() => {
         nextPage(true)
},3000)

//当鼠标进入图片区域时,自动停止,当鼠标离开,有开始自动切换
$container.hover(function(){
        //清除定时器
        clearInterval(timer)

},function(){
        //鼠标离开 开启定时器
        timer = setInterval(() => {
                nextPage(true)
        },3000)
})
...

使圆点高亮显示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
 //获取图片数量
var imgCount = $dot.length
 //当前滚动图片的下标
var index = 0
...
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
$list.css('left',currentLeft)

        },ITEM_TIME);
        //更新圆点
        updatePoints(flag)
 }
 function updatePoints(flag){

         //计算出目标圆点的下标targetIndex
         var targetIndex = 0
         //下一页使目标圆点下标+1
         if(flag){
                targetIndex = index + 1 //[0 ,imgCount+1]
                if(targetIndex === imgCount){
                        targetIndex = 0 
                }
         }else{
                 targetIndex = index -1
                 if(targetIndex === -1){
                         targetIndex = imgCount-1
                 }
         }
        //将当前index的<span>的class移除
        $dot.eq(index).removeClass('on')
        //给目标圆点添加class='on'
        $dot.eq(targetIndex).addClass('on')
        //将index更新为targetIndex
        index = targetIndex

 }
 ...

点击圆点实现图片滚动

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
//将index更新为targetIndex
    index = targetIndex
}
//点击圆点图片切换对应的图片
 $dot.click(function(){
         //计算目标页的下标
         var targetIndex = $(this).index()
         if(targetIndex!=index){
                 //点击的不是当前页的圆点 才进行翻页
                 nextPage(targetIndex)
         }
 })

这里我们将当前圆点的下标传入nextPage我们要对nextPage进行一部分修改,因为传进来的参数不止是boolean类型了,还有数字类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 /**
 * true:下一页
 * false:上一页
 * 数值:指定下标页
 */
 function nextPage(flag){
        //设置偏移量
        var offset = 0
        if(typeof flag==='boolean'){
                offset = flag ? -PAGE_WIDTH : PAGE_WIDTH
        }else{
                offset = -(flag-index) * PAGE_WIDTH
        }
        ...

更新圆点方法updatePoints也有修改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
function updatePoints(flag){        
 //计算出目标圆点的下标targetIndex
 var targetIndex = 0
 if(typeof flag ==='boolean'){
        //下一页使目标圆点下标+1
        if(flag){
                targetIndex = index + 1 //[0 ,imgCount+1]
                if(targetIndex === imgCount){
                        targetIndex = 0 
                }
        }else{
                targetIndex = index -1
                if(targetIndex === -1){
                        targetIndex = imgCount-1
                }
        }
 }else{
    targetIndex = flag
 }
...

到此基本的轮播图实现完成,但是这里还有一个bug,当快速点击切换图片时会出现“空白的情况” 出现这种问题的原因是快速点击时触发了多个定时器进行移动

解决办法:只时一个定时器生效

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 //当前滚动图片的下标
 var index = 0
 var moving = false  //翻页状态
 
 ...
 function nextPage(flag){
    if(moving)return  //如果正在翻页 直接结束
    moving = true //调用翻页时moving为true
    //设置偏移量
    var offset = 0
    if(typeof flag==='boolean'){
            offset = flag ? -PAGE_WIDTH : PAGE_WIDTH
    }else{
        offset = -(flag-index) * PAGE_WIDTH
}
...
//定时器循环滚动
var timer = setInterval(() => {
    currentLeft+=itemOffset
    if(currentLeft === targetLeft){
        clearInterval(timer)
        //标识翻页停止
        moving = false
 ...
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
自实现PC端jQuery版轮播图
  最近其他项目不是很忙,被安排给公司的官网项目做一个新的页面(之前没接触公司官网项目),其中有一个用到轮播图的地方,最开始想直接用swiper.js插件实现就好了,可是发现官网项目里之前都没有引入过swiper.js,后来想了想,就不引入它了,免得又得增加依次一次网络请求,项目里既然已经用到了jQuery,那就索性用jQuery写一个轮播图吧。 现在把自己写的轮播图这块代码单独拿出来,做一个小demo写在这里记录一下(demo中轮播图的图片网上随意找的) 实现的效果:     1、自动轮播(轮播时间间
用户1174387
2018/03/28
5.6K0
自实现PC端jQuery版轮播图
JS实现手动和自动轮播效果
开门见山,今天要实现的轮播效果如下图所示:(轮播自动播放;点击左右按钮实现上一张和下一张的功能;鼠标移入轮播暂停;鼠标移出轮播自动播放;小圆点随着图片的变化而变化,点击哪个小圆点回到哪张图片;底部显示第几张图片)
yyp
2019/08/07
5.7K0
JS实现手动和自动轮播效果
第54天:原生js实现轮播图效果
一系列的大小相等的图片平铺,利用CSS布局只显示一张图片,其余隐藏。通过计算偏移量利用定时器实现自动播放,或通过手动点击事件切换图片。
半指温柔乐
2018/09/11
6.7K0
第54天:原生js实现轮播图效果
自己实现PC端jQuery版轮播图
最近其他项目不是很忙,被安排给公司的官网项目做一个新的页面(之前没接触公司官网项目),其中有一个用到轮播图的地方,最开始想直接用swiper.js插件实现就好了,可是发现官网项目里之前都没有引入过swiper.js,后来想了想,就不引入它了,免得又得增加依次一次网络请求,项目里既然已经用到了jQuery,那就索性用jQuery写一个轮播图吧。
用户1187932
2018/03/09
11.2K1
自己实现PC端jQuery版轮播图
移动端轮播图效果实现
为了使ul装下5张图片我们将其宽度设置为500%,但这样会造成图片放大5倍,因此我们为img的父元素li设置20%的宽度占ul的五分之一,这时候图片就显示正常了
切图仔
2022/09/08
1.6K0
移动端轮播图效果实现
移动端轮播图笔记
移动端浏览器兼容性好,我们不需要考虑以前JS的兼容问题,可以放心使用原生JS书写效果,但是移动端也有自己独特的地方,比如触屏事件touch(也叫触摸事件),Android和IOS都有。
帅的一麻皮
2020/05/07
2.5K0
JS实现焦点图轮播效果
<div id="container"> <div id="list" style="left: -600px;"> <img src="img/5.jpg" alt="1"/> <img src="img/1.jpg" alt="1"/> <img src="img/2.jpg" alt="2"/> <img src="img/3.jpg" alt="3"/> <img src="img/4.jpg" alt="4"/> <img src="img/5.jpg" alt="5"/> <img src="img/1.jpg" alt="5"/> </div> <div id="buttons"> <span index="1" class="on"></span> <span index="2"></span> <span index="3"></span> <span index="4"></span> <span index="5"></span> </div> <a href="javascript:;" id="prev" class="arrow">&lt;</a> <a href="javascript:;" id="next" class="arrow">&gt;</a> </div>
botkenni
2019/09/03
15.3K0
jsp实现轮播图
背景 支持ie老版本没办法使用比较新的框架,只能使用原始js实现。 演示地址 实现功能如下:
崔笑颜
2020/06/08
4.4K0
原生js实现淡入淡出轮播图效果
程序媛夏天
2024/01/18
1930
原生js实现淡入淡出轮播图效果
一款轮播组件的诞生
早在几个月前,就想自己动手写个轮播图组件,因此也看了许多文章,断断续续过了几个月,今天终于有时间腾出手来给此插件做个总结,因此有了这篇文章。话不多说,先上 Demo, 效果如下:
小皮咖
2019/11/05
2.2K0
一款轮播组件的诞生
如何用jQuery语言写轮播图
轮播效果:点击下一个按钮跳转到下一张图片,点击上一个按钮跳转到上一个图片;鼠标移进图片轮播停止,鼠标移出则自动轮播。 1.HTML代码
程序媛夏天
2024/01/18
1990
如何用jQuery语言写轮播图
JavaScript案例:移动端轮播图
HTML部分: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <style>
岳泽以
2022/10/26
1.3K0
JavaScript案例:移动端轮播图
原生js实现图片轮播效果
思路:设置父容器(一定宽度,一定高度,相对定位,子容器超出部分进行隐藏),子容器图片并排(浮动,绝对定位,每次点击进行相应的左或右偏移量) 1.html: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>Carousel figure</title> 5 <meta charset="utf-8"> 6 <!-- 浏览器标签页显示图标 --> 7 <link rel="icon" type="image/x-icon"
用户1149564
2018/01/11
17.2K0
23个项目管理经典案例_交互动画
注意: speed = (end - box.offsetLeft)/20; 代表用(终点位置-当前位置)/动画系数 动画系数可以控制动画的快慢
全栈程序员站长
2022/11/03
1.8K0
jQuery之制作简单的轮播图效果
        通过修改每一张图片的透明度,让其每隔一段时间将其中的某一张图片透明度设为 1,而其他的设为0,从而实现图频轮流播放的效果。首先让一组图片绝对定位,并使其重叠,通过函数切换控制图片的透明度和定时器来触发该函数,改变不同图片的透明度。
思索
2024/08/16
990
js焦点轮播图
汇集网上焦点轮播图的实现方式,自己试了下,不过鼠标悬浮停止动画和鼠标离开动画播放好像没生效,不太明白,最后两行代码中,为什么可以直接写stop和play。不用加括号调用函数么?求懂的大神指点! 所用知识点: 1.DOM操作 2.定时器 3.事件运用 4.Js动画 5.函数递归 6.无限滚动大法(可以用js实现一个假图的制作。不过说实话一直理解不了假图的作用原理) <style> * { margin: 0; padding: 0;
蓓蕾心晴
2018/04/12
12.5K0
新手程序员如何用JQuery写一个轮播图代码,详细解释
很酷的站长
2023/12/08
3650
新手程序员如何用JQuery写一个轮播图代码,详细解释
手撸移动端轮播图(内含源码)
移动端轮播图与PC段轮播图,在技术选择上是有区别的,因为移动端的浏览器版本非常好,对于H5和CSS3的支持非常完美,所以很多效果可以CSS3的方式实现,比如可以使用 Transorm 属性替代原来的动画函数
玖柒的小窝
2021/12/10
1.4K0
手撸移动端轮播图(内含源码)
从零开始学 Web 之 移动Web(二)JD移动端网页,移动触屏事件
要实现轮播图,必须在首尾添加图片,如果直接在 html 代码直接添加图片的话,由于图片的数量是不固定的,那么每次图片的数量发生改变的话,不仅需要设置 html 的源码,而且还要设置对应的 css 代码,所以,为了从后台获取的图片数量不固定的情况下,也能够实现轮播效果,我们可以使用 js 来动态的添加图片。
Daotin
2018/08/31
2.7K0
从零开始学 Web 之 移动Web(二)JD移动端网页,移动触屏事件
JavaScript案例:轮播图
节流阀目的:当上一个函数动画内容执行完毕,再去执行下一个函数动画,让事件无法连续触发。
岳泽以
2022/10/26
3K0
JavaScript案例:轮播图
相关推荐
自实现PC端jQuery版轮播图
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文