Loading [MathJax]/jax/output/CommonHTML/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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
关于本博客皮肤样式配置
先向博客园申请开通博客 向博客园申请博客js权限 这两步谷歌吧, 我已经申请好了,没法截图 设置博客皮肤模板 否则下面css,js会跟其他模板不兼容 修改页面定制css代码 *,.Cal{paddin
iginkgo18
2020/09/27
4920
关于本博客皮肤样式配置
【CSS进阶】巧用伪元素before和after制作绚丽效果
原创:叫我詹躲躲 来源:掘金 链接:巧用伪元素before和after制作绚丽效果
微芒不朽
2022/09/06
1.7K0
【CSS进阶】巧用伪元素before和after制作绚丽效果
博客前端美化记录(持续更新)
程序:Typecho 主题:Cuteen Version:4.1 作者:@Veen zhao
Y5neKO
2022/01/13
7250
博客前端美化记录(持续更新)
wordpress字体样式——css炫酷的字体样式实现
这些都是自己在使用wordpress时想要更选一点的样式效果,整理出来的css样式,虽然现在还看不太懂,因为css真的博大精深,但是能够看得懂,然后修改成自己想要实现的效果,那就OK了,至于学的话,慢慢来。嘻嘻嘻 ^~^ ! ps:这是自己使用css实现的博客效果图
不愿意做鱼的小鲸鱼
2022/08/24
2.7K0
wordpress字体样式——css炫酷的字体样式实现
纯CSS3绘制的逼真,呆萌,超酷的CSS3动画纯CSS3人物行走动画 逼真炫酷CSS3动画纯CSS3绘制的小猫笑脸动画 超呆萌纯CSS3绘制可爱小男孩动画 超酷面部表情
纯CSS3人物行走动画 逼真炫酷CSS3动画 CSS3实在是太强大了,今天分享的CSS3动画非常神奇,它可以模拟人物行走,而且人物行走动画非常逼真。人物行走时的跨步动画时多张图片重叠实现的。有了这个
wblearn
2018/08/27
1.7K0
纯CSS3绘制的逼真,呆萌,超酷的CSS3动画纯CSS3人物行走动画 逼真炫酷CSS3动画纯CSS3绘制的小猫笑脸动画 超呆萌纯CSS3绘制可爱小男孩动画 超酷面部表情
纯css实现117个Loading效果(下)
这是我这几十年间从世界各地寻觅到的 Loading特效,合计117个(本文贴出第79-117个),而且是 纯CSS 制作的。
德育处主任
2022/04/17
1.1K0
纯css实现117个Loading效果(下)
很可爱的返回顶部js素材,网站安装教程
给自己网站放一个返回顶部js特效效果把,主要是图片素材也不错,比较抢镜,所以弄个小教程,比较简单,放上去试试看把
用户7146828
2021/08/09
1.7K0
纯css实现117个Loading效果(中)
这是我这几十年间从世界各地寻觅到的 Loading特效,合计117个(本文贴出第40-78个),而且是 纯CSS 制作的。
德育处主任
2022/04/17
1.4K0
纯css实现117个Loading效果(中)
CSS 3.0实现猫脸动画
给大家分享一个用CSS 3.0实现猫脸动画,实现的效果如下: 以下是实现的代码,欢迎大家复制粘贴和收藏。 <!DOCTYPE html> <html lang="en"> <head>
越陌度阡
2020/11/26
4240
CSS 3.0实现猫脸动画
Butterfly主题美化
在butterfly/source/css/创建一个universe.css文件。
ymktchic
2022/01/18
1.6K0
Butterfly主题美化
收集整理一些css3的图片阴影效果
主要利用gradient,transform,配合after以及before伪元素来实现各种图片阴影,卷角效果。 <!DOCTYPE HTML> <html lang="en-US"> <head>
练小习
2017/12/29
7390
天哪!跟真的一样(CSS)
  无论是css还是别的,前端的学习总是妙趣横生,只要思想在不断进步,技术就会一次次的突破。如果你学习过CSS,你会更加了解这段代码的神奇,送给你,远道而来的求学者。   如果你不曾学习过CSS,又想将代码保存下来,留待将来学习和参悟,那么请点击 “ 这里 ” ,一遍就能学废。
我不是费圆
2020/09/21
9300
天哪!跟真的一样(CSS)
转一个css3绘制的iPhone6
css3绘制的iPhone6 <!DOCTYPE html> <html> <head> <title></title> <style type="text/css"> @font-f
练小习
2017/12/29
5230
鼠标悬停按钮
  前端的学习不是一蹴而就,不积跬步无以至千里,不积小流无以成江海。持续不断的努力才能让你我有所收获,专业的知识还得到机构去学习,培训机构的设立有其存在的必然性,你钱花对了吗?
我不是费圆
2020/12/17
2K0
高德地图添加多个点标注的点击事件
大家好,又见面了,我是你们的朋友全栈君。 <!doctype html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="chrome=1"> <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width"> <style type="text/css">
全栈程序员站长
2022/08/31
7670
高质量编码-轨迹管理平台(CSS样式)
样式仿照百度地图鹰眼轨迹服务早期版本的web端轨迹管理台,地图和UI都使用了夜色风格。
MiaoGIS
2020/12/17
5160
高质量编码-轨迹管理平台(CSS样式)
用coding向你最爱的人说圣诞快乐
文章目录 圣诞节的起源 圣诞祝福语 用 coding 说圣诞快乐 Canvas 渲染 圣诞树特效 唯美圣诞树 CSS实现圣诞树 简易的圣诞树 线性树 卡片圣诞树 🎄🎄🎄圣诞节即将到来,今天让我们用编码的方式向你最爱的人表达圣诞节快乐 圣诞节的起源  圣诞节源自古罗马人迎接新年的农神节,与基督教本无关系。在基督教盛行罗马帝国后,教廷将这种民俗节日纳入基督教体系,同时以庆祝耶稣的降生。但在圣诞节这天不是耶稣的生辰,因为《圣经》未记载耶稣具体出生时间,同样没提到过有此种节日,是基督教吸收了古罗马神话的结
鱼找水需要时间
2023/02/16
3910
用coding向你最爱的人说圣诞快乐
「兔了个兔」福兔贺春,纯CSS实现超精美月兔404界面(附源码)
💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完成,对SAP企业管理系统,SAP ABAP开发和数据库具有较深入的研究。 💅文章概要: 各位小伙伴们大家好呀,兔年吉祥,预祝大家来年财源滚滚来!今天给大家带来的分享是一款超精美的月兔404前端界面,希望大家能喜欢! 🤟每日一言: 你可以遗憾,但是你绝对不能
THUNDER王
2023/02/23
3380
「兔了个兔」福兔贺春,纯CSS实现超精美月兔404界面(附源码)
用 Javascript 生成二维码
大家好,这将是一篇很短的文章,我将展示如何为 JavaScript 中的任何内容生成二维码。
全栈程序员站长
2022/11/19
5290
你会用::before、::after吗 ::before和::after伪元素的用法
常见伪类——:hover,:link,:active,:target,:not(),:focus。
超然
2018/08/03
3.6K0
你会用::before、::after吗
		::before和::after伪元素的用法
推荐阅读
相关推荐
关于本博客皮肤样式配置
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验