posts - 495,comments - 227,trackbacks - 0
          <2013年11月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          常用鏈接

          留言簿(46)

          隨筆分類(476)

          隨筆檔案(495)

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 1394814
          • 排名 - 16

          最新評論

          閱讀排行榜

          評論排行榜

           1. 滾動

            以下是三種實現方式:

            1) 利用原生的css屬性 overflow: scroll

          <div id="parent" style="overflow:scroll;>
              <div id='content'>內容區域</div>
          </div>

            Notice:

            在android 有bug, 滾動完后會回退到最頂端的內容區域,解決辦法是使用后兩種方式實現

            2)js 編程實現

            思路:對比手指在屏幕上移動前后位置變化改變內容元素content的位置

            第一步:設置parent的 overflow為hidden, 設置content的position為relative, top為0;

            第二步:監聽touch事件

          var parent = document.getElementById('parent');

          parent.addEventListener('touchstart'function(e) {
              // do touchstart
          });
          parent.addEventListener('touchmove'function(e) {
              // do touchmove
          });
          parent.addEventListener('touchend'function(e) {
              // do touchend
          });

            第三步:實現滾動代碼

          /**
           * 這里只實現垂直滾動
           */

          var parent = document.getElementById('parent');
          var content = document.getElementById('content')
          var startY = 0; // 初始位置
          var lastY = 0; // 上一次位置

          parent.addEventListener('touchstart'function(e) {
              lastY = startY = e.touches[0].pageY;
          });
          parent.addEventListener('touchmove'function(e) {
              var nowY = e.touches[0].pageY;
              var moveY = nowY - lastY;
              var contentTop = content.style.top.replace('px''');
              // 設置top值移動content
              content.style.top = (parseInt(contentTop) + moveY) + 'px';
              lastY = nowY;

          });
          parent.addEventListener('touchend'function(e) {
              // do touchend
              var nowY = e.touches[0].pageY;
              var moveY = nowY - lastY;
              var contentTop = content.style.top.replace('px''');
              // 設置top值移動content
              content.style.top = (parseInt(contentTop) + moveY) + 'px';
              lastY = nowY;
          });

            第四步:優化

            上邊代碼在手機上運行效果相對PC上要卡很多

            優化部分請參見:

            3) 使用iScroll4框架

            var scroll = new iScroll('parent', {

            hScrollbar: false,

            vScrollbar: true,

            checkDOMChanges : true

            });

            框架官網:http://cubiq.org/iscroll-4

            2.慣性緩動

            思路:取手指最后一段時間在屏幕上劃動的平均速度v,讓v按一個遞減函數變化,直到不能移動或v<=0

          /**
           * 這里只實現垂直滾動
           */

          var parent = document.getElementById('parent');
          var content = document.getElementById('content')
          var startY = 0; // 初始位置
          var lastY = 0; // 上一次位置

          /**
           * 用于緩動的變量
           */

          var lastMoveTime = 0;
          var lastMoveStart = 0;
          var stopInertiaMove = false// 是否停止緩動

          parent.addEventListener('touchstart'function(e) {
              lastY = startY = e.touches[0].pageY;

              /**
               * 緩動代碼
               */

              lastMoveStart = lastY;
              lastMoveTime = e.timeStamp || Date.now();
              stopInertiaMove = true;
          });
          parent.addEventListener('touchmove'function(e) {
              var nowY = e.touches[0].pageY;
              var moveY = nowY - lastY;
              var contentTop = content.style.top.replace('px''');
              // 設置top值移動content
              content.style.top = (parseInt(contentTop) + moveY) + 'px';
              lastY = nowY;

              /**
               * 緩動代碼
               */

              var nowTime = e.timeStamp || Date.now();
              stopInertiaMove = true;
              if(nowTime - lastMoveTime > 300) {
                  lastMoveTime = nowTime;
                  lastMoveStart = nowY;
              }
          });
          parent.addEventListener('touchend'function(e) {
              // do touchend
              var nowY = e.touches[0].pageY;
              var moveY = nowY - lastY;
              var contentTop = content.style.top.replace('px''');
              var contentY = (parseInt(contentTop) + moveY);
              // 設置top值移動content
              content.style.top =  contentY + 'px';
              lastY = nowY;

              /**
               * 緩動代碼
               */

              var nowTime = e.timeStamp || Date.now();
              var v = (nowY - lastMoveStart) / (nowTime - lastMoveTime); //最后一段時間手指劃動速度
              stopInertiaMove = false;
              (function(v, startTime, contentY) {
                  var dir = v > 0 ? -1 : 1; //加速度方向
                  var deceleration = dir*0.0006;
                  var duration = v / deceleration; // 速度消減至0所需時間
                  var dist = v * duration / 2; //最終移動多少
                  function inertiaMove() {
                      if(stopInertiaMove) return;
                      var nowTime = e.timeStamp || Date.now();
                      var t = nowTime-startTime;
                      var nowV = v + t*deceleration;
                      // 速度方向變化表示速度達到0了
                      if(dir*nowV < 0) {
                          return;
                      }
                      var moveY = (v + nowV)/2 * t;
                      content.style.top = (contentY + moveY) + 
          "px";
                      setTimeout(inertiaMove, 10);
                  }
                  inertiaMove();
              })(v, nowTime, contentY);
          });

            本文來自zzm_justin的博客,原文地址:http://blog.csdn.net/zzm_justin/article/details/8476373

          posted on 2013-11-25 11:53 SIMONE 閱讀(2025) 評論(0)  編輯  收藏 所屬分類: JavaScript
          主站蜘蛛池模板: 濮阳市| 将乐县| 新干县| 安乡县| 天柱县| 文成县| 凤山市| 竹溪县| 吴忠市| 榆中县| 景谷| 亳州市| 德令哈市| 陈巴尔虎旗| 富阳市| 连城县| 美姑县| 陇川县| 青神县| 韶山市| 丁青县| 资源县| 龙口市| 肃宁县| 贡山| 夏河县| 紫云| 招远市| 伊金霍洛旗| 柳林县| 永州市| 本溪市| 潞西市| 勃利县| 南漳县| 千阳县| 塔河县| 肥城市| 阳朔县| 巫山县| 昆明市|