JS組件庫(kù)AlloyTouch實(shí)現(xiàn)圖片輪播過(guò)程解析
輪播圖也涉及到觸摸和觸摸反饋,同時(shí),AlloyTouch可以把慣性運(yùn)動(dòng)打開或者關(guān)閉,并且設(shè)置min和max為運(yùn)動(dòng)區(qū)域,超出會(huì)自動(dòng)回彈。
除了一般的豎向滾動(dòng),AlloyTouch也可以支持橫向滾動(dòng),甚至任何屬性的運(yùn)動(dòng),因?yàn)樗脑O(shè)計(jì)的本質(zhì)就是屬性無(wú)關(guān),觸摸可以反饋到任何屬性的運(yùn)動(dòng)。所以AlloyTouch制作各種各樣的輪播組件還是得心應(yīng)手。
第一種輪播圖如上圖所示。下面開始實(shí)現(xiàn)的過(guò)程。
第0秒
<div id="carousel-container"> <div class="carousel"> <div class="carousel-scroller" id="carousel-scroller"> <img style="width: 88%;" src="asset/ci1.jpg"> <img style="width: 88%;" src="asset/ci2.jpg"> <img style="width: 88%;" src="asset/ci3.jpg"> <img style="width: 88%;" src="asset/ci4.jpg"> <img style="width: 88%;" src="asset/ci5.jpg"> </div> </div> </div>
一共五張圖,每張圖占有屏幕比例的百分之88,所以用戶的屏幕里可以看到一張多一點(diǎn)的圖片,給用戶可以橫向滑動(dòng)查看的感覺(jué)。
第10秒
<script src="../transformjs/transform.js"></script> <script src="../alloy_touch.js"></script> <script> var scroller = document.querySelector("#carousel-scroller"); Transform(scroller); </script>
通過(guò)Transform(scroller); 注入CSS3 transform屬性。
第20秒
new AlloyTouch({ touch: "#carousel-container",//反饋觸摸的dom vertical: false,// 監(jiān)聽(tīng)用戶橫向觸摸 target: scroller, //運(yùn)動(dòng)的對(duì)象 property: "translateX", //被運(yùn)動(dòng)的屬性 min:0.88 * window.innerWidth * -5 + window.innerWidth, max: 0 })
這里最大的難點(diǎn)(其實(shí)也沒(méi)有什么難的),就是就是min的值。因?yàn)槌跏贾凳?,所有向左邊滑動(dòng)一定是負(fù)值??梢缘玫絤ax一定是0。
那么min的值就是: 屏幕的寬度-圖片的張數(shù)*圖片的寬度
- 圖片的寬度為0.88 * window.innerWidth
- 屏幕的寬度為window.innerWidth
- 圖片的張數(shù)為 5
第30秒
如上圖所示,相對(duì)于傳統(tǒng)的swipe然后再去觸發(fā)滾動(dòng),上面的跟手然后再去校正的體驗(yàn)是更加良好的。那么怎么實(shí)現(xiàn)呢?
首先,AlloyTouch是支持step配置。
new AlloyTouch({
step: 100,
...
...
...
})
只要用戶設(shè)置的step,最后運(yùn)動(dòng)結(jié)束之后,AlloyTouch都會(huì)幫用戶校正到最接近的step的整數(shù)倍的位置。
比如上面是100:
- 如果運(yùn)動(dòng)的對(duì)象停在 120,會(huì)被校正到100
- 如果運(yùn)動(dòng)的對(duì)象停在 151,會(huì)被校正到200
- 如果運(yùn)動(dòng)的對(duì)象停在 281,會(huì)被校正到300
- 如果運(yùn)動(dòng)的對(duì)象停在 21,會(huì)被校正到0
第40秒
當(dāng)然這有個(gè)問(wèn)題,比如用戶從0滑倒30,其實(shí)他是想去100,但是會(huì)被校正到0!!!
所以光使用校正是不夠。還需要一個(gè)API去阻止校正自己去注入邏輯滾動(dòng)相應(yīng)的位置。所以你必須支持AlloyTouch的:
to 方法
to(v [, time, easing])
其中time和easing不是必須。time的默認(rèn)值是600.
第50秒
var items = document.querySelectorAll("#nav a"); var scroller = document.querySelector("#carousel-scroller"); Transform(scroller); new AlloyTouch({ touch: "#carousel-container",//反饋觸摸的dom vertical: false,//不必需,默認(rèn)是true代表監(jiān)聽(tīng)豎直方向touch target: scroller, //運(yùn)動(dòng)的對(duì)象 property: "translateX", //被運(yùn)動(dòng)的屬性 min: window.innerWidth * -3, //不必需,運(yùn)動(dòng)屬性的最小值 max: 0, //不必需,滾動(dòng)屬性的最大值 step: window.innerWidth, inertia: false, //不必需,是否有慣性。默認(rèn)是true touchEnd: function (evt, v, index) { var step_v = index * this.step * -1; var dx = v - step_v; if (v < this.min) { this.to(this.min); } else if (v > this.max) { this.to(this.max); } else if (Math.abs(dx) < 30) { this.to(step_v); } else if (dx > 0) { this.to(step_v + this.step); } else { this.to(step_v - this.step); } return false; }, animationEnd: function (evt , v) { var i = 0, len = items.length; for (; i < len; i++) { if (i === this.currentPage) { items[i].classList.add("active"); } else { items[i].classList.remove("active"); } } } })
因?yàn)橐还菜膹垐D,所以
min得到的結(jié)果是 window.innerWidth * -3
max的值依然是0
step的值是 window.innerWidth
通過(guò)設(shè)置 inertia: false,把慣性運(yùn)動(dòng)關(guān)掉
注意看touchEnd里面的return false是為了不去計(jì)算手指離開屏幕后的校正位置、慣性運(yùn)動(dòng)等邏輯。
touchEnd可以拿到當(dāng)前的位置v以及當(dāng)前所處的位置index。
animationEnd是運(yùn)動(dòng)結(jié)束后的回調(diào),用來(lái)設(shè)置nav的active。當(dāng)然不是所有瀏覽器都支持classList,這里只是為了演示代碼足夠簡(jiǎn)潔。
再注意,在touchEnd和animationEnd中能拿到this,也就是AlloyTouch當(dāng)前對(duì)象的實(shí)例。其中,
to方法用來(lái)運(yùn)動(dòng)當(dāng)前對(duì)象
step是當(dāng)前的步長(zhǎng)
還可以拿到currentPage去獲取當(dāng)前所處的頁(yè)碼
還能拿到min和max值,得到運(yùn)動(dòng)的區(qū)間。
最后
所有例子演示和代碼可以在Github上找到。
Github:https://github.com/AlloyTeam/AlloyTouch
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JS實(shí)現(xiàn)數(shù)組去重復(fù)值的方法示例
這篇文章主要介紹了JS實(shí)現(xiàn)數(shù)組去重復(fù)值的方法,結(jié)合實(shí)例形式分析了JS通過(guò)數(shù)組遍歷、運(yùn)算等方法實(shí)現(xiàn)去重復(fù)值的操作技巧,需要的朋友可以參考下2017-02-02JavaScript函數(shù)節(jié)流和函數(shù)防抖之間的區(qū)別
本文主要介紹了JavaScript函數(shù)節(jié)流和函數(shù)防抖之間的區(qū)別。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02JavaScript如何實(shí)現(xiàn)防止重復(fù)的網(wǎng)絡(luò)請(qǐng)求的示例
這篇文章主要介紹了JavaScript如何實(shí)現(xiàn)防止重復(fù)的網(wǎng)絡(luò)請(qǐng)求的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01js/jQuery對(duì)象互轉(zhuǎn)(快速操作dom元素)
在操作js或者jquery方面相關(guān)的元素時(shí),可能會(huì)力不從心,因?yàn)樵谑褂梅椒〞r(shí)可能js的會(huì)更好一點(diǎn)又或者jquery的會(huì)更好一點(diǎn),真是無(wú)從選擇啊,接下來(lái)將介紹JS/jQuery對(duì)象互轉(zhuǎn)實(shí)現(xiàn),方便你快速操作dom元素,感興趣的朋友可以了解下啊2013-02-02JS刷新當(dāng)前頁(yè)面的幾種方法總結(jié)
本篇文章主要是對(duì)JS刷新當(dāng)前頁(yè)面的幾種方法進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-12-12JavaScript 實(shí)現(xiàn)類的多種方法實(shí)例
JavaScript 實(shí)現(xiàn)類的多種方法實(shí)例,需要的朋友可以參考一下2013-05-05微信小程序中時(shí)間戳和日期的相互轉(zhuǎn)換問(wèn)題
這篇文章主要介紹了微信小程序中時(shí)間戳和日期的相互轉(zhuǎn)換問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07ElementUI在實(shí)際項(xiàng)目使用步驟詳解
這篇文章主要介紹了ElementUI在實(shí)際項(xiàng)目使用的功能總結(jié),本文分步驟通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07