写个简单的基于jq的轮播图插件
感觉自己一向都挺依赖插件的,基础也比较差,很少自己尝试写点什么,于是这次就写了这个,逻辑比较简单,功能比较单一,还有待改进~
1、首先写个面向过程的程序,后面再逐步改写成面向对象程序
css
1 2 3 4 5 6 7 8 | .slide{ width : 582px ; height : 248px ; position : relative ; margin : 20px auto 0 ; overflow : hidden ;} .slide .banner{ overflow : hidden ; position : absolute ; width : 582px ; height : 248px ; left : 0 ;} .slide ul li{ width : 582px ; height : 248px ; float : left ;} .slide ul li img{ width : 100% ; height : 100% ; border : none ;} .tab{ width : 100% ; height : 36px ; position : absolute ; left : 0 ; bottom : 0 ; background : rgba( 0 , 0 , 0 ,. 5 );} .tab ul{ overflow : hidden ; float : right ; margin : 12px 10px 0 0 ; } .tab ul li{ width : 12px ; height : 12px ; background : #fff ;border-radius: 50% ; margin-right : 5px ; cursor : pointer ; float : left ;} .tab ul li.cur{ background : #12BEFE ;} |
html
1 2 3 4 5 6 7 8 9 10 | < div class = "slide" id = "slide-box" > < ul class = "banner" > < li >< a href = "" >< img src = "img/1.jpg" alt = "" ></ a ></ li > < li >< a href = "" >< img src = "img/2.jpg" alt = "" ></ a ></ li > < li >< a href = "" >< img src = "img/3.jpg" alt = "" ></ a ></ li > < li >< a href = "" >< img src = "img/4.jpg" alt = "" ></ a ></ li > < li >< a href = "" >< img src = "img/5.jpg" alt = "" ></ a ></ li > </ ul > < div class = "tab" ></ div > </ div > |
js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | var Slide = function () { var $slideBox = $( '.slide-box' ), $banner = $slideBox.find( '.banner' ), $tab = $( '.tab' ), $tabLi = $tab.find( 'li' ), sWidth = $slideBox.width(), len = $banner.find( 'li' ).length, index = 0, timer = null , _html, init = function () { $banner.html($banner.html()+$banner.html()) $banner.width(sWidth * len*2); _html = '<li class="cur"></li>' ; for ( var i = 1; i < len; i++) { _html = _html + '<li></li>' } _html = '<ul>' + _html + '</ul>' ; $tab.append(_html); autoPlay() switchFn() bindEvent() } function bindEvent() { $tab.on( 'click' , 'li' , function () { switchFn($( this ).index()); index = $( this ).index(); }) $slideBox.hover( function () { clearInterval(timer) }, function () { autoPlay() }) } function autoPlay() { timer = setInterval( function () { index++; switchFn(index); if (index == len) {index = 0;} }, 2000) } function switchFn(index) { var nowLeft = -index * sWidth; $banner.stop().animate({ "left" : nowLeft }, function (){ if (index == len) { $banner.css( 'left' ,0) index = 0; } $( '.tab' ).find( 'li' ).eq(index).addClass( 'cur' ).siblings().removeClass( 'cur' ); }); } return { init: init }; }(); Slide.init(); //调用初始化函数 |
2、构造函数模式和原型模式组合使用
实例属性在构造函数中定义,方法在原型中定义。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | $( function () { new Slide({ 'obj' : '#slide-box' , 'interTime' : 2}); //创建实例1 new Slide({ 'obj' : '#slide-box2' , 'interTime' : 3}); //创建实例2 }) function Slide(param) { this .o = $(param.obj); this .oUl = this .o.find( '.banner' ); this .aLi = this .oUl.find( 'li' ); this .oTab = this .o.find( '.tab' ); this .timer = null ; //定时器 this .index = 0; //索引值 this .interTime = param.interTime * 1000; //自动切换的时间间隔,单位为秒 this .sWidth = this .o.width(); //轮播图容器宽度 this .len = this .aLi.length; //轮播图个数 this .init(); //调用初始化函数 } Slide.prototype = { init: function () { this .oUl.html( this .oUl.html() + this .oUl.html()); //轮播图个数复制一份 this .oUl.width( this .len * this .sWidth * 2); //轮播图片总宽度 var _html = '<li class="cur"></li>' ; for ( var i = 1; i < this .len; i++) { _html = _html + '<li></li>' } _html = '<ul>' + _html + '</ul>' ; this .oTab.append(_html); this .clickFn(); this .autoPlay(); this .isoverFn(); }, clickFn: function () { //点击切换 var _this = this ; this .oTab.on( 'click' , 'li' , function () { _this.switchFn($( this ).index()); _this.index = $( this ).index(); }); }, switchFn: function (index) { //图片和按钮切换 var nowLeft = -index * sWidth; $banner.stop().animate({ "left" : nowLeft }, function () { if (index == len) { $banner.css( 'left' , 0) index = 0; } _this.oTab.find( 'li' ).eq(index).addClass( 'cur' ).siblings().removeClass( 'cur' ); }); }, autoPlay: function () { //自动轮播 var _this = this ; this .timer = setInterval( function () { _this.index++; _this.switchFn(_this.index); if (_this.index == _this.len) { _this.index = 0; } }, this .interTime) }, isoverFn: function () { //鼠标移入轮播停止,移开则自动轮播 var _this = this ; this .o.hover( function () { clearInterval(_this.timer); }, function () { _this.autoPlay(); }); } } |
3、再改进一下,减少实例化时使用new 实例化对象
参考了一下小组文档的写法 javascript代码规范>>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | var Slide = function () { //定义单例 var _class = function (param) { //内部类 this .param = $.extend({ obj: null , interTime: null }, param) this .o = $(param.obj); this .oUl = this .o.find( '.banner' ); this .aLi = this .oUl.find( 'li' ); this .oTab = this .o.find( '.tab' ); this .aBtn = this .oTab.find( 'li' ); this .timer = null ; //定时器 this .index = 0; //索引值 this .interTime = param.interTime * 1000; //自动切换的时间间隔,单位为秒 this .sWidth = this .o.width(); //轮播图容器宽度 this .len = this .aLi.length; //轮播图个数 this .init(); //调用初始化函数 } _class.prototype = { //对象私有方法 init: function () { //对象初始化 this .oUl.html( this .oUl.html() + this .oUl.html()); //轮播图个数复制一份 this .oUl.width( this .len * this .sWidth * 2); //轮播图片总宽度 var _html = '<li class="cur"></li>' ; for ( var i = 1; i < this .len; i++) { _html = _html + '<li></li>' } _html = '<ul>' + _html + '</ul>' ; this .oTab.append(_html); this .clickFn(); this .autoPlay(); this .isoverFn(); }, clickFn: function () { //点击切换 var _this = this ; this .oTab.on( 'click' , 'li' , function () { _this.switchFn($( this ).index()); _this.index = $( this ).index(); }); }, switchFn: function (index) { //图片和按钮切换 var _this = this ; var nowLeft = - this .sWidth * index; this .oUl.stop().animate({ 'left' : nowLeft }, function () { if (index == _this.len) { _this.oUl.css( 'left' , 0); index = 0; } _this.oTab.find( 'li' ).eq(index).addClass( 'cur' ).siblings().removeClass( 'cur' ); }); }, autoPlay: function () { //自动轮播 var _this = this ; this .timer = setInterval( function () { _this.index++; _this.switchFn(_this.index); if (_this.index == _this.len) { _this.index = 0; } }, this .interTime) }, isoverFn: function () { //鼠标移入轮播停止,移开则自动轮播 var _this = this ; this .o.hover( function () { clearInterval(_this.timer); }, function () { _this.autoPlay(); }); } } return { create: function (param) { //提供给外部调用的方法,创建实例 return new _class(param); } } }(); var s1 = Slide.create({ //创建实例1 'obj' : '#slide-box' , 'interTime' : 2 }); var s2 = Slide.create({ //创建实例2 'obj' : '#slide-box2' , 'interTime' : 3 }); |
手机阅读请扫描下方二维码:
上一篇:记my官网改版遇到的自己挖的坑
下一篇:内网穿透ngrok工具快速启动bat
12345678

1
1
1
1
1
1
1
1
1
1
1
1
1
12345678

12345678

12345678

cmpaziusukmfvkxrbshx
12345678

12345678

12345678

12345678

12345678

1

1

1

1

1

1

1

1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1