摘要:輪播圖插件前言寫這個插件的原因前段時間準(zhǔn)備用加上網(wǎng)易云的接口,模擬網(wǎng)易云音樂移動端。目前主要實現(xiàn)了無縫輪播,自動播放,端左右按鈕點擊切換,移動端手勢滑動切換。
輪播圖插件(Broadcast.js) 前言:寫這個插件的原因
前段時間準(zhǔn)備用vue加上網(wǎng)易云的nodejs接口,模擬網(wǎng)易云音樂移動端。因為想自己寫一遍所有的代碼以及加固自己的flex布局,所以沒有使用UI組件。在輪播圖部分,本來在vue里面寫了一下,但是發(fā)現(xiàn)總是出現(xiàn)bug,所以后來準(zhǔn)備封裝一個插件來實現(xiàn)。
其次的一個原因是,以為這一學(xué)期學(xué)vue一直在用vue,發(fā)現(xiàn)自己以前學(xué)的原生js有點遺忘,所以想借這個機會再次復(fù)習(xí)一下js。
功能&介紹沒有引用第三方插件庫,原生js,封裝一個Broadcast對象,在此對象上展開,僅僅190多行代碼。
目前主要實現(xiàn)了:無縫輪播,自動播放,PC端左右按鈕點擊切換,移動端手勢滑動切換。
自己寫了一部分基礎(chǔ)的css樣式,可以再次的基礎(chǔ)上修改成自己喜歡的樣式。
展示界面&使用github地址: git倉庫地址
演示demo: 在線瀏覽地址
PC端展示:
?
移動端展示:
?
Usage 普通頁面引用復(fù)制github倉庫下面,src/js 文件下的 broadcast-me.js 放到自己項目文件中
復(fù)制github倉庫下面,src/css 文件下的 broadcast-me.css 放到自己項目文件中
在頁面中引入:
Document
在后面如果需要一個輪播圖,則實列化這個對象:
var box = document.getElementById("box"); var imagesAndUrl = [{ imgSrc : "./img/1.jpg", linkHref : "#" },{ imgSrc : "./img/2.jpg", linkHref : "1" },{ imgSrc : "./img/3.jpg", linkHref : "#" },{ imgSrc : "./img/4.jpg", linkHref : "#" },{ imgSrc : "./img/5.jpg", linkHref : "#" }]; // box => 你需要創(chuàng)建輪播圖的父級元素 // imagesAndUrl => 數(shù)組,存放圖片地址以及圖片的連接地址 var broadcast = new Broadcast(box,imagesAndUrl,{ transitionTime : 800, // 動畫過渡時間,默認(rèn)為800ms intervalTime : 5000 // 圖片切換時間,默認(rèn)為5s });VUE中引用
在vue中使用,在broadcast-me.js 文件最后加上:
// 向外界暴露Broadcas對象 module.exports = Broadcast;
在需要使用輪播的組件中,引入我們的文件
在模板文件中,采用自定義指令的方式,來插入我們的輪播圖
imgSrc : "./img/5.jpg", linkHref : "#" }
添加自定義指令:
directives:{ broadcast:{ inserted:function(el,binding) { // binding.value 為我們傳入的形參,即圖片的地址和圖片點擊鏈接 var broadcast = new Broadcast(el,binding.value,{ transitionTime : 800, // 動畫過渡時間,默認(rèn)為800ms intervalTime : 5000 // 圖片切換時間,默認(rèn)為5s }); } } }API
// 構(gòu)造的對象 new Broadcast (el,imagesAndUrl,JSON)
屬性 | 說明 | 備注備注 |
---|---|---|
el | 你需要創(chuàng)建輪播圖的包裹(父級)元素 | 不寫報錯 |
imagesAndUrl | 圖片的地址與圖片地址鏈接。數(shù)組對象 linkHref => 圖片點擊鏈接;imgSrc => 圖片地址 | 不寫報錯 |
JSON | transitionTime => 動畫過渡時間, intervalTime => 動畫切換時間 | 默認(rèn):過渡時間 => 800ms 切換時間 => 5s |
通過 el 的寬度,生成一個動態(tài)css加入到頁面當(dāng)中
// 動態(tài)添加一些css樣式 let cssStr = `.broadcastMe .broadcastMe-list {width: ${(this.imagesAndUrl.length+2)*this.el.clientWidth}px;}.broadcastMe .broadcastMe-list .broadcastMe-item {width:${this.el.clientWidth}px;}`; let styleNode = document.createElement("style"); styleNode.innerText = cssStr; document.head.appendChild(styleNode)
通過字符串模板的形式,生成我們需要的且符合無縫輪播的html字符串,加載el節(jié)點當(dāng)中。
通過:touchstart => touchmove => touchend 完成一個滑動的全過程,并在touchmove事件當(dāng)中,改變當(dāng)前的left值,并在touchend事件當(dāng)中判斷左右2邊的距離,進行翻頁還是不變。
// 移動端手指滑動 let stratPointX = 0; let offsetX = 0; this.el.addEventListener("touchstart", (e) => { stratPointX = e.changedTouches[0].pageX; offsetX = this.broadcastMeList.offsetLeft; this.animationMark = true; }) this.el.addEventListener("touchmove", (e) => { let disX = e.changedTouches[0].pageX - stratPointX; let left = offsetX + disX; this.broadcastMeList.style.transitionProperty = "none"; this.broadcastMeList.style.left = left + "px"; }) this.el.addEventListener("touchend", () => { let left = this.broadcastMeList.offsetLeft; // 判斷正在滾動的圖片距離左右圖片的遠近, this.index = Math.round(-left/this.el.clientWidth); this.animationMark = false; this.render(); })
Broadcast.prototype.render = function () { // 防抖控制 if(this.animationMark) return; this.animationMark = true; // 修改broadcastMeList 的left值 this.broadcastMeList.style.left = (-1)*this.el.clientWidth*this.index + "px"; this.broadcastMeList.style.transition = "left " + this.timer/1000 + "s"; setTimeout(() => { // 添加判斷,防止出界 if(this.index <= 0){ // 無縫輪播,修改真實的left值,取消transition,造成視覺錯誤 this.broadcastMeList.style.transitionProperty = "none"; this.index = this.imagesAndUrl.length; this.broadcastMeList.style.left = (-1)*this.el.clientWidth*this.index + "px"; }else if (this.index > this.imagesAndUrl.length){ this.broadcastMeList.style.transitionProperty = "none"; this.index = 1; this.broadcastMeList.style.left = (-1)*this.el.clientWidth*this.index + "px"; } this.animationMark = false; },this.timer) this.renderSpot(); }最后
因為才疏學(xué)淺,代碼才剛剛寫完,測試較少,很多bug還未發(fā)現(xiàn),如果發(fā)現(xiàn)問題,歡迎留言指出,敬請斧正。謝謝!!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/54571.html
摘要:輪播圖插件前言寫這個插件的原因前段時間準(zhǔn)備用加上網(wǎng)易云的接口,模擬網(wǎng)易云音樂移動端。目前主要實現(xiàn)了無縫輪播,自動播放,端左右按鈕點擊切換,移動端手勢滑動切換。 輪播圖插件(Broadcast.js) 前言:寫這個插件的原因 前段時間準(zhǔn)備用vue加上網(wǎng)易云的nodejs接口,模擬網(wǎng)易云音樂移動端。因為想自己寫一遍所有的代碼以及加固自己的flex布局,所以沒有使用UI組件。在輪播圖部分,...
摘要:輪播圖插件前言寫這個插件的原因前段時間準(zhǔn)備用加上網(wǎng)易云的接口,模擬網(wǎng)易云音樂移動端。目前主要實現(xiàn)了無縫輪播,自動播放,端左右按鈕點擊切換,移動端手勢滑動切換。 輪播圖插件(Broadcast.js) 前言:寫這個插件的原因 前段時間準(zhǔn)備用vue加上網(wǎng)易云的nodejs接口,模擬網(wǎng)易云音樂移動端。因為想自己寫一遍所有的代碼以及加固自己的flex布局,所以沒有使用UI組件。在輪播圖部分,...
vue-swiper 基于 Vue2.0 開發(fā),基本滿足大部分功能 輕量、高性能輪播插件。目前支持 無縫銜接自動輪播、無限輪播、手勢輪播 沒有引入第三方庫,原生 js 封裝,打包之后只有 8.2KB 大小 性能還是杠杠滴 demo showImg(https://segmentfault.com/img/remote/1460000012630045?w=280&h=280); ? 覺得好用給...
摘要:綁定輪播事件然后是鼠標(biāo)移入移出事件的綁定鼠標(biāo)移入移出事件移入時停止輪播播放的定時器,移出后自動開始下一張的播放。 通過上一篇文章的學(xué)習(xí),我們基本掌握了一個輪子的封裝和開發(fā)流程。那么這次將帶大家開發(fā)一個更有難度的項目——輪播圖,希望能進一步加深大家對于面向?qū)ο蟛寮_發(fā)的理解和認(rèn)識。 So, Lets begin! 目前項目使用 ES5及UMD 規(guī)范封裝,所以在前端暫時只支持標(biāo)簽的引入方式...
閱讀 1985·2021-11-22 14:45
閱讀 2592·2021-10-12 10:11
閱讀 767·2021-09-22 10:02
閱讀 1196·2019-08-30 15:55
閱讀 1141·2019-08-30 15:54
閱讀 3247·2019-08-30 15:54
閱讀 1180·2019-08-29 17:16
閱讀 3080·2019-08-28 17:55