站長資訊網
        最全最豐富的資訊網站

        利用H5實現一個輪播器(觸屏版)的實例教程

        初入前端,分享一下手機上觸屏版輪播器的實現過程,大致功能如下:

        1. 支持循環滑動

        2. 寬度可任意設置,不需要與屏幕等寬

        3. 頁面可縱向滾動

        4. 可設置回調監聽元素的切換

        5. 純js,不借助任何第三方庫

        原理

        1. 假設子元素.itemwidth為375px,使用絕對定位將所有子元素放在父元素內

        2. 將父元素.carouselwidth設置為375px,與子元素.item寬度相同

        3. 為父元素.carousel添加觸摸事件:touchstart, touchmove, touchend

        4. 手指按下時,保存初始位置(clientX

        5. 手指滑動時,通過滑動距離判斷滑動的方向:

          1. 手指向左滑動,則同時移動當前元素和當前元素右邊的元素

          2. 手指向右滑動,則同時移動當前元素和當前元素左邊的元素

        6. 手指抬起時,通過滑動距離判斷是否切換到下一頁

          1. 移動距離未超過子元素寬度的50%,將當前頁面回滾到初始位置,不切換當前元素。

          2. 移動距離超過子元素寬度的50%,切換當前元素為下一個元素。

          3. 將當前元素的transform屬性設置為translate3d(0px, 0px, 0px),并將z-index屬性+1

          4. 將下一個子元素的transform屬性設置為translate3d(375px, 0px, 0px),并將z-index屬性+1

          5. 將上一個子元素的transform屬性設置為translate3d(-375px, 0px, 0px),并將z-index屬性+1

          6. 將其他所有子元素的z-index屬性設置為默認值

        7. 第一個子元素的上一個元素是最后一個元素,最后一個元素的下一個元素是第一個元素,該步驟通過循環鏈表實現。

        移動時設置的是子元素.item的transform屬性,而不是父元素.carousel

        實現步驟

        html&css

        //html  <p class="carousel" ontouchstart="" >      <p class="item" style="background: #3b76c0" >          <h3 >item-1</h3>      </p>      <p class="item" style="background: #58c03b;">          <h3>item-2</h3>      </p>      <p class="item" style="background: #c03b25;">          <h3>item-3</h3>    </p>     <p class="item" style="background: #e0a718;">        <h3>item-4</h3>      </p>      <p class="item" style="background: #c03eac;">          <h3>item-5</h3>      </p>  </p>    //css  .carousel{    height: 50%;    position: relative;    overflow: hidden;  }    .item {    position: absolute;    left: 0;    top: 0;    width: 100%;    height: 100%;  }

        js

        設置初始狀態

        首先實現一個雙向鏈表,用于維護輪播組件中的元素。

        function Node(data) {      this.data = data;      this.prev = null;      this.next = null;      this.index = -1;  }    //雙向循環列表  function LinkList() {      var _nodes = [];      this.head = null;      this.last = null;        if (typeof this.append !== "function") {          LinkList.prototype.append = function (node) {              if (this.head == null) {                  this.head = node;                  this.last = this.head;              }              else {                  this.head.prev = node;                  this.last.next = node;                    node.prev = this.last;                  node.next = this.head;                    this.last = node;              }                node.index = _nodes.length; //務必在push前設置node.index              _nodes.push(node);          }      }  }

        有了鏈表之后,創建一個鏈表實例,將子元素添加進鏈表內,并設置一些初始狀態

        var _container = document.querySelector("." + containerClass);  var _items = document.querySelectorAll("." + itemClass);    var list = loop ? new LinkList() : new SingleList();  for(var i = 0; i < _items.length; i++) {    list.append(new Node(_items[i]));  }    var _prev = null;  //保存之前顯示的元素  var _current = list.head;  //保存當前顯示的元素,默認為第一個元素    var _normalZIndex = _current.data.style.zIndex;  //未顯示元素的z-index值  var _activeZIndex = _normalZIndex + 1;  //當前顯示元素的z-index值    var _itemWidth = _current.data.offsetWidth; //子元素寬度    positionItems(); //初始化元素位置  zindexItems(_current, _activeZIndex); //將當前元素及其左右元素的z-index加1

        綁定觸摸事件

        touchstart事件

        手指按下時,保存初始位置

        _container.addEventListener("touchstart", function(e) {    // e.preventDefault();//取消此行代碼的注釋會在該元素內阻止頁面縱向滾動    var touch = e.touches[0];    startX = touch.clientX;   //保存手指按下時的位置    startY = touch.clientY;    _container.style.webkitTransition = ""; //取消動畫效果    startT = new Date().getTime();          //記錄手指按下的開始時間    isMove = false;    transitionItems(_prev, false);             //取消之前元素的過渡    transitionItems(_current, false);          //取消當前元素的過渡  }, false);

        touchmove事件

        手指在屏幕上滑動,頁面跟隨手指移動

        _container.addEventListener("touchmove", function(e) {      // e.preventDefault();//取消此行代碼的注釋會在該元素內阻止頁面縱向滾動      var touch = e.touches[0];      var deltaX = touch.clientX - startX;  //計算手指在X方向滑動的距離      var deltaY = touch.clientY - startY;  //計算手指在Y方向滑動的距離      //如果X方向上的位移大于Y方向,則認為是左右滑動      if (Math.abs(deltaX) > Math.abs(deltaY)){          translate = deltaX > _itemWidth ? _itemWidth : deltaX;          translate = deltaX < -_itemWidth ? -_itemWidth : deltaX;            //同時移動當前元素及其左右元素          moveItems(translate);             isMove = true;      }  }, false);

        touchend事件

        手指離開屏幕時,計算最終需要停留在哪一頁

        _container.addEventListener("touchend",function(e) {      // e.preventDefault();//取消此行代碼的注釋會在該元素內阻止頁面縱向滾動        //是否會滾      var isRollback = false;        //計算手指在屏幕上停留的時間      var deltaT = new Date().getTime() - startT;      if (isMove) { //發生了左右滑動          //如果停留時間小于300ms,則認為是快速滑動,無論滑動距離是多少,都停留到下一頁          if(deltaT < 300){              translate = translate < 0 ? -_itemWidth : _itemWidth;          }else {              //如果滑動距離小于屏幕的50%,則退回到上一頁              if (Math.abs(translate) / _itemWidth < 0.5){                  isRollback = true;              }else{                  //如果滑動距離大于屏幕的50%,則滑動到下一頁                  translate = translate < 0 ? -_itemWidth : _itemWidth;              }          }            moveTo(translate, isRollback);      }  }, false);

        Carousel庫

        為了方便使用,我將整個實現過程封裝成了一個庫,并添加了prev()next()方法,使用非常簡單:

        <script src="lib/carousel.js"></script>    CreateCarousel("carousel", "item", true)    .bindTouchEvent()    .setItemChangedHandler(onPageChanged);    //參數"carousel"為容器的類名  //參數"item"為子元素的類名  //第三個參數設置是否需要循環播放,true為循環播放

        該庫可到github下載

        參考

        H5單頁面手勢滑屏切換原理

        good night!

        【相關推薦】

        1. 免費h5在線視頻教程

        2. HTML5 完整版手冊

        3. php.cn原創html5視頻教程

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 久久精品无码午夜福利理论片| 精品国产免费一区二区三区香蕉 | 四虎国产精品永久免费网址| 国产精品午夜国产小视频| 精品无码久久久久久午夜| 久久综合精品国产一区二区三区| 亚洲一二成人精品区| 91麻豆精品国产自产在线观看亚洲| 亚洲精品无码av人在线观看| 久久久99精品一区二区| 国产精品第六页| 亚洲第一精品福利| 国产精品2019| 国产精品水嫩水嫩| 久久精品aⅴ无码中文字字幕重口| 亚洲精品天堂成人片?V在线播放| 久久精品国产亚洲Aⅴ香蕉 | 亚洲AV成人精品日韩一区18p| 国产一区二区精品尤物| 亚洲国产精品自在在线观看| 国产亚洲精品观看91在线| 99国产精品久久久久久久成人热| 久久99精品久久只有精品| 人人妻人人澡人人爽人人精品97| 亚洲欧洲精品成人久久奇米网| 蜜臀AV无码国产精品色午夜麻豆| 精品亚洲视频在线观看| 久久se精品一区二区影院| 国产伦精品一区二区三区视频猫咪 | 久久精品女人天堂AV麻| 国产精品亚洲欧美大片在线看 | 国产午夜亚洲精品国产成人小说| 99热精品久久只有精品| 亚洲第一精品在线视频| 四虎国产精品永久地址99新强 | 国产精品免费大片| 91精品在线播放| 久久91精品国产91久久小草| 桃花岛精品亚洲国产成人| 国产成人精品a视频一区| 精品久久久久久久久久中文字幕 |