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

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

Apr 09, 2017 am 09:57 AM
h5 単一ページ

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Golang を使用してシングルページ Web アプリケーションを開発する方法 Golang を使用してシングルページ Web アプリケーションを開発する方法 Jun 05, 2023 am 09:51 AM

インターネットの継続的な発展に伴い、Web アプリケーションの需要も増加しています。以前は、Web アプリケーションは通常複数のページで構成されていましたが、現在ではシングル ページ アプリケーション (SPA) を使用するアプリケーションが増えています。シングルページ アプリケーションはモバイル アクセスに非常に適しており、ユーザーはページ全体がリロードされるまで待つ必要がないため、ユーザー エクスペリエンスが向上します。この記事では、Golang を使用して SPA アプリケーションを開発する方法を紹介します。シングル ページ アプリケーションとは何ですか? シングル ページ アプリケーションとは、HTML ファイルが 1 つだけ含まれる Web アプリケーションを指します。 Javaを使用します

h5 とはどういう意味ですか? h5 とはどういう意味ですか? Aug 02, 2023 pm 01:52 PM

H5 は、HTML の最新バージョンである HTML5 を指します。H5 は、開発者により多くの選択肢と創造的なスペースを提供する強力なマークアップ言語です。その出現は、Web テクノロジーの発展を促進し、Web ページのインタラクションと効果をより優れたものにします。H5 テクノロジーとして徐々に成熟して普及していき、インターネットの世界でますます重要な役割を果たしていくと思います。

H5、WEB フロントエンド、ビッグ フロントエンド、WEB フルスタックを区別するにはどうすればよいですか? H5、WEB フロントエンド、ビッグ フロントエンド、WEB フルスタックを区別するにはどうすればよいですか? Aug 03, 2022 pm 04:00 PM

この記事は、H5、WEB フロントエンド、大規模フロントエンド、WEB フルスタックを簡単に区別するのに役立ちます。

h5の位置の使い方 h5の位置の使い方 Dec 26, 2023 pm 01:39 PM

H5 では、position 属性を使用して、CSS を通じて要素の位置を制御できます: 1. 相対位置、構文は「style="position:relative;」です。 2. 絶対位置、構文は「style="position:」です。 Absolute;" "; 3. 固定位置、構文は「style="position:fixed;」などです。

Web側でh5を上にスライドさせて次のページを読み込むように実装する方法 Web側でh5を上にスライドさせて次のページを読み込むように実装する方法 Mar 11, 2024 am 10:26 AM

実装手順: 1. ページのスクロール イベントを監視する; 2. ページが一番下までスクロールしたかどうかを判断する; 3. データの次のページをロードする; 4. ページのスクロール位置を更新する。

vue3 で H5 フォーム検証コンポーネントを実装する方法 vue3 で H5 フォーム検証コンポーネントを実装する方法 Jun 03, 2023 pm 02:09 PM

レンダリング記述は vue.js に基づいており、他のプラグインやライブラリに依存せず、基本的な機能は element-ui と一致しており、モバイル端末の違いに合わせて内部実装にいくつかの調整が加えられています。現在の構築プラットフォームは uni-app 公式スキャフォールディングを使用して構築されており、現在ほとんどのモバイル端末には h6 と WeChat ミニプログラムの 2 種類が搭載されているため、複数の端末で 1 セットのコードを実行する技術の選択に非常に適しています。実装アイデアのコア API: と に対応する、provide と inject を使用します。コンポーネントでは、すべてのインスタンスを格納するために変数 (配列) が内部的に使用され、転送されるデータは Provide を通じて公開されます。コンポーネントは内部で Inject を使用して親コンポーネントから提供されたデータを受け取り、最後に独自の属性をメソッドの送信

新しい H5 プロモーション タグの概要と紹介 (例付き) 新しい H5 プロモーション タグの概要と紹介 (例付き) Aug 03, 2022 pm 05:10 PM

この記事では、新しい H5 プロモーション タグについて説明します。困っている友人のお役に立てれば幸いです。

ページ h5 と php は何を意味しますか? (関連知識の議論) ページ h5 と php は何を意味しますか? (関連知識の議論) Mar 20, 2023 pm 02:23 PM

HTML5 と PHP は、Web 開発で一般的に使用される 2 つのテクノロジです。前者はページ レイアウト、スタイル、インタラクションの構築に使用され、後者はサーバー側のビジネス ロジックとデータ ストレージの処理に使用されます。 HTML5 と PHP の関連知識を詳しく見ていきましょう。

See all articles