JSで実現したページサイドバーの効果に関する研究

JSで実現したページサイドバーの効果に関する研究

実際、その効果は次のようになります。

ボス

そしてタイトルは、この効果を見たときの私の本当の気持ちなのかもしれません。なぜなら、最初の反応は「ページ全体をページ外に移動することもできるか?」というものだからです。

発見: ディスプレイアニメーションの応用

一体何が原因だったのでしょうか?最近、コミュニティ プロジェクトの公式 Web サイトで次のような効果を作成する計画を立てました。アバターをクリックすると、左/右から「パネル」がスライドして表示され、ユーザーの個人情報が表示されます。

もちろん、位置の位置決め + オーバーフローのオーバーフローによる非表示、不透明度/可視性の非表示 + ポインター イベント要素の貫通の使用など、これを行う方法はたくさんあります... しかし、当時私が考えていたのは、「実際の非表示、表示」にアニメーションを追加する方法でした。

おそらく私たち全員が知っていることですが、HTML レンダリング プロセス中に、「リフロー」と「再描画」のプロセスが実行され、ページのパフォーマンスに影響を及ぼす可能性があります。このプロセスがトリガーされる理由は、要素の位置の移動、サイズの変更、ノードの追加と削除、ここで述べたディスプレイの表示と非表示の切り替えなど、多数あります。要素の変更はページ上ですばやく表示する必要があるため、私たちにとっては「突然」のように見えます。
注目すべき点の 1 つは、ブラウザが「少し賢い」ということです。ページのリフローをトリガーするコードが多数ある場合、ブラウザはそれらをすべて読み取って (マージして) まとめることができるため、次のコードは次の効果をもたらします。

/** CSS コード */
幅: 50px;
高さ: 50px;
背景色: 赤;
表示: なし;
変換: translateX(0);
transition: all .6s easy; // 役に立たないようです?
//js コード ds.style.display="block";
ds.style.transform="translateX(100px)"; 

アニメーション効果なし

ただし同様に、次のプロパティを操作する場合、ブラウザのレンダリング メカニズムにより、offsetTop、offsetLeft、offsetWidth、offsetHeight、scrollTop、scrollLeft、scrollWidth、scrollHeight、clientTop、clientLeft、clientWidth、clientHeight、getComputedStyle() (IE では currentStyle) など、ページを強制的にレンダリングできる API がいくつかあります (詳細で正確な情報が必要となるため)。これにより、前後の 2 行が直接「2 回のレンダリング」と同等になります。

したがって、上記の js コードを次のように変更します。

//js コード ds.style.display="block";
ds.オフセット高さ;
ds.style.transform="translateX(100px)";

それでおしまい

アニメーション効果付き
現在、csdn公式サイトPC版のblinkリリースページでの画像アップロードも同様の機能を使用しています!

後になって、この方法ではページ構造を変更するために js が必要だと感じたので...

実装:記事の1行目を表示する効果を実現する方法

これは、位置の配置に基づいて「重なり合う」ことになります。つまり、2 つのインライン要素に配置属性が設定された後 (ただし、上/左/下/右の配置は追加されません)、後者が前者を覆います。このとき、位置は margin を通じて移動して表示できます

インライン要素のみ可能であり、インライン ブロック要素は使用できません。 ——雲暁夢

その構造はおおよそ次のようになります。

<div class="page_list">
	<div class="z_two_page">
		<!-- 右側のポップアップ ボックスに表示される情報は次のとおりです -->
	</div>
	<div class="box">
		<!-- "ページ" マスク -->
		<div class="zb_mask"></div>
		<!-- ここが「ページ」データ構造が入る場所です (つまり、body タグの下にあるすべてのもの) -->
	</div>
	<!-- これはプレースホルダー要素です-->
	<div class="space"></div>
</div>

実際は次のようになります:

<div class="page_list">
	<div class="z_two_page">ハハハ</div>
	<div class="box">
		<div class="zb_mask"></div>
		
		<div id="ボックス">
		 <div class="left" style="background-color:#ffc5c5;"></div>
		 <div class="right" style="background-color:#7171f7;">
			 フレックスの2列レイアウトは、左側が固定され、右側が適応型です </div>
		</div>
		<div class="color"></div>
		<a href="#" rel="external nofollow" class="a">グローバル スタイルを設定するときは注意してください (これをスタイル リセットと呼びます)</a>
		<div class="center">
			<div class="ds"></div>
			<button class="but">指定された場所へ移動</button>
		</div>
		<フォームid="フォーム" アクション="#">
			<input type="submit" value="="幅木/>
		</フォーム>
		<img id="img" src="compress/compress/img/mxc_16x16.png" />
	</div>
	
	<div class="space"></div>
</div>

上記のように、クラス「box」の div には「元のページ全体」が含まれています。望ましい効果を得るために、フレックスレイアウトを使用します。

flex には、flex-grow、flex-shrink、flex-basis という 3 つのプロパティが省略形で含まれています。

  • flex-grow: コンテナ内に余分なスペースがある場合の割り当てルールを指定します。デフォルト値は 0 で、余分なスペースは割り当てられません。
  • flex-shrink: コンテナの残りスペースが不足している場合の割り当てルールを指定します。デフォルト値は 1 で、スペースが不足している場合はスペースを割り当てる必要があることを意味します。
  • flex-basis: flex-basis は固定の割り当て量を指定します。デフォルト値は auto です。

設定する場合は、幅または高さの属性を設定する必要があります。

/* リストは水平方向にのみスクロールします */
.page_list { 幅: 100vw; 表示: flex; オーバーフローY: 非表示; }
/* メインコンテンツの幅 100%、白背景カバー率 */
.box { flex: 0 0 100vw; 高さ: 100%; 背景色: #fff; 位置: relative; オーバーフローy: auto; オーバーフローx: hidden; 遷移: all .6s easy; }
/** マスクレイヤースタイル*/
.zb_マスク{
	位置: 絶対;
	上: 0;
	左: 0;
	幅: 100%;
	高さ: 100%;
	zインデックス: 100;
	背景色: rgba(0,0,0,.2);
	ポインタイベント: なし;
	不透明度: 0;
	遷移: すべて .6 秒の緩和;
}
/* 水平スクロールスペースを解放するために使用される空のラベル要素*/
.space { flex: 0 0 12rem; }
/* ボタンは固定され、コンテンツの白い背景の後ろに隠れています */
.z_two_page { 幅: 12rem; 位置: 固定; 右: 0; 上: 0; }

つまり、何もせずにボックスの内容を表示します (これは、派手な div がない場合と同じ効果です)。 backgroundを使用して、背後にclass "space" を持つプレースホルダー要素をカバーします。"hahahaha" が表示されると、ボックスは右に移動します。

ここで注目すべき点は、「Hahaha」が属する div が前面にあり、「page」が属する div が背面にあるのはなぜかということです。
前述のとおり、ここではポジションオーバーレイが使用されており、そのルールは「後ろが前を覆う」というものなので、このレイアウト方法を使用する場合は、最初は隠れていた要素を前面に配置する必要があります。

コードの最初の 2 つの flex 属性の値は 0 です。これは、スペースが増減してもサイズは同じままであることを意味します (これがこの記事の基礎です)。3 番目の要素は、表示されるときの「デフォルト サイズ」を書き込みます。ご覧のとおり、ボックスはページをホストするため100vwですが、 class 「z_two_page」の要素はここでは12rem設定されています。この値は完全に変更できます。

では、私たちの視界に「ハハハハ」を映し出すにはどうすればいいのでしょうか? —— js は「ページを表す要素」全体の動きを制御できます。

ここには「マスクレイヤー効果」があります。従来の js 実装に従って、表示を見つける必要があります。さらに、前述の「表示アニメーション効果」を使用して、エクスペリエンスを向上させることができます。
ただし、この記事の上記の CSS コードには、要素が貫通可能かどうかを示すpointer-events属性が追加されています。これを none に設定すると、対応する要素が存在するかどうかを気にする必要がなくなり (イベントの観点からは、存在してもしなくても同じです)、表示などを制御する必要がなくなるため、パフォーマンスが大幅に向上します。

右 = document.querySelector(".right");
box = document.querySelector(".box"); とします。
マスクを document.querySelector(".zb_mask"); とします。
right.onclick=関数(){
 box.style.marginLeft="-12rem";
 mask.style.cssText+="不透明度: 1; ポインターイベント: all;"
}
マスク.onclick=関数(){
 ボックススタイルマージン左="0";
 mask.style.cssText+="不透明度: 0; ポインターイベント: なし;"
}

最後に、右側の空白やネイティブ ジェスチャがページ全体に与える影響など、モバイル ページの表示に関するいくつかの問題を考慮して、通常は CSS でhtml{max-width: 100vw;overflow-x: hidden;}を設定します。ユーザーがモバイル デバイスでのみポップアップ サイドバーをクリックできるようにしたい場合は、ここで CSS に制限を追加できます。上記の関数を PC でのみ有効になるように設定します。

@media (任意のホバー: なし) {
	.ページリスト{
		オーバーフロー-x:非表示;
	}
}

JS ページ サイドバー効果の調査に関するこの記事はこれで終わりです。より関連性の高い js ページ サイドバー コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。皆様が今後も 123WORDPRESS.COM を応援してくれることを願っています。

以下もご興味があるかもしれません:
  • スクロールバーに合わせてスライドするブログサイドバーモジュールの固定効果を実装する方法(js+jqueryなど)
  • 動的なサイドバーコードを実装するためのJavaScript
  • 動的サイドバーの例の JavaScript 実装の詳細な説明
  • js を使用してレスポンシブ サイドバーを作成する
  • JS はサイドバーのマウスオーバーポップアップボックス + バッファ効果を実装します
  • シンプルな非表示サイドバー機能を実現する JavaScript の例
  • slideout.js をベースにモバイル サイドバーのスライド効果を実装する
  • JS モーション フレームワーク共有サイドバー アニメーションの例
  • JavaScriptでシームレススクロールを実装し、サイドバーのサンプルコードに共有する
  • フルスクリーンサイドバーを実現するためのjs+css
  • JSは京東製品分類サイドバーを実現
  • 固定サイドバーを実現するためのJavaScript

<<:  Antdesign-vueとsortablejsを組み合わせて、2つのテーブルをドラッグして並べ替える機能を実現

>>:  JS を使用して要素が配列であるかどうかを判断する例

推薦する

NextCloud プライベート クラウド ストレージ ネットワーク ディスクの構築に関する詳細なチュートリアル

Nextcloud は、オープンソースで無料のプライベート クラウド ストレージ ネットワーク ディ...

MySQLコマンドプロンプトで入力エラーが発生したときに前のコマンドを修正する方法

目次現在の問題解決プロセス具体的な手順解決した事件現在の問題MySQL コマンド プロンプトに複数行...

Vueのref属性の詳細な説明

要約するこの記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS....

MySQL ビューの紹介と基本操作のチュートリアル

序文ビューは、データベース システム内で非常に便利なデータベース オブジェクトです。 MySQL 5...

Nginx 構成の実装 https

目次1: https証明書を準備する2: nginx sslモジュールを準備する3: SSL証明書を...

Vue+Elementバックグラウンド管理フレームワークの統合実践

目次Vue+ElementUI バックグラウンド管理フレームワークでは、ElementUI とは何で...

mysql エラー 1045 (28000) - ユーザーへのアクセスが拒否される問題を解決する方法

問題の説明 (以下の説明は Windows 環境に限定されます): D:\develop\ide\m...

ユーザーがフォームを繰り返し送信するのを防ぐ方法の概要

重複したフォーム送信は、マルチユーザー Web アプリケーションで最も一般的で厄介な問題です。重複送...

JavaScript のアンチシェイクとスロットリングの違いと実装

目次1. 手ぶれ補正2. スロットリング3. まとめ序文:フロントエンド開発者には、次の 2 つの要...

HTML の基本 - ハイパーリンク スタイルを設定する簡単な例

*** ハイパーリンクのスタイル設定の例a:link クリックされる前のハイパーリンクの状態a:vi...

after疑似要素を使用して中空の三角矢印とXアイコンを実装する例

フロントエンドのデザイン案では、「X」や「>」の形をした閉じるボタンや、他の 3 方向の白抜き...

Linux mysql-5.6 でルート パスワードをリセットする方法

1. MySQL サービスが起動しているかどうかを確認します。起動している場合は、MySQL サービ...

Linux で mysql-8.0.20 をインストールするための詳細なチュートリアル

** Linuxにmysql-8.0.20をインストールする**環境の紹介オペレーティングシステム:...

MySQL クエリ ステートメントのプロセスと EXPLAIN ステートメントの基本概念とその最適化

ウェブサイトやサービスのパフォーマンスは、データベースの設計(適切な言語開発フレームワークを選択した...

MySQL でテーブル メタデータ ロックを待機する理由と方法

MySQL が alter table などの DDL 操作を実行すると、テーブル メタデータ ロッ...