H5 のシングル ページ ジェスチャのスライド画面切り替えは、HTML5 のタッチ イベント (Touch) と CSS3 アニメーション (Transform、Transition) を使用して実装されます。この記事では、その実装原理と主なアイデアについて簡単に説明します。

1. 実施原則
5 つのページがあり、各ページが画面幅の 100% を占めると仮定します。p コンテナ ビューポートを作成し、その幅 (width) を 500% に設定します。次に、5 ページをコンテナにロードし、コンテナ全体に対して 5 ページを均等に分割します。 、最後にコンテナのデフォルトの位置を 0 に設定し、オーバーフローを非表示に設定して、画面にデフォルトで最初のページが表示されるようにします。
りー
CSS スタイル:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <p id= "viewport" class = "viewport" >
<p class = "pageview" style= "background: #3b76c0" >
<h3 >页面-1</h3>
</p>
<p class = "pageview" style= "background: #58c03b;" >
<h3>页面-2</h3>
</p>
<p class = "pageview" style= "background: #c03b25;" >
<h3>页面-3</h3>
</p>
<p class = "pageview" style= "background: #e0a718;" >
<h3>页面-4</h3>
</p>
<p class = "pageview" style= "background: #c03eac;" >
<h3>页面-5</h3>
</p>
</p>
|
ログイン後にコピー
touchstart、touchmove、touchend イベントを登録します。指が画面上をスライドするときに、CSS3 変換を使用してビューポートの位置をリアルタイムに設定します。たとえば、2 ページ目を表示するには、ビューポートの変換を設定します。translate3d(100%,0)。 ,0) 以上です。ここでは、translateX の代わりに translation3d を使用します。translate3d は、携帯電話の GPU をアクティブにオンにしてレンダリングを高速化し、ページのスライドをよりスムーズにします。
2. メインアイデア
画面上に指を置き、指をスライドさせてから画面を離れるまで、これは完全な操作プロセスであり、対応する操作により次のイベントがトリガーされます。
画面に指を置きます: ontouchstart
画面上で指をスライドさせる: ontouchmove
指が画面から離れる: ontouchend
ページのスライドを完了するには、次の 3 段階のタッチ イベントをキャプチャする必要があります:
ontouchstart: 変数を初期化し、指の位置を記録し、現在時刻を記録します
1 2 3 4 5 6 7 8 9 10 | .viewport{
width: 500%;
height: 100%;
display: -webkit-box;
overflow: hidden;
-webkit-transform: translate3d(0,0,0);
backface-visibility: hidden;
position: relative;
}
|
ログイン後にコピー
ontouchmove: 現在位置を取得し、画面上での指の動きの差ΔXを計算し、その動きにページを追従させます
1 2 3 4 5 6 7 8 9 10 11 | document.addEventListener( "touchstart" , function (e){
e.preventDefault();
var touch = e.touches[0];
startX = touch.pageX;
startY = touch.pageY;
initialPos = currentPosition;
viewport.style.webkitTransition = "" ;
startT = new Date ().getTime();
isMove = false;
}.bind(this),false);
|
ログイン後にコピー
ontouchend: 指が画面から離れたときに、画面がどのページに移動するかを計算します。まず、画面上での指の滞留時間 deltaT を計算します。 deltaT
(1) クイックスライドの場合は、現在のページを画面の中央に完全に配置します (現在のページをどのくらいスライドする必要があるかを計算する必要があります)
(2) スライドが遅い場合は、画面上での指のスライド距離も判断する必要があります。スライド距離が画面幅の 50% を超えない場合は、前のページに戻る必要があります。逆に、現在のページに留まる必要があります
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | document.addEventListener( "touchmove" , function (e){
e.preventDefault();
var touch = e.touches[0];
var deltaX = touch.pageX - startX;
var deltaY = touch.pageY - startY;
if (Math. abs (deltaX) > Math. abs (deltaY)){
moveLength = deltaX;
var translate = initialPos + deltaX;
if (translate <=0 && translate >= maxWidth){
this.transform.call(viewport,translate);
isMove = true;
}
direction = deltaX>0? "right" : "left" ;
}
}.bind(this),false);
|
ログイン後にコピー
さらに、現在のページがどのページであるかを計算し、現在のページ番号を設定する必要もあります
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | document.addEventListener( "touchend" , function (e){
e.preventDefault();
var translate = 0;
var deltaT = new Date ().getTime() - startT;
if (isMove){
viewport.style.webkitTransition = "0.3s ease -webkit-transform" ;
if (deltaT < 300){
translate = direction == 'left'?
currentPosition-(pageWidth+moveLength):currentPosition+pageWidth-moveLength;
translate = translate > 0 ? 0 : translate;
translate = translate < maxWidth ? maxWidth : translate;
} else {
if (Math. abs (moveLength)/pageWidth < 0.5){
translate = currentPosition-moveLength;
} else {
translate = direction == 'left'?
currentPosition-(pageWidth+moveLength):currentPosition+pageWidth-moveLength;
translate = translate > 0 ? 0 : translate;
translate = translate < maxWidth ? maxWidth : translate;
}
}
this.transform.call(viewport,translate);
}
}.bind(this),false);
|
ログイン後にコピー
もちろん、これらは基本的な考え方であり、実際の操作中に注意が必要な点がいくつかありますが、ここでは詳しく説明しません。ソース コードはすべて Git に転送されています。 https://github.com/git -onepixel/guesture、興味のある学生は一緒に議論することを歓迎します
以上がH5 シングルページジェスチャスライドスクリーン切り替え原理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。