フロントエンドページのポップアップマスクはページのスクロールを禁止します

フロントエンドページのポップアップマスクはページのスクロールを禁止します

フロントエンド開発者がよく遭遇する問題は、ユーザーに情報を提示するためのポップアップ ウィンドウを作成することです。このポップアップ ウィンドウが表示されると、多くの場合、ページ コンテンツをブロックする灰色のマスク レイヤーが伴います。同時に、ページ全体がこのマスクで覆われ、クリックしたりスクロールしたりすることはできません。

ここに写真の説明を記入してください

解決策 1: オーバーフローを制御し、スクロールを禁止する (iOS とは互換性がありません)

PC でこの効果を作成するのは非常に簡単です。画面いっぱいに表示するために HTML の高さを 100% に設定し、ページがスクロールできないように HTML のオーバーフローを非表示に設定するだけです。
しかし、同じ問題でもモバイル デバイスでは異なります。上記の HTML 属性を設定するだけでは、モバイル端末でページが制限を超えてスクロールするのを防ぐことはできません。ポップアップ ボックスが表示されたときにページがスクロールしないようにするには、次のコードを設定する必要があります。

html.style.overflow="非表示";
html.style.height="100%";
body.style.overflow="非表示";
body.style.height="100%";

その理由は、モバイル端末がタッチイベントに基づいているためです。タッチイベントに基づいてスクロールを禁止するには、HTML でスクロールを禁止することを前提として、スクロールを禁止する必要があるコンテンツにラップするブロックレベル要素を追加し、このラップするブロックレベル要素の高さを 100% に設定し、overflow:hidden; を設定する必要があります。次に、ここで、必要なブロックレベル要素であるページ全体をラップする body を考えます。スクロールを禁止するように設定することで、モバイルページのスライド時間がページスクロールをトリガーしないようにすることができます。
ユーザーがポップアップ ウィンドウを閉じると、ページは通常の状態に戻ります。ページ全体のスクロール効果を復元するには、次の CSS スタイル プロパティを設定します。

html.style.overflow="表示可能";
html.style.height="auto";
body.style.overflow="表示可能";
body.style.height="auto";

これらのスタイルは、対応する CSS プロパティのデフォルトのスタイルとまったく同じです。
ただし、このソリューションには欠点があり、iOS システムと互換性がなく、黒い画面効果ではページのスクロールが妨げられません。モバイルデバイス向けの別のソリューションをご紹介します。

解決策 2: 絶対/固定レイアウトにより、ジェスチャ スクロール イベントのバブルが防止されます (PC では効果がありません)

モバイル端末のスクロールが画面のタッチイベントに基づいているからこそ、2番目のソリューションが生まれました(Taobao Mobileはこのソリューションを採用しています)。
まず、前提となる 2 つの知識ポイントを知っておく必要があります。1. 重なり合う 2 つのページ要素の場合、z-index 値が高い方が最初にイベント監視をトリガーし、イベント フローを続行するかどうかを制御できます。2. モバイル スクロールのタッチ イベントは、イベント フローに基づいています。
上記の 2 つの知識ポイントを基にして、このソリューションの設計アイデアを理解することができます。ソリューション 2 の原則は、元のページに変更を加えず、より高い z-index 値と絶対レイアウトまたは固定レイアウトの黒い画面 (長さと幅が 100%) を使用してページ全体をブロックし、黒い画面の touchstart イベントをリッスンして、touchstart イベントでイベント フローを終了し、イベント フローが継続しないようにすることです。こうすることで、スクロール効果を生み出すタッチイベントがページに伝達されず、スクロールは発生しなくなります。

ここに写真の説明を記入してください

ソリューション 2 の完全なテスト ソース コードを以下に掲載します。

<!DOCTYPE html>
<html>
	<ヘッド>
		<メタ文字セット="UTF-8">
		<タイトル></タイトル>
		<スタイル>
			.メインコンテンツ{
				位置:相対;
				幅:100%;
				背景色:#ccc;
				高さ:2000ピクセル;
			}

			.メインコンテンツ .トリガー{
				幅:200px;
				高さ:100px;
				フォントサイズ:30px;
				色:#000;
			}

			.メインコンテンツ.bottom{
				位置:絶対;
				下:0;
				左:0;
				幅:100%;
				高さ:200px;
				背景色:赤;
			}

			.ブラックシールド{
				位置:固定;
				トップ:0;
				左:0;
				幅:100%;
				高さ:100%;
				背景色:rgba(10,10,10,0.4);
				zインデックス:10;
			}

			.black-shield .info{
				フォントサイズ:40px;
				色:#000;
				境界線:1px実線;
				zインデックス:20;
			}
		</スタイル>
	</head>
	<本文>
		<div class="main-content">
			<button id="trigger" class="trigger">オン/オフ</button>
			<div class="bottom"></div>
		</div>
		<div id="シールド" class="black-shield" style="display:none;">
			<div id="info" class="info">現在の黒い画面がポップアップ表示された後は、ページをスライドすることはできません。現在のテキストをクリックして、黒い画面を閉じます</div>
		</div>
		
		<スクリプト>
			関数test2(){
				var showShield=false;
				var シールド = document.getElementById("シールド");
				var トリガー = document.getElementById("トリガー");
				var info = document.getElementById("info");
				var 本文 = document.querySelector("本文");
				var html = document.querySelector("html");

				//クリックすると黒い画面が表示されますtrigger.addEventListener("click",function(){
					shield.style.display="ブロック";
				}、間違い);

				//クリックすると黒いカーテンが閉じます info.addEventListener("touchstart",function(){
					シールドスタイルの表示="なし";
				}、間違い);

				//ブラックスクリーンレイヤーのタッチイベントをブロックします shield.addEventListener("touchstart",function(e){
					e.stopPropagation();
					e.preventDefault();
				}、間違い);
			}

			テスト2();
		</スクリプト>
	</本文>
</html>

これで、フロントエンドページのポップアップマスクによるページスクロール防止に関する記事は終了です。ポップアップマスクによるページスクロール防止に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

<<:  HTMLの基本タグと構造の詳細な説明

>>:  数ステップでサイバーパンク2077風の視覚効果を実現するCSS

推薦する

CentOS 8.4 に Docker をインストールする詳細なチュートリアル

目次序文:システム要件:インストール環境:古いバージョンをアンインストールします: yum は具体的...

MySQL 5.7.19 のインストールと設定方法のグラフィック チュートリアル (win10)

以下に記録されているように、WIN10システムにMYSQLをダウンロードしてインストールするための詳...

MySQL 5.6 圧縮パッケージのインストール方法

MySQL には、msi インストールと zip 解凍の 2 つのインストール方法があります。 zi...

Linux ディスクのマウント、パーティション分割、容量拡張操作を実装する方法

基本概念操作の前に、まずいくつかの基本的な概念を理解する必要がありますディスクLinux システムで...

Linux システムで IPv6 をサポートするように Nginx を設定する方法

1. 既存のnginxがipv6をサポートしているかどうかを確認する既存の nginx が ipv6...

JSはカード配布アニメーションを実現します

この記事の例では、カード配布アニメーションを実装するためのJSの具体的なコードを参考までに共有してい...

nginxのシンプル転送リクエストのサーバーとロケーション設定の詳しい説明

nginx のサーバーと場所の構成を簡単に整理してみましょう。たとえば、URL: www.mask_...

VMware Workstation のインストール (Linux カーネル) Kylin グラフィック チュートリアル

この記事では、VMware WorkstationにKylinをインストールする方法を参考までに紹介...

Ubuntu にグラフィック ドライバーが正常にインストールされたかどうかを確認する方法

次のコマンドを実行します: glxinfo | grep レンダリング結果が「はい」の場合、グラフィ...

vue-cli 設定では Vuex の完全なプロセスレコードを使用します

目次序文インストールと使用方法モジュラー管理Vuex の状態永続性要約する序文Vue 開発では、ユー...

Reactは適応性の高い仮想リストを実装する

目次変換前:変換後: 0x0の基本0x1 「固定高さ」の仮想リストを実装する原理:最適化: 0x2 ...

mysql8.0.11をインストールしてrootパスワードを変更し、navicat for mysqlに接続するアイデアの詳細な説明

1.1. ダウンロード:公式ウェブサイトから zip パッケージをダウンロードします。私は 64 ビ...

JavaScript配列の一般的なメソッドの概要

目次1. JavaScriptで配列を作成する方法2. 配列メソッドの概要3. 方法の詳細な説明1....

HTML と埋め込み Flash の両方におけるスクロールバーの分析と処理

開発を行う際に、次のような状況に遭遇することがよくあります。 a.swf が Web ページに追加さ...

クリックして展開し、全文を読む機能を実現する純粋なCSS

注記記事表示リストインターフェースを開発する場合、情報の基本的な概要を提供するために記事ヘッダーコン...