移動端輪播圖手勢分析+源碼


http://dobinspark.com.cn/

分析:移動端的輪播圖最主要的就是手勢觸摸點擊,移動和移動結束的一系列的事件,利用touch相關事件實現移動端常見滑動效果和常見的手勢事件  。輪播圖滑動的時候通過判斷觸摸屏幕的開始位置與結束位置是否大於容器的三分之一(至於多少自己定),大於則下一張,小於則回到原來的位置

解析touch:

  1.touch是移動端的觸摸,是一組事件。

  2.touchstart     當觸摸屏幕的時候觸發

  3.touchend  當手指離開屏幕是觸發

  4.touchmove      手指在屏幕中來回滑動觸發

  5.touchcancel     被迫中止手勢滑動的時候出發(來電,信息等)

  具體參考網站:https://developer.mozilla.org/zh-CN/docs/Web/API/TouchEvent

以上的事件的even對象上都存在以下的屬性:

  名字:TouchList 觸摸點(一個手指觸摸就是一個觸發點,和屏幕的接觸點的個數)的集合
  changedTouches 改變后的觸摸點集合
  targetTouches 當前元素的觸發點集合
  touches 頁面上所有觸發點集合

觸摸點集合在每個事件觸發的時候,changedTouches 每個事件都會記錄,而targetTouches,touches 在離開屏幕的時候無法記錄觸摸點。

我們需要做的就是獲取touches里面的位置屬性,如下:

  e.touches[0] 第一個觸摸點
   clientX clientY 基於瀏覽器窗口(視口)
   pageX pageY 基於頁面(視口)
   screenX screenY 基於屏幕

以下為事件測試查看屬性值的源碼:

 1 <div class="box"></div>
 2 <script>
 3     window.onload = function () {
 4         var box = document.querySelector('.box');
 5         box.addEventListener('touchstart',function (e) {
 6             console.log('start');
 7             console.log(e.touches[0].clientX,e.touches[0].clientY);
 8             console.log(e.touches[0].pageX,e.touches[0].pageY);
 9             console.log(e.touches[0].screenX,e.touches[0].screenY);
10         });
11         box.addEventListener('touchmove',function (e) {
12             console.log('move');
13             console.log(e);
14         });
15         box.addEventListener('touchend',function (e) {
16             console.log('end');
17             console.log(e);
18         });
19       
20     }
21 </script>

 

 源碼:

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>移動端輪播</title>
  6 </head>
  7 <body>
  8     <div id="container">
  9         <div class="banner">
 10         <ul class="clearFix">
 11             <li><a href="#"><img src="images/l3.jpg" alt=""></a></li>
 12             <li><a href="#"><img src="images/l1.jpg" alt=""></a></li>
 13             <li><a href="#"><img src="images/l2.jpg" alt=""></a></li>
 14             <li><a href="#"><img src="images/l3.jpg" alt=""></a></li>
 15             <li><a href="#"><img src="images/l1.jpg" alt=""></a></li>
 16         </ul>
 17         <ul>
 18             <li class="now"></li>
 19             <li></li>
 20             <li></li>
 21         </ul>
 22         </div>
 23     </div>
 24 <script>
 25     window.onload(function(){
 26         /*輪播圖*/
 27         var banner = document.querySelector('.banner');
 28         /*屏幕寬度*/
 29         var width = banner.offsetWidth;
 30         /*圖片容器*/
 31         var imageBox = banner.querySelector('ul:first-child');
 32         /*點容器*/
 33         var pointBox = banner.querySelector('ul:last-child');
 34         /*所有的點*/
 35         var points = pointBox.querySelectorAll('li');
 36 
 37         var index=1;//核心
 38         //加過渡
 39         var addTransition = function () {
 40             imageBox.style.transition = 'all 0.2s';
 41             imageBox.style.webkitTransition = 'all 0.2s';
 42         }
 43         //移除過渡
 44         var removeTransition = function () {
 45             imageBox.style.transition = 'none';
 46             imageBox.style.webkitTransition = 'none';
 47         }
 48         //移動位置
 49         var setTranslateX = function (translateX) {
 50             imageBox.style.transform = 'translateX(' + translateX + 'px)';
 51             imageBox.style.webkitTransform = 'translateX(' + translateX + 'px)';
 52         }
 53 
 54 
 55 
 56            var time=setInterval(function(){
 57                index++;
 58                addTransition();//加過渡
 59                imageBox.transform='translateX('+ -index*width+'px)'
 60                imageBox.webkitTransform='translateX('+ -index*width+'px)'
 61                // 過渡
 62                },3000)
 63 
 64            imageBox.addEventListener('transitionend',function(){
 65 
 66                if(index>=4){
 67                    index=1;
 68                    removeTransition();
 69                    setTranslateX(-index*width);
 70                }
 71                else if(index<=0){
 72                    index=3;
 73                    removeTransition();
 74                    setTranslateX(-index*width);
 75                }
 76                  /*根據索引設置點*/
 77             /*此時此刻  index  的取值范圍  1-3)*/
 78             /*點索引  index - 1 */
 79             setPoint();
 80         })
 81 
 82      var setPoint = function () {
 83         /*index 1-3*/
 84         /*清除樣式*/
 85         for (var i = 0; i < points.length; i++) {
 86             var obj = points[i];
 87             obj.classList.remove('circle');//原點樣式
 88         }
 89         /*給對應的加上樣式*/
 90         points[index - 1].classList.add('circle');
 91         }
 92     /*綁定事件*/
 93     var startX = 0;
 94     var distanceX = 0;
 95     var isMove = false;
 96     imageBox.addEventListener('touchstart', function (e) {
 97         /*清除定時器*/
 98         clearInterval(timer);
 99         /*記錄起始位置的X坐標*/
100         startX = e.touches[0].clientX;
101     });
102     imageBox.addEventListener('touchmove', function (e) {
103         /*記錄滑動過程當中的X坐標*/
104         var moveX = e.touches[0].clientX;
105         /*計算位移  有正負方向*/
106         distanceX = moveX - startX;
107         /*計算目標元素的位移  不用管正負*/
108         /*元素將要的定位=當前定位+手指移動的距離*/
109         var translateX = -index * width + distanceX;
110         /*滑動--->元素隨着手指的滑動做位置的改變*/
111         removeTransition();
112         setTranslateX(translateX);
113         isMove = true;
114     });
115     imageBox.addEventListener('touchend', function (e) {
116         /*4.  5.  實現*/
117         /*要使用移動的距離*/
118         if (isMove) {
119             if (Math.abs(distanceX) < width / 3) {
120                 /*吸附*/
121                 addTransition();
122                 setTranslateX(-index * width);
123             } else {
124                 /*切換*/
125                 /*右滑動 上一張*/
126                 if (distanceX > 0) {
127                     index--;
128                 }
129                 /*左滑動 下一張*/
130                 else {
131                     index++;
132                 }
133                 /*根據index去動畫的移動*/
134                 addTransition();
135                 setTranslateX(-index * width);
136             }
137         }
138 
139         startX = 0;
140         distanceX = 0;
141         isMove = false;
142         /*加上定時器*/
143         clearInterval(timer);
144         timer = setInterval(function () {
145             index++;
146             /*加過渡*/
147             addTransition();
148             /*做位移*/
149             setTranslateX(-index * width);
150         }, 1000);
151     })
152 
153 })
154     
155 
156 </script>    
157 
158 </body>
159 </html>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM