摘要:原生寫的輪播兼容移動(dòng)端插件,支持輪播速度,輪播內(nèi)容,輪播間隔,手勢靈敏度自定義,導(dǎo)航圓點(diǎn)點(diǎn)擊跳轉(zhuǎn)手勢滑動(dòng)。使用說明文件包含小部分語法編寫的文件,在移動(dòng)端有兼容性問題,僅供于源碼參考。移動(dòng)端跟端開發(fā)引用文件直接下載進(jìn)行引入使用。
slide.js
原生js寫的輪播兼容 pc+移動(dòng)端 插件,支持輪播速度,輪播內(nèi)容,輪播間隔,手勢靈敏度自定義,導(dǎo)航圓點(diǎn)點(diǎn)擊跳轉(zhuǎn),手勢滑動(dòng)。
使用說明:slide.js文件包含小部分es6語法編寫的文件,在移動(dòng)端有兼容性問題,僅供于源碼參考。移動(dòng)端跟pc端開發(fā)引用js文件直接下載slide-es5.js進(jìn)行引入使用。
html代碼
必須需要設(shè)置:包裹元素的id,以及高度跟寬度
包裹元素下面需要跟隨一個(gè)div,div下面是帶有class屬性為slide-item的任意元素
js代碼:
//需要先引入插件
//第一個(gè)參數(shù)是設(shè)置了輪播的包裹元素的id,是必須參數(shù)
//第二個(gè)參數(shù)是輪播間隔,非必須參數(shù),默認(rèn)為3000ms
//第三個(gè)參數(shù)是輪播速度, 非必須參數(shù),默認(rèn)為1,數(shù)值越大輪播速度越快
//第四個(gè)參數(shù)是手指滑動(dòng)靈敏度,非必須參數(shù),默認(rèn)為20,數(shù)值越大需要滑動(dòng)觸發(fā)的距離就越大
這是上面代碼的slide Demo
廢話不多說,下面實(shí)現(xiàn)代碼跟注釋說明
(function () { let Slide = function ( slideId = "slide", timeOut = 3000, speed = 0.1, d = 20 ) { this.d = d;//滑動(dòng)靈敏度 this.timeOut = timeOut;//輪播間隔 this.slide = document.querySelector("#slide"); //獲取視窗層 this.room = this.slide.querySelector("div"); //獲取內(nèi)容層 this.imgs = [...this.slide.querySelectorAll(".slide-item")]; //輪播圖元素組 this.slideWidth = parseInt(getComputedStyle(this.slide).width); //視窗層高度 this.slideHeight = parseInt(getComputedStyle(this.slide).height); //視窗層寬度 this.startPoint = null; //手指觸摸的起點(diǎn) this.navButtons = null; //獲取到所有的導(dǎo)航圓點(diǎn) this.timer = null; //定時(shí)器 this.imgIndex = 1; //當(dāng)前輪播圖片index this.prev = null; //上一個(gè) this.next = null; //下一個(gè) this.speed = -(this.slideWidth / 10 * speed); //動(dòng)畫速度 this.resetCss(); //初始化css樣式 this.resetAll(); //初始化設(shè)置 this.imgs.forEach((el) => { el.style.height = `${this.slideHeight}px`; el.style.width = `${this.slideWidth}px`; }); //使圖片的寬度跟視窗層一樣 this.autoStart = setInterval(() => { this.nextItem() }, timeOut); //輪播間隔定時(shí)器 for (let i = 0; i < this.navButtons.length; i++) { this.navButtons[i].onclick = this.navButtonClick.bind(this); } //綁定導(dǎo)航圓點(diǎn)點(diǎn)擊事件 //綁定觸摸開始事件 this.slide.addEventListener("touchstart", this.touchstart.bind(this)); //綁定觸摸結(jié)束事件 this.slide.addEventListener("touchend", this.touchend.bind(this)); } //初始化樣式 Slide.prototype.resetCss = function () { let styleEle = document.createElement("style"); //創(chuàng)建style標(biāo)簽 let navLeft = this.slideWidth / 2 - this.imgs.length * 9; let navTop = this.slideHeight / 40; styleEle.innerHTML += ".slide{position:relative;overflow:hidden;font-size:0;}"; //舒適化slide視窗的樣式 styleEle.innerHTML += ".slide .room{position:absolute;}"; //初始化room內(nèi)容層的樣式 styleEle.innerHTML += ".slide .slide-item{display:inline-block;}"; //設(shè)置slide-item的樣式為內(nèi)聯(lián)塊級元素 styleEle.innerHTML += `.slide .nav{padding:0 4px;list-style:none;position:absolute;font-size:0px;bottom:${navTop}px;left:${navLeft}px;text-align:center;}`; styleEle.innerHTML += ".navButton{display:inline-block;margin:6px 4px;background:#fff;width:8px;height:8px;-moz-border-radius:8px;border-radius:8px;cursor:pointer;box-shadow:0 0 6px #bbb;}"; document.head.appendChild(styleEle); //插入標(biāo)簽 } Slide.prototype.resetAll = function () { this.slide.setAttribute("class", "slide"); //給slide元素增加class屬性 this.room.setAttribute("class", "room"); //給room元素增加class屬性 this.room.style.left = `0px`; //設(shè)置room的初始距離 this.room.style.width = `${this.slideWidth * (this.imgs.length)}px`; //設(shè)置內(nèi)容層的寬度 //創(chuàng)建導(dǎo)航圓點(diǎn)定位框 let nav = document.createElement("ul"); nav.id = "nav"; nav.setAttribute("class", "nav"); this.slide.appendChild(nav); for (let i = 0; i < this.imgs.length; i++) { let navButtonLi = document.createElement("li"); navButtonLi.setAttribute("class", "navButton"); navButtonLi.index = i + 1; nav.appendChild(navButtonLi); } this.navButtons = this.slide.querySelectorAll("li"); //獲取所有的li節(jié)點(diǎn) this.navButtons[0].style.background = "#333"; //初始化第一個(gè)圓點(diǎn)的顏色 } //切換下一個(gè)的函數(shù) Slide.prototype.nextItem = function () { //清除過度定時(shí)器 clearInterval(this.timer); //清除間隔播放定時(shí)器 clearInterval(this.autoStart); this.timer = setInterval(() => { let left = parseInt(this.room.style.left); if (this.imgIndex < this.imgs.length) { if (left > (-this.slideWidth * this.imgIndex)) { this.room.style.left = `${parseInt(this.room.style.left)+this.speed}px`; } else { clearInterval(this.timer); this.room.style.left = `${-this.slideWidth*this.imgIndex}px`; this.navButtons[this.imgIndex - 1].style.background = "#fff"; this.imgIndex++; this.navButtons[this.imgIndex - 1].style.background = "#333"; } } else { if (left < 0) { this.room.style.left = `${parseInt(this.room.style.left)+(-this.speed*2)}px`; } else { clearInterval(this.timer); this.room.left = "0"; this.navButtons[this.imgIndex - 1].style.background = "#fff"; this.imgIndex = 1; this.navButtons[this.imgIndex - 1].style.background = "#333"; } } }, 16.7); this.autoStart = setInterval(() => { this.nextItem() }, this.timeOut); } Slide.prototype.lastItem = function () { clearInterval(this.timer); clearInterval(this.autoStart); this.timer = setInterval(() => { let left = parseInt(this.room.style.left); if (this.imgIndex > 1) { if (left < (-this.slideWidth * (this.imgIndex - 2))) { this.room.style.left = `${parseInt(this.room.style.left)-this.speed}px`; } else { clearInterval(this.timer); this.room.style.left = `${-this.slideWidth*(this.imgIndex-2)}px`; this.navButtons[this.imgIndex - 1].style.background = "#fff"; this.imgIndex--; this.navButtons[this.imgIndex - 1].style.background = "#333"; } } else { if (left > -this.slideWidth * (this.imgs.length - 1)) { this.room.style.left = `${parseInt(this.room.style.left)+(this.speed*2)}px`; } else { clearInterval(this.timer); this.room.left = `${-this.slideWidth*this.imgs.length-1}px`; this.navButtons[this.imgIndex - 1].style.background = "#fff"; this.imgIndex = this.imgs.length; this.navButtons[this.imgIndex - 1].style.background = "#333"; } } }, 16.7); this.autoStart = setInterval(() => { this.nextItem() }, this.timeOut); } Slide.prototype.navButtonClick = function ({ target }) { clearInterval(this.autoStart); clearInterval(this.timer); this.timer = setInterval(() => { let left = parseInt(this.room.style.left); if (target.index > this.imgIndex) { if (left > -this.slideWidth * (target.index - 1)) { this.room.style.left = `${parseInt(this.room.style.left)+this.speed*(target.index-this.imgIndex)}px`; } else { clearInterval(this.timer); this.room.style.left = `${-(this.slideWidth)*(target.index-1)}px`; this.navButtonStyle(target); } } else if (target.index < this.imgIndex) { if (left < -this.slideWidth * (target.index - 1)) { this.room.style.left = `${parseInt(this.room.style.left) - this.speed * (this.imgIndex - target.index)}px`; } else { clearInterval(this.timer); this.room.style.left = `${(-this.slideWidth) * (target.index - 1)}px`; this.navButtonStyle(target); } } else { return false; } }, 16.7); this.autoStart = setInterval(() => { this.nextItem() }, this.timeOut); } //導(dǎo)航圓點(diǎn)點(diǎn)擊事件 Slide.prototype.navButtonStyle = function (target) { target.style.background = "#333"; this.navButtons[this.imgIndex - 1].style.background = "#fff"; this.imgIndex = target.index; } //手指觸摸起始觸發(fā)函數(shù) Slide.prototype.touchstart = function (e = window.event) { this.startPoint = e.touches[0]; } //手指觸摸結(jié)束觸發(fā)函數(shù) Slide.prototype.touchend = function (e = window.event) { let endPoint = e.changedTouches[0]; let x = endPoint.clientX - this.startPoint.clientX; let y = endPoint.clientY - this.startPoint.clientY; if (Math.abs(x) > this.d) { if (x < 0) { this.nextItem(); } else { this.lastItem(); } } } this.Slide = Slide; })();
使用說明以及源代碼后續(xù)的優(yōu)化,歡迎關(guān)注我的github 插件地址slide插件
歡迎評論以及留言,同時(shí)歡迎關(guān)注我的博客定時(shí)不斷地更新我的文章 陳建光的博客
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/94347.html
摘要:輪播圖插件前言寫這個(gè)插件的原因前段時(shí)間準(zhǔn)備用加上網(wǎng)易云的接口,模擬網(wǎng)易云音樂移動(dòng)端。目前主要實(shí)現(xiàn)了無縫輪播,自動(dòng)播放,端左右按鈕點(diǎn)擊切換,移動(dòng)端手勢滑動(dòng)切換。 輪播圖插件(Broadcast.js) 前言:寫這個(gè)插件的原因 前段時(shí)間準(zhǔn)備用vue加上網(wǎng)易云的nodejs接口,模擬網(wǎng)易云音樂移動(dòng)端。因?yàn)橄胱约簩懸槐樗械拇a以及加固自己的flex布局,所以沒有使用UI組件。在輪播圖部分,...
摘要:輪播圖插件前言寫這個(gè)插件的原因前段時(shí)間準(zhǔn)備用加上網(wǎng)易云的接口,模擬網(wǎng)易云音樂移動(dòng)端。目前主要實(shí)現(xiàn)了無縫輪播,自動(dòng)播放,端左右按鈕點(diǎn)擊切換,移動(dòng)端手勢滑動(dòng)切換。 輪播圖插件(Broadcast.js) 前言:寫這個(gè)插件的原因 前段時(shí)間準(zhǔn)備用vue加上網(wǎng)易云的nodejs接口,模擬網(wǎng)易云音樂移動(dòng)端。因?yàn)橄胱约簩懸槐樗械拇a以及加固自己的flex布局,所以沒有使用UI組件。在輪播圖部分,...
摘要:輪播圖插件前言寫這個(gè)插件的原因前段時(shí)間準(zhǔn)備用加上網(wǎng)易云的接口,模擬網(wǎng)易云音樂移動(dòng)端。目前主要實(shí)現(xiàn)了無縫輪播,自動(dòng)播放,端左右按鈕點(diǎn)擊切換,移動(dòng)端手勢滑動(dòng)切換。 輪播圖插件(Broadcast.js) 前言:寫這個(gè)插件的原因 前段時(shí)間準(zhǔn)備用vue加上網(wǎng)易云的nodejs接口,模擬網(wǎng)易云音樂移動(dòng)端。因?yàn)橄胱约簩懸槐樗械拇a以及加固自己的flex布局,所以沒有使用UI組件。在輪播圖部分,...
摘要:實(shí)戰(zhàn)之微信錢包騰訊服務(wù)界面網(wǎng)格布局是讓開發(fā)人員設(shè)計(jì)一個(gè)網(wǎng)格并將內(nèi)容放在這些網(wǎng)格內(nèi)。對于移動(dòng)端適配,不同的公司不同的團(tuán)隊(duì)有不同的解決方案。柵格系統(tǒng)用于處理頁面多終端適配的問題。 grid實(shí)戰(zhàn)之微信錢包 騰訊服務(wù)界面 CSS3網(wǎng)格布局是讓開發(fā)人員設(shè)計(jì)一個(gè)網(wǎng)格并將內(nèi)容放在這些網(wǎng)格內(nèi)。而不是使用浮動(dòng)制作一個(gè)網(wǎng)格,實(shí)際上是你將一個(gè)元素聲明為一個(gè)網(wǎng)格容器,并把元素內(nèi)容置于網(wǎng)格中。 移動(dòng)端頁面適配—...
摘要:也就是我們常見的瀏覽器以及內(nèi)置瀏覽器,比如微信打開的大型移動(dòng)端網(wǎng)頁。這個(gè)以微信小程序?yàn)槔饕俏⑿艌F(tuán)隊(duì)基于前端基礎(chǔ)來做的封裝語法,主要的還是語法。學(xué)習(xí)路線放一下給大家。前端開發(fā)學(xué)習(xí)不是單一的,內(nèi)容比較多,同樣應(yīng)用的場景也非常多。 近兩年來,前端開發(fā)工程師越來越火了,2019年已經(jīng)到來了,很多準(zhǔn)備入行前端開發(fā)工程師的小伙伴們,不知道準(zhǔn)備得怎么樣了呢?有的朋友在想方設(shè)法的學(xué)習(xí),爭取在年后...
閱讀 3968·2021-11-16 11:44
閱讀 5189·2021-10-09 09:54
閱讀 2031·2019-08-30 15:44
閱讀 1678·2019-08-29 17:22
閱讀 2753·2019-08-29 14:11
閱讀 3389·2019-08-26 13:25
閱讀 2324·2019-08-26 11:55
閱讀 1595·2019-08-26 10:37