摘要:點擊左箭頭判斷是否到邊緣最后給輪播圖添加自動播放功能,即利用定時器每秒觸發一次右箭頭的點擊事件。將返回的定時器保存到實例屬性中,以便在鼠標懸停的時候停止自動輪播。
??這是一個輪播圖組件,你可以直接下載使用,這里是代碼地址,需要傳入容器的id和圖片地址,支持Internet Explorer 10+、Firefox、Opera和Chrome等現代瀏覽器。這里是原文地址。
??之前寫一些功能或是特效都是寫在一個個函數里,可能因為我是由c語言入門編程,所以更傾向于面向過程的編程方式,沒有想過將一個模塊抽象成為對象,做成組件。但是由于嘗到了重復造輪子之苦。我決定將不可復用的代碼做成組件,提高編程效率。以下就是我做輪播圖組件的全部過程,由于是第一次寫組件,如果有哪里思維不對,或寫的方式有問題,還希望不吝賜教,共同學習。
??首先看一下如何使用這個組件,用到了font-awesome圖標庫,然后調用輪播圖的css,最后是用戶自己的css,用戶必須設置容器id以及容器寬高,否則無法正常顯示。生成輪播圖時給構造函數傳入容器元素,以及圖片地址:
輪播圖
??下邊我們看下具體實現。首先是輪播圖的構造函數:
function Carousel(obj) { this.wrap = obj.wrap; this.wrapId = obj.wrap.id; //容器的id this.wrapWidth = this.wrap.offsetWidth; //容器寬 this.imgNumber = obj.urlArr.length; //圖片數 this.activePage = 0; //輪播圖當前頁 this.settimeID; //定時器id this.init(obj.urlArr); }
??基本思路就是在構造函數里寫入輪播圖的實例屬性,不同的輪播圖具有不同的實例屬性,將其共同擁有的方法寫成原型屬性,完整代碼請到github上查看,喜歡的可以順手給個星。原型對象的基本結構如下所示:
Carousel.prototype = { constructor: Carousel, //構造函數指向原函數 init: function(urlArr){}, //構建DOM結構 bindEvent: function(){}, //綁定事件 pageActiveColor: function(){}, //繪制圓點 leftAngleclick: function(){}, //點擊左箭頭 rightAngleclick: function(){}, selectPage: function(selectNum){}, //點擊圓點定位到指定圖片 setTime: function(){}, //自動播放 clearTime: function(){} //鼠標懸浮取消自動播放 }
??建立dom結構的代碼如下,根據容器的id生成后代dom節點的id以及class,然后在css中使用[attribute$=value]選擇器對不同輪播圖使用同樣的樣式。而在代碼中也可以根據其容器id來區分不同輪播圖中的類似元素。因為要支持輪播圖寬度自適應,所以采用來百分比設置后代元素寬度。
init: function(urlArr) { //創建dom結構 this.wrap.style.position = "relative"; this.wrap.style.overflow = "hidden"; this.wrap.innerHTML = "
??創建的結構大體上如圖下所示:#id代表用戶定義的容器,生成一個#(id)_container的包裹元素,寬度是容器寬度的圖片張數倍,.(id)_img-item[n]的寬度和高度都等同于容器,圖片在各自的.(id)_img-item[n]里鋪滿。給容器定義屬性position: relative,通過設置了絕對定位的#(id)_container的left值來實現輪播。
??為左右箭頭以及下邊的小圓點添加事件,在鼠標移入輪播圖時停止自動播放,移出時設置自動播放。需要注意的是addEventListener的第二個參數必須是bind了this后的函數。因為調用環境自帶的函數會使this的綁定丟失,如果不清楚this的指向的話可以看這篇文章。
bindEvent: function() { //綁定事件 let preAngle = document.getElementById(this.wrapId + "_pre"); let nextAngle = document.getElementById(this.wrapId + "_next"); let pageUl = document.getElementById(this.wrapId + "_page"); let pages = pageUl.getElementsByClassName(this.wrapId + "_pagination"); for (let key = 0; key < pages.length; key++) { pages[key].addEventListener("click", this.selectPage.bind(this, key)); console.log(key); } this.wrap.addEventListener("mouseover", this.clearTime.bind(this)); this.wrap.addEventListener("mouseout", this.setTime.bind(this)); preAngle.addEventListener("click", this.leftAngleclick.bind(this)); nextAngle.addEventListener("click", this.rightAngleclick.bind(this)); }
??切換圖片的基本思路就是改變實例屬性中的當前頁這個變量,然后根據這個變量的值對包裹元素進行定位,再使對應的小圓點變色。下邊是點擊左箭頭觸發的函數,判斷如果處于邊緣就跳到最后。點擊右箭頭和下邊圓點的事件與之類似。
leftAngleclick: function() { //點擊左箭頭 let container = document.getElementById(this.wrapId + "_container"); if(this.activePage == 0) { //判斷是否到邊緣 this.activePage = this.imgNumber - 1; } else { this.activePage--; } container.style.left = "-" + this.activePage + "00%"; this.pageActiveColor(); }
??最后給輪播圖添加自動播放功能,即利用定時器每3秒觸發一次右箭頭的點擊事件。將返回的定時器保存到實例屬性中,以便在鼠標懸停的時候停止自動輪播。
setTime: function() { //自動播放 let wrapId = this.wrapId; //解決this綁定丟失 this.settimeID = setInterval(function() { document.getElementById(wrapId + "_next").click(); } , 3000); console.log("set"); }, clearTime: function() { //鼠標懸浮取消自動播放 let theId = this.settimeID; //解決this綁定丟失 console.log("clear"); clearInterval(theId); }
??到這輪播圖組件就算寫好了,這可以讓我們少寫很多代碼,而且可以在一個頁面中多次使用,不會污染到全局變量。缺陷在于這時的輪播圖還不能支持10張以上的圖片,因為考慮到這種需求并不是很多,就沒有寫10張以上的判斷條件,有需要時可以自行添加。有什么意見或建議歡迎留言。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/112347.html
摘要:點擊左箭頭判斷是否到邊緣最后給輪播圖添加自動播放功能,即利用定時器每秒觸發一次右箭頭的點擊事件。將返回的定時器保存到實例屬性中,以便在鼠標懸停的時候停止自動輪播。 ??這是一個輪播圖組件,你可以直接下載使用,這里是代碼地址,需要傳入容器的id和圖片地址,支持Internet Explorer 10+、Firefox、Opera和Chrome等現代瀏覽器。這里是原文地址。 ??之前寫一些...
摘要:寫好樣式,只需改變每張圖片的即可實現輪播效果。可以將輪播圖看成兩個,如圖所示寫好每個的樣式容器寬度容器高度大圖片寬度小圖片寬度小圖片高度模板包含兩個輪播圖部分,設置一個,定時改變。 原文地址:Bougie的博客 先展示最終效果:showImg(https://segmentfault.com/img/remote/1460000019061753);Vue的理念是以數據驅動視圖,所以拒...
摘要:寫好樣式,只需改變每張圖片的即可實現輪播效果。可以將輪播圖看成兩個,如圖所示寫好每個的樣式容器寬度容器高度大圖片寬度小圖片寬度小圖片高度模板包含兩個輪播圖部分,設置一個,定時改變。 原文地址:Bougie的博客 先展示最終效果:showImg(https://segmentfault.com/img/remote/1460000019061753);Vue的理念是以數據驅動視圖,所以拒...
摘要:寫好樣式,只需改變每張圖片的即可實現輪播效果。可以將輪播圖看成兩個,如圖所示寫好每個的樣式容器寬度容器高度大圖片寬度小圖片寬度小圖片高度模板包含兩個輪播圖部分,設置一個,定時改變。 原文地址:Bougie的博客 先展示最終效果:showImg(https://segmentfault.com/img/remote/1460000019061753);Vue的理念是以數據驅動視圖,所以拒...
閱讀 3701·2021-11-23 09:51
閱讀 1360·2021-11-10 14:35
閱讀 4007·2021-09-22 15:01
閱讀 1278·2021-08-19 11:12
閱讀 379·2019-08-30 15:53
閱讀 1690·2019-08-29 13:04
閱讀 3428·2019-08-29 12:52
閱讀 3054·2019-08-23 16:14