スマートCSSを使用して、ユーザーのスクロール位置に基づいてスタイルを適用します。

スマートCSSを使用して、ユーザーのスクロール位置に基づいてスタイルを適用します。

現在のスクロール オフセットを html 要素の属性に追加することで、現在のスクロール位置に基づいてページ上の要素のスタイルを設定できます。これを使用して、ページの上部に浮かぶナビゲーション コンポーネントを構築できます。

これが使用する HTML です。<header> コンポーネントは、下にスクロールしたときに常にページの上部に表示されるコンポーネントです。

<header>私はページのヘッダーです</header>
<p>ここにはたくさんのコンテンツがあります...</p>
<p>さらに美しいコンテンツ...</p>
<p>コンテンツ...</p>

まず、ドキュメントの「スクロール」イベントをリッスンし、ユーザーがスクロールするたびに現在の scrollY 値を取得します。

document.addEventListener('スクロール', () => {
  document.documentElement.dataset.scroll = window.scrollY;
});

スクロール位置を html 要素の data 属性に保存します。開発ツールを使用してDOMを見ると、次のようになります: <html data-scroll="0">
これで、このプロパティを使用してページ上の要素のスタイルを設定できるようになりました。

/* ヘッダータグが常に 3em よりも高くなるようにします */
ヘッダー {
  最小高さ: 3em;
  幅: 100%;
  背景色: #fff;
}

/* ページ上部のヘッダーの最小高さと同じ高さを維持します */
html:not([data-scroll='0']) 本文{
  パディングトップ: 3em;
}

/* ヘッダータグを固定配置モードに切り替えて、ページの上部に固定します*/
html:not([data-scroll='0']) ヘッダー {
  位置: 固定;
  上: 0;
  zインデックス: 1;

  /* box-shadow プロパティは浮遊効果を高めることができます */
  ボックスシャドウ: 0 0 .5em rgba(0, 0, 0, .5);
}

基本的にはこれで完了です。ユーザーが下にスクロールすると、ヘッダー タグは自動的にページから切り離され、コンテンツの上に浮かび上がります。 JavaScript コードはこれを気にしません。その役割は、スクロール オフセットをデータ属性に配置することです。 JavaScript と CSS の間に密結合がないため、これは完璧です。

しかし、主にパフォーマンスの面で、まだ改善できる領域がいくつかあります。

まず、ページが読み込まれたときにスクロール位置が上部にない状況に対応するために、JavaScript スクリプトを変更する必要があります。このような場合、ヘッダー タグは正しくレンダリングされません。

ページが読み込まれると、現在のスクロール オフセットをすばやく取得する必要があります。これにより、ページの現在の状態と常に同期していることが保証されます。

// 現在のページのスクロール位置を読み取り、ドキュメントのデータプロパティに保存します // スタイルシートで使用できるようにします const storeScroll = () => {
  document.documentElement.dataset.scroll = window.scrollY;
}

// スクロール イベントをリッスンします document.addEventListener('scroll', storeScroll);

// ページが初めて開かれたときにスクロール位置を更新します storeScroll();

次に、パフォーマンスの改善について見ていきます。 scrollY の位置を取得したい場合、ブラウザはページ上のすべての要素の位置を計算して、正しい位置を返すようにする必要があります。スクロールするたびに強制的に値を取得させないようにするのが最善でしょう。

これを実現するには、ブラウザが次のフレームを描画する準備ができるまでフェッチ要求をキューに入れるデバウンス メソッドが必要です。この時点で、ページ上のすべての要素の位置はすでに計算されているため、同じ作業を何度も繰り返すことはありません。

// debounce関数はカスタム関数をパラメータとして受け入れます const debounce = (fn) => {

  // これには requestAnimationFrame への参照が含まれているので、いつでも停止できます。let frame;
  
  // デバウンス関数は複数のパラメータを受け入れることができる新しい関数を返します return (...params) => {
    
    // フレームの値が存在する場合は、対応するコールバックをクリアします。if (frame) { 
      アニメーションフレームをキャンセルします。
    }

    // ブラウザが次のフレームを更新するときにコールバックを実行する frame = requestAnimationFrame(() => {
      
      // カスタム関数を実行し、パラメータを渡します fn(...params);
    });

  } 
};

// スクロール位置を読み取り、データ属性に保存します
// スタイルシートで使えるようにする
const storeScroll = () => {
  document.documentElement.dataset.scroll = window.scrollY;
}

// 新しいスクロールイベントをリッスンします。ここで `storeScroll` 関数をデバウンスします。
document.addEventListener('スクロール'、デバウンス(storeScroll));

// 初めてスクロール位置を更新します
ストアスクロール();

イベントをパッシブとしてマークすることで、スクロール イベントがタッチ操作 (Google マップなどのプラグインを操作する場合など) によってブロックされないことをブラウザに伝えることができます。これにより、ブラウザはイベントがブロックされないことを認識し、ページをすぐにスクロールできるようになります。

document.addEventListener('scroll', debounce(storeScroll), {passive: true });

パフォーマンスの問題が修正されたため、JavaScript を安定して使用して、取得したデータを CSS に取り込み、ページ上の要素のスタイル設定に使用できるようになりました。

CodePen のライブデモ

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

<<:  iframe ページで js 関数を呼び出すには js を使用します

>>:  MySQLインデックスが失敗するいくつかの状況の分析

推薦する

Nginx 経由で Tomcat9 クラスターを構築し、セッション共有を実現する

Nginx を使用して Tomcat9 クラスターを構築し、Redis を使用してセッション共有を実...

Zabbix は MySQL インスタンス メソッドを監視します

1. 監視計画監視項目を作成する前に、何を監視するのか、どのように監視するのか、監視データをどのよう...

MySQLデータベースにパスワードを入力した後にフラッシュバックする問題の解決策

パスワード入力後にMySQLデータベースがクラッシュする問題と解決策1 ケースの説明最近、基本的な機...

TypeScript でオブジェクト キーの値の範囲を制限する方法

TypeScript を使用する場合、TypeScript が提供する型システムを使用してコードのあ...

CSS で中空マスク レイヤーを実装するサンプル コード

この記事の内容: ページ中空マスクレイヤー、ページ中空マスクガイドレイヤー、画像中空マスク通常のマス...

Vueのコンポーネントのprops属性について詳しく説明します

目次質問1: 小道具は具体的にどのように使用されますか?原理は何ですか?下を見る質問 2: 年齢に ...

MySQL 一時テーブルの簡単な使用法

MySQL 一時テーブルは、一時的なデータを保存する必要がある場合に非常に便利です。一時テーブルは現...

CSS導入方法4つのまとめ(共有)

1. インライン参照:ラベルに直接使用されるが、メンテナンスコストが高い スタイル='フォ...

特定の MySQL テーブルの完全データと増分データをメッセージ キューに同期する - ソリューション

目次1. 当初の需要2. 解決策3. 運河の導入と設置運河の仕組み建築インストール4. 検証1. 当...

単一行関数と文字計算日付プロセス制御を説明する MySQL の例

目次1. キャラクター機能1. ケースコントロール機能2. キャラクターコントロール機能2. 数学関...

jQuery の CSS スタイル属性 css() と width() の完全ガイド

目次1. css() の基本的な使用法: 1.1 CSSプロパティを取得する1.2 CSSプロパティ...

Docker は Python Flask+ nginx+uwsgi コンテナを構築します

Nginxをインストールするまずcentosイメージをプルしますdocker pull centos...

ウェブサイトのハイパーリンクを開く方法に関する議論

新しいウィンドウが開きます。 利点: ユーザーがリンクをクリックしても、現在閲覧しているコンテンツは...

Ubuntu のインストール グラフィック ドライバーと Cuda チュートリアル

目次1. 元のドライバーをアンインストールする2. 新しいグラフィックカードドライバーをダウンロード...

ウェブサイトレイアウトにおける CSS の計算関数 calc の例

calc は数値を計算するために使用される CSS 関数です。長さ、角度、時間などを計算できます。 ...