ホームページ  >  記事  >  ウェブフロントエンド  >  JS+HTML5携帯電話開発におけるスクロールと慣性イージングの実装方法の分析

JS+HTML5携帯電話開発におけるスクロールと慣性イージングの実装方法の分析

高洛峰
高洛峰オリジナル
2017-02-17 17:14:051644ブラウズ

この記事の例では、JS+HTML5携帯電話開発におけるスクロールと慣性イージングの実装方法を説明します。参考のために皆さんと共有してください。詳細は次のとおりです。

1. スクロールを実装するには次の 3 つの方法があります:

1) ネイティブ CSS 属性オーバーフローを使用します。 ='content' コンテンツ領域 /p /p 注意: Android にはバグがあります。スクロールすると、上部のコンテンツ領域に戻ります。解決策は、

2) JS プログラミングの実装アイデアを実現するために使用することです。 : 画面上を移動する前後の指を比較します 位置を変更するとコンテンツ要素の内容が変更されます

1. スクロール

以下の 3 つの実装方法があります:

1) ネイティブ CSS 属性オーバーフローを使用します: スクロール

<p id="parent" style="overflow:scroll;>
  <p id=&#39;content&#39;>内容区域</p>
</p>

注意:

Androidにはバグがあり、スクロールした後、上部のコンテンツエリアに戻ります。解決策は、後者の2つの方法を使用してそれを実現することです

2) jsプログラミング

アイデア: 位置の変更を比較します。指が画面上で移動してコンテンツ要素の位置を変更する前後です

最初のステップ: 親のオーバーフローを非表示に設定し、コンテンツの位置を相対位置に設定し、トップを 0 に設定します

ステップ 2: タッチ イベントをリッスンします。

var parent = document.getElementById(&#39;parent&#39;);
parent.addEventListener(&#39;touchstart&#39;, function(e) {
  // do touchstart
});
parent.addEventListener(&#39;touchmove&#39;, function(e) {
  // do touchmove
});
parent.addEventListener(&#39;touchend&#39;, function(e) {
  // do touchend
});

ステップ 3: スクロール コードを実装する

/**
 * 这里只实现垂直滚动
 */
var parent = document.getElementById(&#39;parent&#39;);
var content = document.getElementById(&#39;content&#39;)
var startY = 0; // 初始位置
var lastY = 0; // 上一次位置
parent.addEventListener(&#39;touchstart&#39;, function(e) {
  lastY = startY = e.touches[0].pageY;
});
parent.addEventListener(&#39;touchmove&#39;, function(e) {
  var nowY = e.touches[0].pageY;
  var moveY = nowY - lastY;
  var contentTop = content.style.top.replace(&#39;px&#39;, &#39;&#39;);
  // 设置top值移动content
  content.style.top = (parseInt(contentTop) + moveY) + &#39;px&#39;;
  lastY = nowY;
});
parent.addEventListener(&#39;touchend&#39;, function(e) {
  // do touchend
  var nowY = e.touches[0].pageY;
  var moveY = nowY - lastY;
  var contentTop = content.style.top.replace(&#39;px&#39;, &#39;&#39;);
  // 设置top值移动content
  content.style.top = (parseInt(contentTop) + moveY) + &#39;px&#39;;
  lastY = nowY;
});

ステップ 4: 最適化

上記のコードは、PC よりも携帯電話で実行する方がはるかに遅くなります

最適化部分については、を参照してください。 :

3) iScroll4 フレームワークを使用します

var scroll = new iScroll(&#39;parent&#39;, {
hScrollbar: false,
vScrollbar: true,
checkDOMChanges : true
});

フレームワーク公式 Web サイト: http://www.php.cn/

2. 慣性イージング

アイデア: 指のスワイプの平均速度 v を取得します。最後のピリオドの画面を表示し、移動できなくなるか v<=0 になるまで減少関数に従って v を変更させます

/**
 * 这里只实现垂直滚动
 */
var parent = document.getElementById(&#39;parent&#39;);
var content = document.getElementById(&#39;content&#39;)
var startY = 0; // 初始位置
var lastY = 0; // 上一次位置
/**
 * 用于缓动的变量
 */
var lastMoveTime = 0;
var lastMoveStart = 0;
var stopInertiaMove = false; // 是否停止缓动
parent.addEventListener(&#39;touchstart&#39;, function(e) {
  lastY = startY = e.touches[0].pageY;
  /**
   * 缓动代码
   */
  lastMoveStart = lastY;
  lastMoveTime = e.timeStamp || Date.now();
  stopInertiaMove = true;
});
parent.addEventListener(&#39;touchmove&#39;, function(e) {
  var nowY = e.touches[0].pageY;
  var moveY = nowY - lastY;
  var contentTop = content.style.top.replace(&#39;px&#39;, &#39;&#39;);
  // 设置top值移动content
  content.style.top = (parseInt(contentTop) + moveY) + &#39;px&#39;;
  lastY = nowY;
  /**
   * 缓动代码
   */
  var nowTime = e.timeStamp || Date.now();
  stopInertiaMove = true;
  if(nowTime - lastMoveTime > 300) {
    lastMoveTime = nowTime;
    lastMoveStart = nowY;
  }
});
parent.addEventListener(&#39;touchend&#39;, function(e) {
  // do touchend
  var nowY = e.touches[0].pageY;
  var moveY = nowY - lastY;
  var contentTop = content.style.top.replace(&#39;px&#39;, &#39;&#39;);
  var contentY = (parseInt(contentTop) + moveY);
  // 设置top值移动content
  content.style.top = contentY + &#39;px&#39;;
  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);
});

この記事が jQuery プログラミングの皆様のお役に立てれば幸いです。

JS+HTML5 携帯電話開発におけるスクロールと慣性イージングの実装方法の分析に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。