zoukankan      html  css  js  c++  java
  • js实现touch移动触屏滑动事件

    http://www.jb51.net/article/64303.htm

    js实现touch移动触屏滑动事件

    投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2015-04-17 我要评论

    在开始描述touch事件之前,需要先描述一下多触式系统中特有的touch对象(android和iOS乃至nokia最新的meego系统都模拟了类 似的对象)。这个对象封装一次屏幕触摸,一般来自于手指。它在touch事件触发的时候产生,可以 通过touch event handler的event对象取到

    移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等事件来完成。但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件。处理touch事件能跟踪到屏幕滑动的每根手指。

    以下是四种touch事件
    touchstart: //手指放到屏幕上时触发
    touchmove: //手指在屏幕上滑动式触发
    touchend: //手指离开屏幕时触发
    touchcancel: //系统取消touch事件的时候触发,这个好像比较少用

    每个触摸事件被触发后,会生成一个event对象,event对象里额外包括以下三个触摸列表

    touches: //当前屏幕上所有手指的列表
    targetTouches: //当前dom元素上手指的列表,尽量使用这个代替touches
    changedTouches: //涉及当前事件的手指的列表,尽量使用这个代替touches
    这些列表里的每次触摸由touch对象组成,touch对象里包含着触摸信息,主要属性如下:
    clientX / clientY: //触摸点相对浏览器窗口的位置
    pageX / pageY: //触摸点相对于页面的位置
    screenX / screenY: //触摸点相对于屏幕的位置
    identifier: //touch对象的ID
    target: //当前的DOM元素

    注意:

    手指在滑动整个屏幕时,会影响浏览器的行为,比如滚动和缩放。所以在调用touch事件时,要注意禁止缩放和滚动。

    1.禁止缩放
    通过meta元标签来设置。

    2.禁止滚动
    preventDefault是阻止默认行为,touch事件的默认行为就是滚动。
    event.preventDefault();

    使用案例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" Content="text/html; charset=utf-8;">
    <title>移动端触摸滑动</title>
    <meta name="author" content="rainna" />
    <meta name="keywords" content="rainna's js lib" />
    <meta name="description" content="移动端触摸滑动" />
    <meta name="viewport" content="target-densitydpi=320,width=640,user-scalable=no">
    <style>
    *{margin:0;padding:0;}
    li{list-style:none;}.m-slider{600px;margin:50px 20px;overflow:hidden;}
    .m-slider .cnt{position:relative;left:0;3000px;}
    .m-slider .cnt li{float:left;600px;}
    .m-slider .cnt img{display:block;100%;height:450px;}
    .m-slider .cnt p{margin:20px 0;}
    .m-slider .icons{text-align:center;color:#000;}
    .m-slider .icons span{margin:0 5px;}
    .m-slider .icons .curr{color:red;}
    .f-anim{-webkit-transition:left .2s linear;}
    </style>
    </head>
    <body>
    <div class="m-slider">
    <ul class="cnt" id="slider">
    <li>
    <p>20140813镜面的世界,终究只是倒影。看得到你的身影,却触摸不到你的未来</p>
    </li>
    <li>
    <p>20140812锡林浩特前往东乌旗S101必经之处,一条极美的铁路。铁路下面是个小型的盐沼,淡淡的有了一丝天空之境的感觉。可惜在此玩了一个小时也没有看见一列火车经过,只好继续赶往东乌旗。</p>
    </li>
    <li>
    <p>20140811水的颜色为什么那么蓝,我也纳闷,反正自然饱和度和对比度拉完就是这个颜色的</p>
    </li>
    <li>
    <p>海洋星球3重庆天气热得我想卧轨自杀</p>
    </li>
    <li>
    <p>以上这些作品分别来自两位设计师作为观者,您能否通过设计风格进行区分</p>
    </li>
    </ul>
    <div class="icons" id="icons">
    <span class="curr">1</span>
    <span>2</span>
    <span>3</span>
    <span>4</span>
    <span>5</span>
    </div>
    </div>
    <script>
    var slider = {
    //判断设备是否支持touch事件
    touch:('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch,
    slider:document.getElementById('slider'),
    //事件
    events:{
    index:0, //显示元素的索引
    slider:this.slider, //this为slider对象
    icons:document.getElementById('icons'),
    icon:this.icons.getElementsByTagName('span'),
    handleEvent:function(event){
    var self = this; //this指events对象
    if(event.type == 'touchstart'){
    self.start(event);
    }else if(event.type == 'touchmove'){
    self.move(event);
    }else if(event.type == 'touchend'){
    self.end(event);
    }
    },
    //滑动开始
    start:function(event){
    var touch = event.targetTouches[0]; //touches数组对象获得屏幕上所有的touch,取第一个touch
    startPos = {x:touch.pageX,y:touch.pageY,time:+new Date}; //取第一个touch的坐标值
    isScrolling = 0; //这个参数判断是垂直滚动还是水平滚动
    this.slider.addEventListener('touchmove',this,false);
    this.slider.addEventListener('touchend',this,false);
    },
    //移动
    move:function(event){
    //当屏幕有多个touch或者页面被缩放过,就不执行move操作
    if(event.targetTouches.length > 1 || event.scale && event.scale !== 1) return;
    var touch = event.targetTouches[0];
    endPos = {x:touch.pageX - startPos.x,y:touch.pageY - startPos.y};
    isScrolling = Math.abs(endPos.x) < Math.abs(endPos.y) ? 1:0; //isScrolling为1时,表示纵向滑动,0为横向滑动
    if(isScrolling === 0){
    event.preventDefault(); //阻止触摸事件的默认行为,即阻止滚屏
    this.slider.className = 'cnt';
    this.slider.style.left = -this.index*600 + endPos.x + 'px';
    }
    },
    //滑动释放
    end:function(event){
    var duration = +new Date - startPos.time; //滑动的持续时间
    if(isScrolling === 0){ //当为水平滚动时
    this.icon[this.index].className = '';
    if(Number(duration) > 10){
    //判断是左移还是右移,当偏移量大于10时执行
    if(endPos.x > 10){
    if(this.index !== 0) this.index -= 1;
    }else if(endPos.x < -10){
    if(this.index !== this.icon.length-1) this.index += 1;
    }
    }
    this.icon[this.index].className = 'curr';
    this.slider.className = 'cnt f-anim';
    this.slider.style.left = -this.index*600 + 'px';
    }
    //解绑事件
    this.slider.removeEventListener('touchmove',this,false);
    this.slider.removeEventListener('touchend',this,false);
    }
    },
    //初始化
    init:function(){
    var self = this; //this指slider对象
    if(!!self.touch) self.slider.addEventListener('touchstart',self.events,false); //addEventListener第二个参数可以传一个对象,会调用该对象的handleEvent属性
    }
    };
    slider.init();
    </script>
    </body>
    </html>

    以上所述就是本文的全部内容了,希望大家能够喜欢。

  • 相关阅读:
    003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程
    002 01 Android 零基础入门 01 Java基础语法 01 Java初识 02 Java简介
    001 01 Android 零基础入门 01 Java基础语法 01 Java初识 01 导学
    001 Android Studio 首次编译执行项目过程中遇到的几个常见问题
    Dora.Interception,为.NET Core度身打造的AOP框架 [2]:以约定的方式定义拦截器
    Dora.Interception,为.NET Core度身打造的AOP框架 [1]:更加简练的编程体验
    监视EntityFramework中的sql流转你需要知道的三种方式Log,SqlServerProfile, EFProfile
    轻量级ORM框架——第二篇:Dapper中的一些复杂操作和inner join应该注意的坑
    轻量级ORM框架——第一篇:Dapper快速学习
    CF888G Xor-MST(异或生成树模板)
  • 原文地址:https://www.cnblogs.com/developer-ios/p/7440208.html
Copyright © 2011-2022 走看看