利用純js + transition動(dòng)畫實(shí)現(xiàn)移動(dòng)端web輪播圖詳解
前言
在上一篇文章中,我們使用 tween算法實(shí)現(xiàn)了 ease-out移動(dòng)效果, 其實(shí)更簡(jiǎn)潔的方法是使用 css3的 transition動(dòng)畫,下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。
核心點(diǎn):
在 我們通過(guò)代碼來(lái)移動(dòng)一段距離的時(shí)候, 使用 transion動(dòng)畫;在手指移動(dòng)的時(shí)候,不使用transition動(dòng)畫.
使用 transition實(shí)現(xiàn)的動(dòng)畫效果的輪播圖js代碼不足100行
~function () { var lastPX = 0; // 上一次觸摸的位置x坐標(biāo), 需要計(jì)算出手指每次移動(dòng)的一點(diǎn)點(diǎn)距離 var movex = 0; // 記錄手指move的x方向值 var imgWrap = document.getElementById('imgWrap'); var startX = 0; // 開始觸摸時(shí)手指所在x坐標(biāo) var endX = 0; // 觸摸結(jié)束時(shí)手指所在的x坐標(biāo)位置 var imgSize = imgWrap.children.length - 2; // 圖片個(gè)數(shù) var t1 = 0; // 記錄開始觸摸的時(shí)刻 var t2 = 0; // 記錄結(jié)束觸摸的時(shí)刻 var width = window.innerWidth; // 當(dāng)前窗口寬度 var nodeList = document.querySelectorAll('#imgWrap img'); // 所有輪播圖節(jié)點(diǎn)數(shù)組 NodeList // 給圖片設(shè)置合適的left值, 注意 querySelectorAll返回 NodeList, 具有 forEach方法 nodeList.forEach(function (node, index) { node.style.left = (index - 1) * width + 'px'; }); /** * 移動(dòng)圖片到當(dāng)前的 tIndex索引所在位置 * @param {number} tIndex 要顯示的圖片的索引 * */ function toIndex(tIndex) { var dis = -(tIndex * width); // 動(dòng)畫移動(dòng) imgWrap.style.transform = 'translate3d(' + dis + 'px, 0, 0)'; imgWrap.style.transition = 'transform .2s ease-out'; movex = dis; // 索引到最后一張圖片, 迅速切換索引到同一張圖的初始位置 setTimeout(function () { if (tIndex === imgSize) { imgWrap.style.transform = 'translate3d(0, 0, 0)'; imgWrap.style.transition = 'none'; movex = 0; } if (tIndex === -1) { imgWrap.style.transform = 'translate3d(' + width * (1 - imgSize) + 'px, 0, 0)'; imgWrap.style.transition = 'none'; movex = -width * (imgSize - 1); } }, 200); } /** * 處理各種觸摸事件 ,包括 touchstart, touchend, touchmove, touchcancel * @param {Event} evt 回調(diào)函數(shù)中系統(tǒng)傳回的 js 事件對(duì)象 * */ function touch(evt) { var touch = evt.targetTouches[0]; var tar = evt.target; var index = parseInt(tar.getAttribute('data-index')); if (evt.type === 'touchmove') { var di = parseInt(touch.pageX - lastPX); endX = touch.pageX; movex += di; imgWrap.style.webkitTransform = 'translate3d(' + movex + 'px, 0, 0)'; imgWrap.style.transition = 'none'; // 移動(dòng)時(shí)避免動(dòng)畫延遲 lastPX = touch.pageX; } if (evt.type === 'touchend') { var minus = endX - startX; t2 = new Date().getTime() - t1; if (Math.abs(minus) > 0) { // 有拖動(dòng)操作 if (Math.abs(minus) < width * 0.4 && t2 > 500) { // 拖動(dòng)距離不夠,返回! toIndex(index); } else { // 超過(guò)一半,看方向 console.log(minus); if (Math.abs(minus) < 20) { console.log('距離很短' + minus); toIndex(index); return; } if (minus < 0) { // endX < startX,向左滑動(dòng),是下一張 toIndex(index + 1) } else { // endX > startX ,向右滑動(dòng), 是上一張 toIndex(index - 1) } } } else { //沒(méi)有拖動(dòng)操作 } } if (evt.type === 'touchstart') { lastPX = touch.pageX; startX = lastPX; endX = startX; t1 = new Date().getTime(); } return false; } imgWrap.addEventListener('touchstart', touch, false); imgWrap.addEventListener('touchmove', touch, false); imgWrap.addEventListener('touchend', touch, false); imgWrap.addEventListener('touchcancel', touch, false); }();
注意事項(xiàng):
當(dāng)切換到邊界值的圖時(shí),應(yīng)該等到切換動(dòng)畫效果之后再換到相同圖內(nèi)容的位置
所以: 我們使用setTimeout延遲執(zhí)行 無(wú)限循環(huán)播放替換圖位置的操作
至于 css 和 html嘛, 還是原來(lái)的配方, 還是原來(lái)的味道~參見(jiàn)這篇文章:http://www.dbjr.com.cn/article/123303.htm
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- js實(shí)現(xiàn)移動(dòng)端輪播圖滑動(dòng)切換
- javascript實(shí)現(xiàn)移動(dòng)端輪播圖
- 原生js實(shí)現(xiàn)移動(dòng)端Touch輪播圖的方法步驟
- js實(shí)現(xiàn)移動(dòng)端輪播圖
- JS實(shí)現(xiàn)點(diǎn)擊拉拽輪播圖pc端移動(dòng)端適配
- js原生實(shí)現(xiàn)移動(dòng)端手指滑動(dòng)輪播圖效果的示例
- js實(shí)現(xiàn)移動(dòng)端輪播圖效果
- 支持移動(dòng)端原生js輪播圖
- JS仿京東移動(dòng)端手指撥動(dòng)切換輪播圖效果
- 基于javascript實(shí)現(xiàn)移動(dòng)端輪播圖效果
相關(guān)文章
B/S開發(fā)中常用javaScript技術(shù)與代碼
B/S開發(fā)中常用javaScript技術(shù)與代碼...2007-03-03JS+CSS實(shí)現(xiàn)帶關(guān)閉按鈕DIV彈出窗口的方法
這篇文章主要介紹了JS+CSS實(shí)現(xiàn)帶關(guān)閉按鈕DIV彈出窗口的方法,實(shí)例分析了div彈出層窗口的實(shí)現(xiàn)技巧,非常具有實(shí)用價(jià)值,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02在chrome中window.onload事件的一些問(wèn)題
在寫一些關(guān)于圖片操作的代碼的時(shí)候,一般都需要在圖片加載完成之后再執(zhí)行程序。然而在Chorme中(貌似Safari也是)對(duì)window.onload的理解與IE和FF有偏差。2010-03-03用Javascript檢查Adobe PDF插件是否安裝的實(shí)現(xiàn)代碼
用Javascript檢查Adobe PDF插件是否安裝的代碼2009-12-12input 禁止輸入特殊字符的四種實(shí)現(xiàn)方式
某些特殊字符傳入后臺(tái)會(huì)產(chǎn)生錯(cuò)誤,可能導(dǎo)致sql注入,所以要想法從根本上攔截,接下來(lái)通過(guò)本文給大家介紹input 禁止輸入特殊字符的方式,對(duì)input 禁止特殊字符知識(shí)感興趣的朋友一起看下吧2016-08-08javascript 簡(jiǎn)練的幾個(gè)函數(shù)
看CSDN上別人的代碼,感覺(jué)比較精煉,拿來(lái)主義,需要的朋友可以看下。2009-08-08微信小程序使用this.setData()遇到的問(wèn)題及解決方案詳解
this.setData估計(jì)是小程序中最經(jīng)常用到的一個(gè)方法,但是要注意其實(shí)他是有限制的,忽略這些限制的話,會(huì)導(dǎo)致數(shù)據(jù)無(wú)法更新,下面這篇文章主要給大家介紹了關(guān)于微信小程序使用this.setData()遇到的問(wèn)題及解決方案,需要的朋友可以參考下2022-08-08