スマート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インデックスが失敗するいくつかの状況の分析

推薦する

vue v-for ループ オブジェクトの属性

目次1. ループオブジェクト内の値2. ループオブジェクト3. キーと値のループ1. ループオブジェ...

Vue スキャフォールディング プロジェクトを作成するための詳細な手順

vue スキャフォールディング -> vue.cli大規模で完全に機能する Vue プロジェク...

Linux システムでのユーザー管理の概要

目次1. ユーザーとユーザーグループの重要性1) ユーザーの存在意義2) ユーザーグループの重要性2...

GolangでMySQLデータベースを操作するための実装コード

序文Golang は、SQL データベースにアクセスするための database/sql パッケージ...

MYSQL マスタースレーブ レプリケーションの知識ポイントの概要

単一の MYSQL サーバーが現在の Web サイトのトラフィックに対応できない場合の最適化ソリュー...

MySQLにおけるビューの作成(CREATE VIEW)と使用制限の詳しい説明

この記事では、例を使用して、MySQL ビューの作成 (CREATE VIEW) と使用上の制限につ...

DIVマスクを使用して、マウスでチェックボックスを直接チェックすることが無効である問題を解決します

フロントエンドの開発過程で、チェックボックスが必要な状況が発生しました。ユーザー操作の利便性を考慮し...

vscodeを使用してuniappを開発する方法

私はフロントエンド プロジェクトの開発に常に vscode を使用してきたため、現在ではいくつかの小...

MySQL 5.7 クラスタ構成手順

目次1. サーバーAのmy.cnfファイルを変更する2. サーバーBのmy.cnfファイルを変更する...

MySQL 5.7 における基本的な JSON 操作ガイド

序文プロジェクトのニーズにより、ストレージ フィールドは JSON 形式で保存されます。プロジェクト...

正規表現に基づくあいまい文字列置換を実装するMySQLの方法の分析

この記事では、例を使用して、MySQL を使用して正規表現に基づくあいまい文字列置換を実装する方法を...

NetEase ブログで使用されているシンプルな Web ページ コード

NetEase Blog でコードを使用する方法: まずブログにログインし、ブログのホームページの左...

ffmpeg 中国語パラメータの詳細な説明

FFMPEG 3.4.1 バージョンパラメータの詳細使用方法: ffmpeg [オプション] [[入...

Vueは小さな天気予報アプリケーションを実装します

これは私が Vue フレームワークを独学していたときに真似したウェブサイトです。いくつかの都市の天気...

MySQL 8.0.11 MacOS 10.13 のインストールと設定方法のグラフィックチュートリアル

MacにMySQLデータベースをインストールし、環境変数を設定する手順を参考までに記録します。具体的...