zoukankan      html  css  js  c++  java
  • 手机滑动效果探索

    这几天一直在跟touch事件打交道,各种摸索,结合css3做了一例类似弹簧式的滑动效果。手指滑动时,通过touches数组的target捕捉元素,同时当前元素前面元素进行缩放,该元素及index大于该元素的元素进行translate,

    这样会有一种重叠的效果,当手指释放时,通过animate使整体滑动,并将元素状态恢复到最初。

    js代码如下图:

     1 $(function(){
     2   var startX,startY,endX,endY,ChangeX,ChangeY,target,scroll,index;
     3   var initY=0,result=0
     4   document.getElementById("playContentContiner").addEventListener("touchstart",touchStart,false)
     5   document.getElementById("playContentContiner").addEventListener("touchmove",touchMove,false)
     6   document.getElementById("playContentContiner").addEventListener("touchend",touchEnd,false)
     7   function touchStart(event){
     8      //event.preventDefault();   
     9      var touch=event.touches[0];
    10      startX=touch.pageX;
    11      startY=touch.pageY;    
    12      initY=result 
    13      scroll=$(window).scrollTop()
    14   }
    15   function touchMove(event){
    16             
    17      var touchS=event.touches[0]; 
    18      target=event.touches[0].target      
    19      endX=touchS.pageX;
    20      endY=touchS.pageY;
    21      ChangeX=endX-startX
    22      changeY=endY-startY;     
    23      index=$(target).parents("li").index()
    24      translate = changeY * 0.8;     
    25      //设定缩放参数    
    26      // $("#data").text("index="+index)
    27      scale = Math.max((1-Math.abs(changeY/312)),0.95)*100;  //设定缩放比例,跟滑动距离相关,如果设定固定值,体验会很差
    28      var offset=$("#playContentContiner").children().eq(index-1).offset().top    
    29      if(changeY<0){//向上滑动
    30          if(index>1){//第一个没有动画
    31            if(Math.abs(result)<250){    //设定缓动,手指滑动距离越大,元素滑动越慢,并设定最大滑动距离
    32               event.preventDefault();
    33               if(Math.abs(changeY)<100){
    34                  result=(changeY+initY)/2                        
    35               }else if(Math.abs(changeY)>=100&&changeY<200){
    36                   result=(changeY+initY)/4                                  
    37               }else if(Math.abs(changeY)>=200&&changeY<250){
    38                   result=(changeY+initY)/6                                     
    39               }else{
    40                   return false
    41               }    
    42               
    43               $("#playContentContiner li:lt("+(index-1)+")").css({"width":scale+"%","margin":"0px auto"})//目标元素前面的元素缩放
    44               //目标元素后面元素位移
    45              // alert($("#playContentContiner div:lt("+index+")").length)
    46               $("#playContentContiner li:gt("+(index-2)+")").css({"z-index":"10","-webkit-transform":"translate3d(0," + (result) + "px,0)"})
    47               $("#playContentContiner").children().eq(index).addClass("Upshadow")
    48             }else{
    49               return false
    50             }
    51          }           
    52      }else{//向下滑动
    53         if(index<$("#playContentContiner").children().length){
    54              if(Math.abs(result)<250){    
    55                 event.preventDefault();
    56                 if(Math.abs(changeY)<100){
    57                    result=(changeY+initY)/2                         
    58                 }else if(Math.abs(changeY)>=100&&changeY<200){
    59                     result=(changeY+initY)/4                                
    60                 }else if(Math.abs(changeY)>=200&&changeY<250){
    61                     result=(changeY+initY)/6                                    
    62                 }else{
    63                     return false
    64                 }
    65                          
    66                 $("#playContentContiner li:gt("+(index-1)+")").css({"width":scale+"%","margin":"0px auto","z-index":"0"})
    67                 $("#playContentContiner li:lt("+index+")").css({"z-index":"10","-webkit-transform":"translate3d(0," + (translate) + "px,0)"})
    68                 $("#playContentContiner").children().eq(index).addClass("Downshadow")
    69              }else{
    70                  return false
    71              }
    72         }
    73      }        
    74   }
    75   function touchEnd(event){
    76      //event.preventDefault(); 
    77      if(changeY<0){
    78          $('body').animate({scrollTop:-changeY+$('body').scrollTop()},500);    
    79         $("#playContentContiner li:lt("+index+")").css({"width":"100%","z-index":"0"})    
    80         
    81         $("#playContentContiner li:gt("+(index-2)+")").css({"-webkit-transform":"translate3d(0,0,0)"})
    82         
    83         $("#playContentContiner").children().eq(index).removeClass("Upshadow")
    84         result=0             
    85      }else{
    86          $('body').animate({scrollTop:-changeY+$('body').scrollTop()},500);    
    87         $("#playContentContiner li:gt("+(index-1)+")").css({"width":"100%","z-index":"0"})
    88         $("#playContentContiner li:lt("+(index+1)+")").css({"z-index":"10","-webkit-transform":"translate3d(0,0,0)"})
    89         $("#playContentContiner").children().eq(index).removeClass("Downshadow")
    90              
    91      }    
    92   }
    93 })
  • 相关阅读:
    win shift s截图不能用(已解决)
    阿里云ssl证书过期怎么解决 (免费SSL证书) 三步解决
    图解 Java 数据结构
    微信小程序简介
    序列化类外键字段的覆盖,十大接口序列化总结,视图家族
    response二次封装,夺标关系优化,多表序列化,十大接口
    内部类,drf响应类,序列化与反序列化
    drf以及django应用
    DRF框架知识总览
    实例成员:计算属性 监听属性以及vue的项目开发
  • 原文地址:https://www.cnblogs.com/mopagunda/p/4557128.html
Copyright © 2011-2022 走看看