国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > JS > 正文

利用純js + transition動畫實現(xiàn)移動端web輪播圖詳解

2024-05-06 16:39:39
字體:
來源:轉載
供稿:網(wǎng)友

前言

在上一篇文章中,我們使用 tween算法實現(xiàn)了 ease-out移動效果, 其實更簡潔的方法是使用 css3的 transition動畫,下面話不多說了,來一起看看詳細的介紹吧。

核心點:

在 我們通過代碼來移動一段距離的時候, 使用 transion動畫;在手指移動的時候,不使用transition動畫.

使用 transition實現(xiàn)的動畫效果的輪播圖js代碼不足100行

~function () {   var lastPX = 0; // 上一次觸摸的位置x坐標, 需要計算出手指每次移動的一點點距離   var movex = 0; // 記錄手指move的x方向值   var imgWrap = document.getElementById('imgWrap');   var startX = 0; // 開始觸摸時手指所在x坐標   var endX = 0; // 觸摸結束時手指所在的x坐標位置   var imgSize = imgWrap.children.length - 2; // 圖片個數(shù)   var t1 = 0; // 記錄開始觸摸的時刻   var t2 = 0; // 記錄結束觸摸的時刻   var width = window.innerWidth; // 當前窗口寬度   var nodeList = document.querySelectorAll('#imgWrap img'); // 所有輪播圖節(jié)點數(shù)組 NodeList    // 給圖片設置合適的left值, 注意 querySelectorAll返回 NodeList, 具有 forEach方法   nodeList.forEach(function (node, index) {    node.style.left = (index - 1) * width + 'px';   });    /**    * 移動圖片到當前的 tIndex索引所在位置    * @param {number} tIndex 要顯示的圖片的索引    * */   function toIndex(tIndex) {    var dis = -(tIndex * width);    // 動畫移動    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 回調函數(shù)中系統(tǒng)傳回的 js 事件對象    * */   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'; // 移動時避免動畫延遲     lastPX = touch.pageX;    }    if (evt.type === 'touchend') {     var minus = endX - startX;     t2 = new Date().getTime() - t1;     if (Math.abs(minus) > 0) { // 有拖動操作      if (Math.abs(minus) < width * 0.4 && t2 > 500) { // 拖動距離不夠,返回!       toIndex(index);      } else { // 超過一半,看方向       console.log(minus);       if (Math.abs(minus) < 20) {        console.log('距離很短' + minus);        toIndex(index);        return;       }       if (minus < 0) { // endX < startX,向左滑動,是下一張        toIndex(index + 1)       } else { // endX > startX ,向右滑動, 是上一張        toIndex(index - 1)       }      }     } else { //沒有拖動操作      }    }    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);   }(); 

注意事項:

當切換到邊界值的圖時,應該等到切換動畫效果之后再換到相同圖內容的位置

所以:   我們使用setTimeout延遲執(zhí)行 無限循環(huán)播放替換圖位置的操作

至于 css 和 html嘛, 還是原來的配方, 還是原來的味道~

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網(wǎng)的支持。

 



注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 南乐县| 修武县| 民勤县| 台前县| 惠水县| 南昌县| 太白县| 漠河县| 台州市| 义乌市| 福鼎市| 潼南县| 新民市| 栾城县| 白河县| 海口市| 夹江县| 永城市| 土默特左旗| 永吉县| 巴林左旗| 双辽市| 安宁市| 齐齐哈尔市| 东至县| 红原县| 揭东县| 平顺县| 神农架林区| 阳高县| 武川县| 新余市| 凤山县| 策勒县| 额济纳旗| 宝坻区| 贵南县| 宁陕县| 临海市| 广河县| 商丘市|