• 移动开发基础(二)touch事件


    手机上的大部分交互都是通过touch来实现的,于是,对于触屏的交互式网站,触摸事件是相当重要的。

    先了解一些规范

    手指触摸屏幕可以触发的几个事件

     touchstart:触摸开始的时候触发

     touchmove:手指在屏幕上滑动的时候触发

     touchend:触摸结束的时候触发

    每一个触摸事件都会产生一个触摸事件对象,对象包含的公共事件属性(他们都是TouchList类型的对象里面装着Touch对象),而每个触摸事件都包括了三个触摸列表,每个列表里包含了对应的一系列触摸点(用来实现多点触控):

    touches:当前位于屏幕上的所有手指的列表。

    targetTouches:位于当前DOM元素上手指的列表。

    changedTouches:涉及当前事件手指的列表。

    每个触摸点由包含了如下触摸信息(常用):

    identifier:一个数值,唯一标识触摸会话(touch session)中的当前手指。一般为从0开始的流水号(android4.1,uc)

    target:DOM元素,是动作所针对的目标。

    pageX/pageX/clientX/clientY/screenX/screenY一个数值,动作在屏幕上发生的位置(page包含滚动距离,client不包含滚动距离,screen则以屏幕为基准)。 

    radiusX/radiusY/rotationAngle:画出大约相当于手指形状的椭圆形,分别为椭圆形的两个半径和旋转角度。

    现在来一个小实例

     1  var spots={},touches,timer;
     2       document.addEventListener('touchstart',function(e){ 
     3           e.preventDefault();
     4           [].forEach.call(e.targetTouches,function(touch){
     5               //如果已经有了小光点,直接离开
     6                 if(spots[touch.identifier]){
     7                     return;
     8                 }
     9                 var spot=spots[touch.identifier]=document.createElement('div');
    10                 spot.classList.add('spot');
    11                 spot.style.top=touch.pageY-35;
    12                 spot.style.left=touch.pageX-35;
    13                 document.body.appendChild(spot);
    14           }) 
    15       },false);
    16       document.addEventListener('touchmove',function(e){
    17           e.preventDefault();
    18           touches=e.touches;
    19           timer=setInterval(function(){
    20             renderTouches(touches);
    21        },16) 
    22       });
    23       function renderTouches(touches){
    24           if(!touches){
    25               return;
    26           };
    27           [].forEach.call(touches,function(touch){
    28               var spot=spots[touch.identifier]
    29               if(spot){
    30                   spot.style.top=touch.pageY-35;
    31                   spot.style.left=touch.pageX-35;
    32               }
    33           })
    34       }
    35      document.addEventListener('touchend',function(e){
    36           
    37          e.preventDefault();
    38          [].forEach.call(e.changedTouches,function(touch){
    39              var spot=spots[touch.identifier]
    40              if(spot){
    41                  document.body.removeChild(spot);
    42                  delete spots[touch.identifier];
    43              }
    44          })
    45          if(e.changedTouches.length==0){
    46              clearInterval(timer);
    47          }
    48      })

    css代码

     1   body{
     2              color:white;
     3              background-color: #222;
     4          }
     5          .spot{
     6              position: absolute;
     7              width:70px;
     8              height:70px;
     9              border-radius: 35px;
    10              box-shadow: 0px 0px 40px #fff;
    11              background-color: #fff;
    12              opacity: .7;
    13          }

    实现的效果是点击触摸屏时出现一个小圆点,小圆点随着手移动。

  • 相关阅读:
    vue-router 路由拦截 beforeEach 添加静态路由 与 动态添加路由
    elementUI el-upload 根据上传的图片高度,进行自适应宽度
    vue 中 字符串分两行显示
    MySQL中的<=>
    Spring mvc再启动时候会打印项里面的所有路径
    一次解决前后台交互问题
    数据库表分区,分表
    支付宝接口
    打印js中一个对象的所有属性的值
    var
  • 原文地址:https://www.cnblogs.com/sliuie/p/5160389.html
Copyright © 2020-2023  润新知