スマート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を使用してタイマー機能を実装する

この記事の例では、タイマー機能を実装するためのVueの具体的なコードを参考までに共有しています。具体...

Nginx/Httpd ロードバランシング Tomcat 設定チュートリアル

前回のブログでは、Nginx と httpd を使用して、逆生成用のバックエンド Tomcat サー...

SQL 実践演習: オンライン モール データベースの製品カテゴリ データ操作

オンラインショッピングモールデータベース - 商品カテゴリデータ操作(I)プロジェクトの説明電子商取...

CentOS MySQLデータベースのスケジュールバックアップを実装する方法

次のスクリプトは、MySQLデータベース全体のスケジュールされたバックアップに使用されます。 mys...

html+css3で実装されたログインインターフェース

成果を達成するまずHTMLを使って基本的なフレームワークを構築します <本文> <...

TypeScript 環境を構築して VSCode にデプロイする詳細な手順

目次TypeScript環境の構築ステップ1: Taobaoミラーをダウンロードするステップ2: T...

vue3ソースコード解析の簡単な実装方法

目次序文🍹準備🍲vue3 の使い方🍖 実装要約する序文最近、私の最初の公式 vue3 + ts プロ...

MySQL の大文字と小文字の区別に関する注意

目次MySQLの大文字と小文字の区別はパラメータによって制御されますMySQLの大文字と小文字の区別...

ミニマルなウェブサイトデザインの例

Web アプリケーション クラス1. みんなのためにダウンまたは私だけのためにこのウェブサイトは、ウ...

Linux でスワップ領域を確認する 5 つのコマンドの概要

序文Linux では、スワップ パーティションとスワップ ファイルの 2 種類のスワップ領域を作成で...

Centos は chrony 時間同期サーバー プロセス図を構築します

私の環境: 3 centos7.5 1804マスター 192.168.100.140ノード1 192...

WeChatアプレットの世界的な状況の詳細な説明

序文WeChat アプレットでは、App.js の globalData を中間ブリッジとして使用し...

MySQL関数の簡単な紹介

目次1. 数学関数2. 文字列関数3. 日付関数4. 暗号化機能主な MySQL 関数は次のように紹...

MySQL インポートおよびエクスポートのバックアップの詳細

目次1. MySQLのバックアップタイプの詳細な説明1. バックアップがデータベースに与える影響に基...

JS オブジェクトのコピー (ディープ コピーとシャロー コピー)

目次1. 浅いコピー1. Object.assign(ターゲット、ソース、ソース...) 2. スプ...