`
liuyunlu
  • 浏览: 24778 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

HTML5手机开发——滚动和惯性缓动

    博客分类:
  • js
阅读更多
1. 滚动
以下是三种实现方式:
1) 利用原生的css属性 overflow: scroll
[html] view plaincopy
 
  1. <div id="parent" style="overflow:scroll;>  
  2.     <div id='content'>内容区域</div>  
  3. </div>  
Notice: 
在android 有bug, 滚动完后会回退到最顶端的内容区域,解决办法是使用后两种方式实现

2)js 编程实现 
思路:对比手指在屏幕上移动前后位置变化改变内容元素content的位置
 
第一步:设置parent的 overflow为hidden, 设置content的position为relative, top为0;
第二步:监听touch事件
[javascript] view plaincopy
 
  1. var parent = document.getElementById('parent');  
  2.   
  3. parent.addEventListener('touchstart'function(e) {  
  4.     // do touchstart  
  5. });  
  6. parent.addEventListener('touchmove'function(e) {  
  7.     // do touchmove  
  8. });  
  9. parent.addEventListener('touchend'function(e) {  
  10.     // do touchend  
  11. });  
第三步:实现滚动代码
[javascript] view plaincopy
 
  1. /** 
  2.  * 这里只实现垂直滚动 
  3.  */  
  4. var parent = document.getElementById('parent');  
  5. var content = document.getElementById('content')  
  6. var startY = 0; // 初始位置  
  7. var lastY = 0; // 上一次位置  
  8.   
  9. parent.addEventListener('touchstart'function(e) {  
  10.     lastY = startY = e.touches[0].pageY;  
  11. });  
  12. parent.addEventListener('touchmove'function(e) {  
  13.     var nowY = e.touches[0].pageY;  
  14.     var moveY = nowY - lastY;  
  15.     var contentTop = content.style.top.replace('px''');  
  16.     // 设置top值移动content  
  17.     content.style.top = (parseInt(contentTop) + moveY) + 'px';  
  18.     lastY = nowY;  
  19.   
  20. });  
  21. parent.addEventListener('touchend'function(e) {  
  22.     // do touchend  
  23.     var nowY = e.touches[0].pageY;  
  24.     var moveY = nowY - lastY;  
  25.     var contentTop = content.style.top.replace('px''');  
  26.     // 设置top值移动content  
  27.     content.style.top = (parseInt(contentTop) + moveY) + 'px';  
  28.     lastY = nowY;  
  29. });  
第四步:优化
上边代码在手机上运行效果相对PC上要卡很多
优化部分请参见:
 
 
3) 使用iScroll4框架
[javascript] view plaincopy
 
  1. var scroll = new iScroll('parent', {  
  2.     hScrollbar: false,  
  3.     vScrollbar: true,  
  4.     checkDOMChanges : true  
  5. });  
框架官网:http://cubiq.org/iscroll-4
 
2.惯性缓动
思路:取手指最后一段时间在屏幕上划动的平均速度v,让v按一个递减函数变化,直到不能移动或v<=0
 

 

[javascript] view plaincopy
 
  1. /** 
  2.  * 这里只实现垂直滚动 
  3.  */  
  4. var parent = document.getElementById('parent');  
  5. var content = document.getElementById('content')  
  6. var startY = 0; // 初始位置  
  7. var lastY = 0; // 上一次位置  
  8.   
  9. /** 
  10.  * 用于缓动的变量 
  11.  */  
  12. var lastMoveTime = 0;  
  13. var lastMoveStart = 0;  
  14. var stopInertiaMove = false// 是否停止缓动  
  15.   
  16. parent.addEventListener('touchstart'function(e) {  
  17.     lastY = startY = e.touches[0].pageY;  
  18.   
  19.     /** 
  20.      * 缓动代码 
  21.      */  
  22.     lastMoveStart = lastY;  
  23.     lastMoveTime = e.timeStamp || Date.now();  
  24.     stopInertiaMove = true;  
  25. });  
  26. parent.addEventListener('touchmove'function(e) {  
  27.     var nowY = e.touches[0].pageY;  
  28.     var moveY = nowY - lastY;  
  29.     var contentTop = content.style.top.replace('px''');  
  30.     // 设置top值移动content  
  31.     content.style.top = (parseInt(contentTop) + moveY) + 'px';  
  32.     lastY = nowY;  
  33.   
  34.     /** 
  35.      * 缓动代码 
  36.      */  
  37.     var nowTime = e.timeStamp || Date.now();  
  38.     stopInertiaMove = true;  
  39.     if(nowTime - lastMoveTime > 300) {  
  40.         lastMoveTime = nowTime;  
  41.         lastMoveStart = nowY;  
  42.     }  
  43. });  
  44. parent.addEventListener('touchend'function(e) {  
  45.     // do touchend  
  46.     var nowY = e.touches[0].pageY;  
  47.     var moveY = nowY - lastY;  
  48.     var contentTop = content.style.top.replace('px''');  
  49.     var contentY = (parseInt(contentTop) + moveY);  
  50.     // 设置top值移动content  
  51.     content.style.top =  contentY + 'px';  
  52.     lastY = nowY;  
  53.   
  54.     /** 
  55.      * 缓动代码 
  56.      */  
  57.     var nowTime = e.timeStamp || Date.now();  
  58.     var v = (nowY - lastMoveStart) / (nowTime - lastMoveTime); //最后一段时间手指划动速度  
  59.     stopInertiaMove = false;  
  60.     (function(v, startTime, contentY) {  
  61.         var dir = v > 0 ? -1 : 1; //加速度方向  
  62.         var deceleration = dir*0.0006;  
  63.         var duration = v / deceleration; // 速度消减至0所需时间  
  64.         var dist = v * duration / 2; //最终移动多少  
  65.         function inertiaMove() {  
  66.             if(stopInertiaMove) return;  
  67.             var nowTime = e.timeStamp || Date.now();  
  68.             var t = nowTime-startTime;  
  69.             var nowV = v + t*deceleration;  
  70.             // 速度方向变化表示速度达到0了  
  71.             if(dir*nowV < 0) {  
  72.                 return;  
  73.             }  
  74.             var moveY = (v + nowV)/2 * t;  
  75.             content.style.top = (contentY + moveY) + "px";  
  76.             setTimeout(inertiaMove, 10);  
  77.         }  
  78.         inertiaMove();  
  79.     })(v, nowTime, contentY);  
  80. });  

 

转自:http://blog.csdn.net/zzm_justin/article/details/8476373

分享到:
评论

相关推荐

    JS+HTML5手机开发之滚动和惯性缓动实现方法分析

    在JS+HTML5手机开发中,滚动和惯性缓动是提升用户体验的关键技术。滚动通常是网页或应用中浏览内容的基本方式,而惯性缓动则模拟真实世界中的物理行为,使得用户滑动屏幕时,内容能够继续滚动一段时间,增强流畅感。...

    惯性技术基础——吴俊伟

    吴俊伟所编著的《惯性技术基础》一书,由哈尔滨工程大学出版社出版,深入浅出地介绍了惯性器件的工作原理、设计方法以及应用领域,对于理解惯性导航系统的核心组件——陀螺仪和加速度计具有重要意义。 ### 惯性技术...

    创新——打破惯性思维.ppt

    在这个以创新为主题——“创新——打破惯性思维”的PPT中,重点讲述了如何通过打破常规思维方式来激发创新潜力。 首先,PPT引用了胡戈的《一个馒头引发的血案》和晏琳的土家西施烧饼,这两个例子都是创新思维在日常...

    转子动平衡技术研究与系统开发——机务工程毕业论文答辩.rar

    4. 系统开发:讨论设计和实现一个转子动平衡系统的具体过程,包括硬件选型、软件开发、数据处理和用户界面设计等。这可能涉及到信号处理、控制理论和嵌入式系统等多个技术领域。 5. 实验验证:通过实验案例展示系统...

    图书——惯性导航初始对准

    惯性导航技术是一种基于物理原理的自主导航方式,它不依赖外部信号,而是通过测量载体在三维空间中的加速度和角速度,经过积分运算得到位置、速度和姿态信息。这项技术广泛应用于航空、航天、航海、车辆定位以及移动...

    惯性权重和学习因子动态调整的改进粒子群算法的MATLAB代码实现

    在本文中,我们将深入探讨基于MATLAB实现的“惯性权重和学习因子动态调整的改进粒子群算法”(Improved Particle Swarm Optimization, IPSO)。粒子群优化(PSO)是一种受到鸟类群体行为启发的全局优化算法,它通过...

    COCOS2D-X 实现触屏拖动和惯性运动

    用cocos2d-x实现的触屏拖动程序,包括手指滑动后松开的惯性运动,可以直接,cocos2d-x开发,C++写的

    安卓 惯性 滑动 回弹 ScrollView

    在Android开发中,惯性滑动和回弹效果是用户界面设计中常见且重要的功能,尤其是在ScrollView这样的滚动视图组件中。惯性滑动是指当用户快速滑动屏幕后,内容会继续保持一段时间的滑动状态,模拟真实世界的物理惯性...

    技术报告——惯性导航系统原理验证.docx

    惯性导航系统是一种基于传感器融合技术的导航方法,尤其在车联网和自动驾驶领域有着重要的应用。在没有GPS信号的环境中,如隧道内部,车辆需要依靠惯性导航系统来维持定位精度和实时性。惯性导航系统主要依赖于多种...

    页面视觉差滚动效果

    页面视觉差滚动效果是一种在网页设计中常用的创新技术,它通过使用HTML5和CSS3来增强用户的浏览体验。这种效果通常被称作“Parallax Scrolling”,它利用不同层元素以不同的速度滚动,从而创造出深度感和立体感,...

    Android 惯性回弹效果,支持所有view,仿ios惯性回弹,滚动惯性回弹

    这个特性在用户滚动到页面边缘时,会模拟物理世界的惯性,让页面内容继续滚动一段距离,然后自然地“反弹”回来,增加了交互的生动性和真实感。本教程将详细介绍如何在Android中实现这一功能,主要涉及的知识点包括...

    安卓Android源码——ListView停止滚动开启下载图片.zip

    滚动状态包括SCROLL_STATE_IDLE(静止)、SCROLL_STATE_TOUCH_SCROLL(触摸滚动)和SCROLL_STATE_FLING(惯性滚动)。 - 当滚动状态为SCROLL_STATE_IDLE时,表示用户已经停止滑动,此时可以开始加载图片。 4. **...

    移动设备上任意元素在屏幕内惯性弹动

    移动设备上的交互设计越来越注重用户体验,其中“任意元素在屏幕内惯性弹动”是一种常见的效果,它模拟了物理世界中的运动规律,使用户界面更具动态感和真实感。这种效果通常出现在滚动列表、滑块以及其他可拖动的UI...

    很好的惯性导航原理资料——课件

    惯性导航原理是一种基于物理学的导航技术,它利用物体运动的惯性来确定其位置、速度和方向。这种技术在航空、航天、航海以及陆地车辆定位等领域有着广泛的应用。以下是对这一主题的深入探讨: 一、惯性导航系统基础...

    AS3惯性拖拽

    在Flash开发中,AS3(ActionScript 3)是一种广泛使用的编程语言,尤其适用于创建交互式网页内容和动画。惯性拖拽是一个常见的物理效果,它使得用户在触摸或鼠标操作对象时,即使手指离开屏幕,对象仍会继续保持一段...

    安卓 ScrollView 边界拖动回弹和惯性回弹

    设计师通常会结合界面设计,考虑滚动速度、回弹动画的缓动函数等因素,以创造出既美观又符合用户直觉的滚动交互。 综上所述,了解并掌握ScrollView的边界拖动回弹和惯性回弹是Android开发中的重要技能。通过自定义...

Global site tag (gtag.js) - Google Analytics