1. スクロールを実装するには次の 3 つの方法があります: 1) ネイティブ CSS を使用しますattribute overflow:scroll p id =parent style = overflow:scroll; pid='content' コンテンツ領域/p /p 注意: android にはバグがあります。解決策は、後者の 2 つを使用することです。 2)jsプログラミングの実装アイデア:画面上で指を動かしてコンテンツ要素の内容を変更する前後の位置変化を比較する
1. Scroll
実装方法は以下の3つです
1)ネイティブCSS属性オーバーフロー:scroll
<div id="parent" style="overflow:scroll;>
<div id='content'>内容区域</div>
</div>
ログイン後にコピー
注意:
Androidにはスクロール後、上部のコンテンツエリアに戻ってしまうバグがあります
2)jsプログラミング。実装
アイデア: 画面上で移動する前と後の指の位置の変化を比較する コンテンツ要素の位置を変更する
ステップ 1: 親のオーバーフローを非表示に設定し、コンテンツの位置を相対に設定し、 top to 0;
ステップ 2: タッチ イベントをリッスンする
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
});
ログイン後にコピー
ステップ 3: スクロール コードを実装する
/**
* 这里只实现垂直滚动
*/
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;
});
ログイン後にコピー
ステップ 4: 最適化する
上記のコードは、PC よりも携帯電話で実行する方がはるかに遅くなります
最適化部分については、こちらをご覧ください:
3) iScroll4 フレームワークを使用します
var scroll = new iScroll('parent', {
hScrollbar: false,
vScrollbar: true,
checkDOMChanges : true
});
ログイン後にコピー
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);
});
ログイン後にコピー
になるまで、減少する関数に移行します。以上がHTML5 モバイル開発 - スクロールと慣性イージングのコード例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。