jQuery图片轮播实现并封装(一)


Posted in Javascript onDecember 03, 2016

利用面向对象自己动手写了一个封装好的jquery轮播对象,可满足一般需求,需要使用时只需调用此对象的轮播方法即可。

demo:https://github.com/zsqosos/shopweb

具体代码如下:

HTML结构:

<div class="banner" id="J_bg_ban">
<ul>


<li><a href="#"><img src="banner_04.jpg" alt="广告图 /></a></li>


<li><a href="#"><img src="banner_04.jpg" alt="广告图 /></a></li>


<li><a href="#"><img src="banner_03.jpg" alt="广告图"/></a></li>


<li><a href="#"><img src="banner_04.jpg" alt="广告图"/></a></li>


<li><a href="#"><img src="banner_05.jpg" alt="广告图"/></a></li>

</ul>

<div class="indicator" id="J_bg_indicator">

</div>

<div class="ban-btn clearfloat" id="J_bg_btn">


<a class="next-btn fr" href="javascript:">></a><a class="prev-btn fl" href="javascript:"><</a>

</div>
</div>

 css样式:

.banner {
 height: 325px;
 width: 812px;
 position: relative;
 overflow: hidden;
}
.banner ul li{
 position: absolute;
top: 0;

left: 0;
}
.banner ul li img{
 height: 325px;
 width: 812px;
 display: block;
}
.ban-btn{
 width: 100%;
 position: absolute;
 top: 136px;
 z-index: 2;
}
.ban-btn a{
 display: inline-block;
 height: 60px;
 width: 35px;
 background: rgba(180,180,180,0.5);
 font-size: 25px;
 text-align: center;
 line-height: 60px;
 color: #fff;
}
.ban-btn a:hover{
 background: rgba(100,100,100,0.5);
}
.indicator{
 width: 100%;
 position: absolute;
 text-align: center;
 bottom: 15px;
 z-index: 2;
}
.indicator a{
 display: inline-block;
 width: 20px;
 height: 5px;
 margin:0 3px;
 background: #fff;
}
.indicator-active{
 background: #FF8C00!important;
}

jquery代码:

$.carousel = {
 now : 0,     //当前显示的图片索引
 hasStarted : false,   //是否开始轮播
 interval : null,   //定时器
 liItems : null,    //要轮播的li元素集合
 len : 0,     //liItems的长度
 aBox : null,    //包含指示器的dom对象
 bBox : null,    //包含前后按钮的dom对象

 /**
  * 初始化及控制函数
  * @param bannnerBox string 包含整个轮播图盒子的id或class
  * @param aBox string 包含指示器的盒子的id或class
  * @param btnBox string 包含前后按钮的盒子的id或class
  */
 startPlay : function(bannnerBox,aBox,btnBox) {
  //初始化对象参数
  var that = this;
  this.liItems = $(bannnerBox).find('ul').find('li');
  this.len = this.liItems.length;
  this.aBox = $(bannnerBox).find(aBox);
  this.bBox = $(bannnerBox).find(btnBox);
  //让第一张图片显示,根据轮播图数量动态创建指示器,并让第一个指示器处于激活状态,隐藏前后按钮
  this.liItems.first('li').css({'opacity': 1, 'z-index': 1}).siblings('li').css({'opacity': 0, 'z-index': 0});
  var aDom = '';
  for (var i = 0; i < this.len; i++){
   aDom += '<a></a>';
  }
  $(aDom).appendTo(this.aBox);
  this.aBox.find('a:first').addClass("imgnum-active");
  this.bBox.hide();
  //鼠标移入banner图时,停止轮播并显示前后按钮,移出时开始轮播并隐藏前后按钮
  $(bannnerBox).hover(function (){
   that.stop();
   that.bBox.fadeIn(200);
  }, function (){
   that.start();
   that.bBox.fadeOut(200);
  });
  //鼠标移入指示器时,显示对应图片,移出时继续播放
  this.aBox.find('a').hover(function (){
   that.stop();
   var out = that.aBox.find('a').filter('.indicator-active').index();
   that.now = $(this).index();
   if(out!=that.now) {
    that.play(out, that.now)
   }
  }, function (){
   that.start();
  });
  //点击左右按钮时显示上一张或下一张
  $(btnBox).find('a:first').click(function(){that.next()});
  $(btnBox).find('a:last').click(function(){that.prev()});
  //开始轮播
  this.start()
 },
 //前一张函数
 prev : function (){
  var out = this.now;
  this.now = (--this.now + this.len) % this.len;
  this.play(out, this.now);
 },
 //后一张函数
 next : function (){
  var out = this.now;
  this.now = ++this.now % this.len;
  this.play(out, this.now);
 },
 /**
  * 播放函数
  * @param out number 要消失的图片的索引值
  * @param now number 接下来要轮播的图的索引值
  */
 play : function (out, now){
  this.liItems.eq(out).stop().animate({opacity:0,'z-index':0},500).end().eq(now).stop().animate({opacity:1,'z-index':1},500);
  this.aBox.find('a').removeClass('imgnum-active').eq(now).addClass('indicator-active');
 },
 //开始函数
 start : function(){
  if(!this.hasStarted) {
   this.hasStarted = true;
   var that = this;
   this.interval = setInterval(function(){
    that.next();
   },2000);
  }
 },
 //停止函数
 stop : function (){
  clearInterval(this.interval);
  this.hasStarted = false;
 }
};

$(function(){
$.carsouel.startPlay('#J_bg_bn','#J_bg_indicator','#J_bg_btn');
})

最初实现时使用面向过程的方法来完成,虽然可以达到想要的效果,但代码复用性不高,需要为页面上每一个需要轮播的模块分别写对应的函数。进行封装后,不需要写太多的代码,使用时只需调用carsouel的startPlay方法并传入三个参数即可,大大提高了易用性。

但是,当前代码的缺陷也非常明显,就是当一个页面上同时有多个轮播件需要轮播时,只有最后一个会正常工作,这是由于carsouel对象只有一个,可以通过复制carsouel对象来解决这个问题,如:

var banner1 = $.extend(true,{},carousel);
 var banner2 = $.extend(true,{},carousel);
 var banner3 = $.extend(true,{},carousel);
 banner1.startPlay('#J_bg_ban1','#J_bg_indicator1','#J_bg_btn1');
 banner2.startPlay('#J_bg_ban2','#J_sm_indicator2','#J_bg_btn2');
 banner3.startPlay('#J_bg_ban3','#J_sm_indicator3','#J_bg_btn3');

这样虽然可以满足需求,但每次调用都会复制出一个新的对象,不仅影响性能,carsouel对象内的方法还不能够重用,所以还需要进一步改进。

要想让多个轮播件可以同时使用carsouel对象,并且可以复用carsouel对象内部的函数,必须将carsouel对象作为一个构造函数或原型对象,每次需要使用时在进行实例化操作,这样可满足多个轮播件同时使用的需求,同时做到最大化的函数复用。我会在后续的文章中解决这个问题,欢迎关注或提出指导。

我是一个javascript的初学者,这是我第一次发文,对于上述问题我会继续努力,寻求最好的解决方法。感谢你们看完。给自己说个加油吧。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
IE与FireFox中的childNodes区别
Oct 20 Javascript
jquery getScript动态加载JS方法改进详解
Nov 15 Javascript
JS 修改URL参数(实现代码)
Jul 08 Javascript
SeaJS入门教程系列之使用SeaJS(二)
Mar 03 Javascript
jquery easyui使用心得
Jul 07 Javascript
JS去除空格和换行的正则表达式(推荐)
Jun 14 Javascript
Bootstrap图片轮播组件Carousel使用方法详解
Oct 20 Javascript
实例分析浏览器中“JavaScript解析器”的工作原理
Dec 12 Javascript
JavaScript如何实现元素全排列实例代码
May 14 Javascript
JS利用prototype给类添加方法操作详解
Jun 21 Javascript
vue项目中常见问题及解决方案(推荐)
Oct 21 Javascript
高性能js数组去重(12种方法,史上最全)
Dec 21 Javascript
jQuery 选择符详细介绍及整理
Dec 02 #Javascript
JQuery 动态生成Table表格实例代码
Dec 02 #Javascript
jQuery实现背景滑动菜单
Dec 02 #Javascript
Angular2学习笔记——详解NgModule模块
Dec 02 #Javascript
Angular2学习笔记——详解路由器模型(Router)
Dec 02 #Javascript
基于jQuery实现的幻灯图片切换
Dec 02 #Javascript
JavaScript中清空数组的方法总结
Dec 02 #Javascript
You might like
smarty section简介与用法分析
2008/10/03 PHP
查找mysql字段中固定字符串并替换的几个方法
2012/09/23 PHP
javascript AutoScroller 函数类
2009/05/29 Javascript
复制小说文本时出现的随机乱码的去除方法
2010/09/07 Javascript
工作需要写的一个js拖拽组件
2011/07/28 Javascript
js通过地址栏给action传值(中文乱码全是问号)
2013/05/02 Javascript
JS截取字符串常用方法整理及使用示例
2013/10/18 Javascript
JS模式之单例模式基本用法
2015/06/30 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
2015/09/01 Javascript
JavaScript基本语法学习教程
2016/01/14 Javascript
jQuery.deferred对象使用详解
2016/03/18 Javascript
js实现select二级联动下拉菜单
2020/04/17 Javascript
微信小程序 网络API Websocket详解
2016/11/09 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
2016/11/18 Javascript
用JS编写一个函数,返回数组中重复出现过的元素(实例)
2017/09/14 Javascript
Javascript刷新页面的实例
2017/09/23 Javascript
取消Bootstrap的dropdown-menu点击默认关闭事件方法
2018/08/10 Javascript
spring+angular实现导出excel的实现代码
2019/02/27 Javascript
vue实现百度下拉列表交互操作示例
2019/03/12 Javascript
[01:02:45]完美世界DOTA2联赛 LBZS vs Forest 第三场 11.07
2020/11/09 DOTA
在Python的循环体中使用else语句的方法
2015/03/30 Python
Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法
2015/05/20 Python
python使用pymysql实现操作mysql
2016/09/13 Python
Python正则表达式匹配和提取IP地址
2019/06/06 Python
使用python创建生成动态链接库dll的方法
2020/05/09 Python
Pycharm操作Git及GitHub的步骤详解
2020/10/27 Python
python获取命令行参数实例方法讲解
2020/11/02 Python
美国办公用品购物网站:Quill.com
2016/09/01 全球购物
英国舒适型鞋履品牌:FitFlop
2017/05/17 全球购物
HTC VIVE美国官网:VR虚拟现实眼镜
2018/02/13 全球购物
计算机求职信
2013/12/01 职场文书
青奥会口号
2014/06/12 职场文书
校长一岗双责责任书
2015/05/09 职场文书
2019年最新七夕唯美祝福语(60条)
2019/07/22 职场文书
Python - 10行代码集2000张美女图
2021/05/23 Python
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
2021/06/30 SQL Server