久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      利用H5實(shí)現(xiàn)一個(gè)輪播器(觸屏版)的實(shí)例教程

      初入前端,分享一下手機(jī)上觸屏版輪播器的實(shí)現(xiàn)過(guò)程,大致功能如下:

      1. 支持循環(huán)滑動(dòng)

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

      3. 頁(yè)面可縱向滾動(dòng)

      4. 可設(shè)置回調(diào)監(jiān)聽(tīng)元素的切換

      5. 純js,不借助任何第三方庫(kù)

      原理

      1. 假設(shè)子元素.itemwidth為375px,使用絕對(duì)定位將所有子元素放在父元素內(nèi)

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

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

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

      5. 手指滑動(dòng)時(shí),通過(guò)滑動(dòng)距離判斷滑動(dòng)的方向:

        1. 手指向左滑動(dòng),則同時(shí)移動(dòng)當(dāng)前元素和當(dāng)前元素右邊的元素

        2. 手指向右滑動(dòng),則同時(shí)移動(dòng)當(dāng)前元素和當(dāng)前元素左邊的元素

      6. 手指抬起時(shí),通過(guò)滑動(dòng)距離判斷是否切換到下一頁(yè)

        1. 移動(dòng)距離未超過(guò)子元素寬度的50%,將當(dāng)前頁(yè)面回滾到初始位置,不切換當(dāng)前元素。

        2. 移動(dòng)距離超過(guò)子元素寬度的50%,切換當(dāng)前元素為下一個(gè)元素。

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

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

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

        6. 將其他所有子元素的z-index屬性設(shè)置為默認(rèn)值

      7. 第一個(gè)子元素的上一個(gè)元素是最后一個(gè)元素,最后一個(gè)元素的下一個(gè)元素是第一個(gè)元素,該步驟通過(guò)循環(huán)鏈表實(shí)現(xiàn)。

      移動(dòng)時(shí)設(shè)置的是子元素.item的transform屬性,而不是父元素.carousel

      實(shí)現(xiàn)步驟

      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

      設(shè)置初始狀態(tài)

      首先實(shí)現(xiàn)一個(gè)雙向鏈表,用于維護(hù)輪播組件中的元素。

      function Node(data) {      this.data = data;      this.prev = null;      this.next = null;      this.index = -1;  }    //雙向循環(huán)列表  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; //務(wù)必在push前設(shè)置node.index              _nodes.push(node);          }      }  }

      有了鏈表之后,創(chuàng)建一個(gè)鏈表實(shí)例,將子元素添加進(jìn)鏈表內(nèi),并設(shè)置一些初始狀態(tài)

      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;  //保存當(dāng)前顯示的元素,默認(rèn)為第一個(gè)元素    var _normalZIndex = _current.data.style.zIndex;  //未顯示元素的z-index值  var _activeZIndex = _normalZIndex + 1;  //當(dāng)前顯示元素的z-index值    var _itemWidth = _current.data.offsetWidth; //子元素寬度    positionItems(); //初始化元素位置  zindexItems(_current, _activeZIndex); //將當(dāng)前元素及其左右元素的z-index加1

      綁定觸摸事件

      touchstart事件

      手指按下時(shí),保存初始位置

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

      touchmove事件

      手指在屏幕上滑動(dòng),頁(yè)面跟隨手指移動(dòng)

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

      touchend事件

      手指離開(kāi)屏幕時(shí),計(jì)算最終需要停留在哪一頁(yè)

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

      Carousel庫(kù)

      為了方便使用,我將整個(gè)實(shí)現(xiàn)過(guò)程封裝成了一個(gè)庫(kù),并添加了prev(), next()方法,使用非常簡(jiǎn)單:

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

      該庫(kù)可到github下載

      參考

      H5單頁(yè)面手勢(shì)滑屏切換原理

      good night!

      【相關(guān)推薦】

      1. 免費(fèi)h5在線視頻教程

      2. HTML5 完整版手冊(cè)

      3. php.cn原創(chuàng)html5視頻教程

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)