zoukankan      html  css  js  c++  java
  • 移动端轮播图手势分析+源码

    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>
  • 相关阅读:
    代码优化:尽量减少对变量的重复计算
    Easy code数据库类型NUMBER(20),没有找到映射关系
    Apache JMeter的下载和安装
    启动报错:Error Running cant find catalina.jar
    创建自定义配置节
    Word转Chm 在线转换应用
    silverlight概述
    布局
    case of silverlight
    关于SilverLight打印(二)
  • 原文地址:https://www.cnblogs.com/Dobin/p/9075194.html
Copyright © 2011-2022 走看看