用jQuery实现轮播

本文的主要内容是使用jQuery实现轮播的思路及过程

1. 准备工作

首先准备好五张(随便几张只要不是一张就行)尺寸合适的图片,在html中用一个div表示视窗,其内用一个div放置准备好的图片。

<div class="viewport">
    <div class="images">
      <img src="https://i2.wp.com/waggintailacademy.com/wp-content/uploads/2016/10/Natural-Dog-Law-5-Dogs-are-social-pack-animals.jpg?fit=845%2C450" alt="" class="img1" width=400px>
      <img src="https://bullyfambamblog.files.wordpress.com/2017/03/top-rated-treats-featured-image.jpg?w=845&h=450&crop=1" alt="" class="img2" width=400px>
      <img src="https://pressraffles.files.wordpress.com/2017/02/picture11.png?w=845&h=450&crop=1" alt="" class="img3" width=400px>
      <img src="https://i0.wp.com/kcpetcollective.com/wp-content/uploads/2017/08/wesley_onelight_couch.png?resize=845%2C450&ssl=1" alt="" class="img4" width=400px>
      <img src="https://i0.wp.com/petperfectiontoowoomba.com/wp-content/uploads/2017/10/A-place-of-their-own-What-to-look-for-in-dog-beds-1.jpg?fit=845%2C450" alt="" class="img5" width=400px>
    </div>
  </div>
  <button id="button1">第1张</button>
  <button id="button2">第2张</button>
  <button id="button3">第3张</button>
  <button id="button4">第4张</button>
  <button id="button5">第5张</button>

这里为每张图片设置了合适的宽度,并且添加五个button方便选取。
然后为图片添加CSS:

.viewport {
  width: 400px;
  overflow: hidden;
}
.images {
  display: flex;
  align-items: flex-start;
}

添加完样式的效果如下图:


image

2. 添加JS

首先用简单的方式实现图片的切换效果:

$(button1).on('click', function(){
  $('.images').css({
    'margin-left': '0'
  })
})
$(button2).on('click', function(){
  $('.images').css({
    'margin-left': '-400px'
  })
})
$(button3).on('click', function(){
  $('.images').css({
    'margin-left': '-800px'
  })
})
$(button4).on('click', function(){
  $('.images').css({
    'margin-left': '-1200px'
  })
})
$(button5).on('click', function(){
  $('.images').css({
    'margin-left': '-1600px'
  })
})

这里通过JS在点击相应button的时候对 .imagemargin-left 属性进行修改,实现图片的切换效果。

3. 改进实现方式

上文中的实现方式虽然是最容易想到的方式,同时也可以完成点击按钮切换图片的功能,但是这种实现方式有很多不足之处,首先如果轮播的图片很多就需要写出很多的重复代码,其次这种简单的方法并不能实现无限轮播,因此我们采用另一种方式实现基本功能。

  <div class="buttons">
    <button id="button1">第1张</button>
    <button id="button2">第2张</button>
    <button id="button3">第3张</button>
    <button id="button4">第4张</button>
    <button id="button5">第5张</button>
  </div>

在html中用div将全部button包裹起来

let allButtons = $('.buttons > button')

for(let i = 0; i < allButtons.length; i++){
  $(allButtons[i]).on('click', function(e){
    let index = $(e.currentTarget).index()
    let distance = index * -400
    $('.images').css({
      'margin-left': distance + 'px'
    })
  })
}

在JS中通过jQuery选中元素并通过 .index() 确定被点击的button的下标,通过下标就可以确认images所需要移动的距离。

4. 实现自动播放

第三步中已经改进了切换图片的实现方式,不用担心轮播图片的数量,接下来实现自动播放功能。

let n = 0
setInterval(()=>{
  n += 1
  allButtons.eq(n%5).trigger('click')
}, 1500)

使用 setInterval 定时器,通过 .eq(n%5) 选中图片(分别为0,1,2,3,4,0,1,2,...),每隔1.5秒使用 trigger('click') 模拟click事件,由此来实现自动播放功能。

5. 优化自动播放

接上一步,虽然已经实现了自动播放的基本功能,但是仍有许多优化的空间。

let n = 0
let count = $('.images > img').length
allButtons.eq(n%count).trigger('click').addClass('active').siblings('.active').removeClass('active')
setInterval(()=>{
  n += 1
  allButtons.eq(n%count).trigger('click').addClass('active').siblings('.active').removeClass('active')
}, 1500)

声明一个count变量获取图片的数量,然后为当前展示的图片相应的button添加 active 样式并清除其他button的样式。

6. 实现暂停、播放功能

通常对于一个轮播来说,光标悬浮在图片上停止播放,光标离开图片继续播放是基本功能,因此此部分实现轮播的暂停、播放功能。

$('.viewport').on('mouseenter', function(){
  window.clearInterval(clockId)
})
$('.viewport').on('mouseleave', function(){
  clockId = setInterval(()=>{
    n += 1
    allButtons.eq(n%count).trigger('click').addClass('active').siblings('.active').removeClass('active')
}, 1500)
})

如此一来,一个简单的轮播就完成了。

7. 代码优化

上述的代码还有很多可以优化的空间,有很多重复的代码可以使用函数来封装。

let allButtons = $('.buttons > button')

for(let i = 0; i < allButtons.length; i++){
  $(allButtons[i]).on('click', function(e){
    let index = $(e.currentTarget).index()
    let distance = index * -400
    $('.images').css({
      'margin-left': distance + 'px'
    })
    n = index
    activeButton(allButtons.eq(n))
  })
}
let n = 0
let count = $('.images > img').length
slideImg(n%count)
let clockId = setClock()

function setClock(){
  return setInterval(()=>{
    n += 1
    slideImg(n%count)
  }, 1500)
}
function slideImg(index){
  allButtons.eq(index).trigger('click')
}
function activeButton($button){
  $button.addClass('active').siblings('.active').removeClass('active')
}

$('.viewport').on('mouseenter', function(){
  window.clearInterval(clockId)
})
$('.viewport').on('mouseleave', function(){
  clockId = setClock()
})

上面的代码已经进行了一部分优化,封装出 setClock() 函数、 slideImg() 函数和 activeButton 函数,避免了代码的重复。

8. 总结

本文使用jQuery实现轮播的思路如下:

  1. 首先找到对应的按钮,监听按钮的click事件,并添加相应的样式
  2. 设置一个定时器,使得图片循环滚动
  3. 使用trigger()模拟click事件
  4. 监听视窗的mouseenter事件,清除定时器,实现光标悬浮暂停播放功能
  5. 监听视窗的mouseleave事件,添加定时器,实现光标离开继续播放播放功能
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,413评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 昨天再好,也走不回去; 明天再难,也要抬脚继续。 没有人能烦恼你, 除非你拿别人的言行来烦恼自己; 没有放不下的事...
    心似温热海沙阅读 261评论 2 3
  • 节后的第一天异常的忙碌,疲倦,还是需要适应高强度的工作,既然选择了这样一条路,那越是艰辛,越坚持吧!其实也谈不上坚...
    凡人angel不烦人阅读 129评论 0 0
  • 写在最前面:这应该算是一篇真正的文章,是我在14年写的,那时我应该刚上高二,正处于一个对书籍如饥似渴的时候,自然才...
    YOOCharming阅读 211评论 0 0