ホームページ  >  記事  >  ウェブフロントエンド  >  H5 シングルページジェスチャスライドスクリーン切り替え原理

H5 シングルページジェスチャスライドスクリーン切り替え原理

巴扎黑
巴扎黑オリジナル
2017-04-09 09:57:411961ブラウズ

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

1. 実施原則

5 つのページがあり、各ページが画面幅の 100% を占めると仮定します。p コンテナ ビューポートを作成し、その幅 (width) を 500% に設定します。次に、5 ページをコンテナにロードし、コンテナ全体に対して 5 ページを均等に分割します。 、最後にコンテナのデフォルトの位置を 0 に設定し、オーバーフローを非表示に設定して、画面にデフォルトで最初のページが表示されるようにします。

りー

CSS スタイル:

<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: 変数を初期化し、指の位置を記録し、現在時刻を記録します

.viewport{
   width: 500%;
   height: 100%;
   display: -webkit-box;
   overflow: hidden;
   //pointer-events: none; //这句话会导致整个页面上的点击事件失效,如需绑定点击事件,请注掉
   -webkit-transform: translate3d(0,0,0);
   backface-visibility: hidden;
   position: relative;
}

ontouchmove: 現在位置を取得し、画面上での指の動きの差ΔXを計算し、その動きにページを追従させます

/*手指放在屏幕上*/
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% を超えない場合は、前のページに戻る必要があります。逆に、現在のページに留まる必要があります

/*手指在屏幕上滑动,页面跟随手指移动*/
document.addEventListener("touchmove",function(e){
   e.preventDefault();
   var touch = e.touches[0];
   var deltaX = touch.pageX - startX;
   var deltaY = touch.pageY - startY;
   //如果X方向上的位移大于Y方向,则认为是左右滑动
   if (Math.abs(deltaX) > Math.abs(deltaY)){
       moveLength = deltaX;
       var translate = initialPos + deltaX; //当前需要移动到的位置
       //如果translate>0 或 < maxWidth,则表示页面超出边界
       if (translate <=0 && translate >= maxWidth){
           //移动页面
           this.transform.call(viewport,translate);
           isMove = true;
       }
       direction = deltaX>0?"right":"left"; //判断手指滑动的方向
   }
}.bind(this),false);

さらに、現在のページがどのページであるかを計算し、現在のページ番号を設定する必要もあります

/*手指离开屏幕时,计算最终需要停留在哪一页*/
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){ //如果停留时间小于300ms,则认为是快速滑动,无论滑动距离是多少,都停留到下一页
            translate = direction == &#39;left&#39;?
            currentPosition-(pageWidth+moveLength):currentPosition+pageWidth-moveLength;
            //如果最终位置超过边界位置,则停留在边界位置
            translate = translate > 0 ? 0 : translate; //左边界
            translate = translate < maxWidth ? maxWidth : translate; //右边界
        }else {
            //如果滑动距离小于屏幕的50%,则退回到上一页
            if (Math.abs(moveLength)/pageWidth < 0.5){
                translate = currentPosition-moveLength;
            }else{
                //如果滑动距离大于屏幕的50%,则滑动到下一页
                translate = direction == &#39;left&#39;?
                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 サイトの他の関連記事を参照してください。

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