jQuery圖片輪播實現(xiàn)并封裝(一)
利用面向對象自己動手寫了一個封裝好的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對象 /** * 初始化及控制函數(shù) * @param bannnerBox string 包含整個輪播圖盒子的id或class * @param aBox string 包含指示器的盒子的id或class * @param btnBox string 包含前后按鈕的盒子的id或class */ startPlay : function(bannnerBox,aBox,btnBox) { //初始化對象參數(shù) 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); //讓第一張圖片顯示,根據(jù)輪播圖數(shù)量動態(tài)創(chuàng)建指示器,并讓第一個指示器處于激活狀態(tài),隱藏前后按鈕 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); }); //鼠標移入指示器時,顯示對應圖片,移出時繼續(xù)播放 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() }, //前一張函數(shù) prev : function (){ var out = this.now; this.now = (--this.now + this.len) % this.len; this.play(out, this.now); }, //后一張函數(shù) next : function (){ var out = this.now; this.now = ++this.now % this.len; this.play(out, this.now); }, /** * 播放函數(shù) * @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'); }, //開始函數(shù) start : function(){ if(!this.hasStarted) { this.hasStarted = true; var that = this; this.interval = setInterval(function(){ that.next(); },2000); } }, //停止函數(shù) stop : function (){ clearInterval(this.interval); this.hasStarted = false; } }; $(function(){ $.carsouel.startPlay('#J_bg_bn','#J_bg_indicator','#J_bg_btn'); })
最初實現(xiàn)時使用面向過程的方法來完成,雖然可以達到想要的效果,但代碼復用性不高,需要為頁面上每一個需要輪播的模塊分別寫對應的函數(shù)。進行封裝后,不需要寫太多的代碼,使用時只需調用carsouel的startPlay方法并傳入三個參數(shù)即可,大大提高了易用性。
但是,當前代碼的缺陷也非常明顯,就是當一個頁面上同時有多個輪播件需要輪播時,只有最后一個會正常工作,這是由于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對象內(nèi)的方法還不能夠重用,所以還需要進一步改進。
要想讓多個輪播件可以同時使用carsouel對象,并且可以復用carsouel對象內(nèi)部的函數(shù),必須將carsouel對象作為一個構造函數(shù)或原型對象,每次需要使用時在進行實例化操作,這樣可滿足多個輪播件同時使用的需求,同時做到最大化的函數(shù)復用。我會在后續(xù)的文章中解決這個問題,歡迎關注或提出指導。
我是一個javascript的初學者,這是我第一次發(fā)文,對于上述問題我會繼續(xù)努力,尋求最好的解決方法。感謝你們看完。給自己說個加油吧。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
jquery實現(xiàn)鼠標拖拽滑動效果來選擇數(shù)字的方法
這篇文章主要介紹了jquery實現(xiàn)鼠標拖拽滑動效果來選擇數(shù)字的方法,涉及jQuery鼠標事件的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-05-05以jQuery中$.Deferred對象為例講解promise對象是如何處理異步問題
Promises是一種令代碼異步行為更加優(yōu)雅的抽象,它很有可能是JavaScript的下一個編程范式,一個Promise即表示任務結果,無論該任務是否完成。本文以jQuery中$.Deferred對象為例講解promise對象是如何處理異步問題,需要的朋友參考下2015-11-11jQuery實現(xiàn)鼠標單擊網(wǎng)頁文字后在文本框顯示的方法
這篇文章主要介紹了jQuery實現(xiàn)鼠標單擊網(wǎng)頁文字后在文本框顯示的方法,可實現(xiàn)鼠標點擊上方文字即可在下方勾選處文本框顯示對應文字的效果,涉及jQuery鼠標事件及鏈式操作的相關技巧,需要的朋友可以參考下2015-05-05Jquery promise實現(xiàn)一張一張加載圖片
通過jquery promise實現(xiàn)一張一張的連續(xù)圖片的加載功能,當圖片加載錯誤,超時后會顯示加載圖片加載失敗。對jquery promise實現(xiàn)加載圖片的相關資料感興趣的朋友參考下2015-11-11