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 相关文章推荐
jQuery 使用手册(七)
Sep 23 Javascript
JQuery小知识
Oct 15 Javascript
JQuery入门—JQuery程序的代码风格详细介绍
Jan 03 Javascript
如何使用jQuery Draggable和Droppable实现拖拽功能
Jul 05 Javascript
Javascript字符串浏览器兼容问题分析
Dec 01 Javascript
jquery图片轮播特效代码分享
Apr 20 Javascript
jQuery中trigger()与bind()用法分析
Dec 18 Javascript
jQuery命名空间与闭包用法示例
Jan 12 Javascript
vue拦截器Vue.http.interceptors.push使用详解
Apr 22 Javascript
微信小程序实现点击按钮修改view标签背景颜色功能示例【附demo源码下载】
Dec 06 Javascript
axios发送post请求,提交图片类型表单数据方法
Mar 16 Javascript
微信小程序页面间跳转传参方式总结
Jun 13 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
php ss7.5的数据调用 (笔记)
2010/03/08 PHP
php把数组值转换成键的方法
2015/07/13 PHP
一个简单的php MVC留言本实例代码(必看篇)
2016/09/22 PHP
Yii框架分页实现方法详解
2017/05/20 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
Valerio 发布了 Mootools
2006/09/23 Javascript
记录几个javascript有关的小细节
2007/04/02 Javascript
JavaScript 入门·JavaScript 具有全范围的运算符
2007/10/01 Javascript
javascript 常用关键字列表集合
2007/12/04 Javascript
jQuery 相关控件的事件操作分解
2009/08/03 Javascript
鼠标滚轴控制文本框值的JS代码
2013/11/19 Javascript
js对图片base64编码字符串进行解码并输出图像示例
2014/03/17 Javascript
jQuery 取值、赋值的基本方法整理
2014/03/31 Javascript
sogou地图API用法实例教程
2014/09/11 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
2016/01/04 Javascript
JS优化与惰性载入函数实例分析
2017/04/06 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
深入理解React Native原生模块与JS模块通信的几种方式
2017/07/24 Javascript
React Native 集成jpush-react-native的示例代码
2017/08/16 Javascript
关于echarts在节点显示动态数据及添加提示文本所遇到的问题
2018/04/20 Javascript
AngularJS使用Filter自定义过滤器控制ng-repeat去除重复功能示例
2018/04/21 Javascript
vue项目中vue-i18n和element-ui国际化开发实现过程
2018/04/25 Javascript
jQuery实现表格隔行换色
2018/09/01 jQuery
Jquery $.map使用方法实例详解
2020/09/01 jQuery
python数据结构之图的实现方法
2015/07/08 Python
TensorFlow实现RNN循环神经网络
2018/02/28 Python
在tensorflow中设置保存checkpoint的最大数量实例
2020/01/21 Python
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
Camille Jewelry官网:现代女性时尚首饰
2019/07/07 全球购物
公司财务流程之主管工作流程
2014/03/03 职场文书
竞选班长的演讲稿
2014/04/24 职场文书
保安公司服务承诺书
2014/05/28 职场文书
大学生职业生涯十年规划书范文
2014/09/17 职场文书
查摆问题整改措施范文
2014/10/11 职场文书
CSS中Single Div 绘图技巧的实现
2021/06/18 HTML / CSS
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
2022/04/19 Java/Android