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 相关文章推荐
javascript 哈希表(hashtable)的简单实现
Jan 20 Javascript
JSON传递bool类型数据的处理方式介绍
Sep 18 Javascript
jquery判断元素是否隐藏的多种方法
May 06 Javascript
JavaScript闭包函数访问外部变量的方法
Aug 27 Javascript
纯HTML5制作围住神经猫游戏-附源码下载
Aug 23 Javascript
关于获取DIV内部内容报错的原因分析及解决办法
Jan 29 Javascript
JavaScript代码因逗号不规范导致IE不兼容的问题
Feb 25 Javascript
JavaScript事件用法浅析
Oct 31 Javascript
解决vue打包css文件中背景图片的路径问题
Sep 03 Javascript
微信小程序实现侧边栏分类
Oct 21 Javascript
微信小程序云函数添加数据到数据库的方法
Mar 04 Javascript
vue配置型表格基于el-table拓展之table-plus组件
Apr 12 Vue.js
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
ADODB的数据库封包程序库
2006/12/31 PHP
屏蔽机器人从你的网站搜取email地址的php代码
2012/11/14 PHP
php实现压缩多个CSS与JS文件的方法
2014/11/11 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
2015/04/03 PHP
Zend Framework开发入门经典教程
2016/03/23 PHP
PHP5.5安装PHPRedis扩展及连接测试方法
2017/01/22 PHP
PHP中Static(静态)关键字功能与用法实例分析
2019/04/05 PHP
用javascript做拖动布局的思路
2008/05/31 Javascript
深入理解Javascript作用域与变量提升
2013/12/09 Javascript
字段太多jquey快速清空表单内容方法
2014/08/21 Javascript
jquery+html5时钟特效代码分享(可设置闹钟并且语音提醒)
2020/03/30 Javascript
jquery过滤特殊字符',防sql注入的实现方法
2016/08/17 Javascript
基于javascript的Form表单验证
2016/12/29 Javascript
Vue2 SSR渲染根据不同页面修改 meta
2017/11/20 Javascript
vue实现提示保存后退出的方法
2018/03/15 Javascript
jQuery+ajax读取json数据并按照价格排序示例
2018/03/28 jQuery
JS实现二维数组元素的排列组合运算简单示例
2019/01/28 Javascript
Node登录权限验证token验证实现的方法示例
2020/05/25 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
[07:49]2014DOTA2国际邀请赛 Newbee夺冠后采访xiao8坦言奖金会上交
2014/07/23 DOTA
[10:18]2018DOTA2国际邀请赛寻真——找回自信的TNCPredator
2018/08/13 DOTA
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
2016/03/30 Python
python 实时得到cpu和内存的使用情况方法
2018/06/11 Python
Python 字符串转换为整形和浮点类型的方法
2018/07/17 Python
Python3 列表,数组,矩阵的相互转换的方法示例
2019/08/05 Python
python实现快递价格查询系统
2020/03/03 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
2020/10/26 Python
在HTML5 canvas里用卷积核进行图像处理的方法
2018/05/02 HTML / CSS
Vans荷兰官方网站:美国南加州的原创极限运动潮牌
2018/01/23 全球购物
编程输出如下图形
2013/11/24 面试题
党小组鉴定意见
2015/06/02 职场文书
初中毕业感言300字
2015/07/31 职场文书
反四风问题学习心得体会
2016/01/22 职场文书
《思路决定出路》读后感3篇
2019/12/11 职场文书
纯html+css实现打字效果
2021/08/02 HTML / CSS
MySQL中datetime时间字段的四舍五入操作
2021/10/05 MySQL