これでCSSのみで実装できる! スクロール方向に合わせてヘッダを非表示・表示する方法を解説

Webページを表示し、スクロールダウンするとヘッダが非表示になり、ページのどこからでもスクロールアップするとヘッダが再び表示される、というのを見たことがあると思います。

これまでは実装するにはJavaScriptが必要でしたが、CSSのみで実装できる方法を紹介します。

スクロール方向に合わせてヘッダを非表示・表示する方法を解説

Solved by CSS Scroll-Driven Animations: hide a header when scrolling down, show it again when scrolling up.
by Bramus!

下記は各ポイントを意訳したものです。
※当ブログでの翻訳記事は、元サイト様にライセンスを得て翻訳しています。

はじめに

CSSでヘッダをスクロールダウンで非表示に、スクロールアップで表示するときにこのテクニックを知っておくと便利です。

特定の条件下でCSSプロパティにtransition-delayを追加すると(スタイルクエリを使用して実行)、条件が適用されなくなった後でもその値を持続させることができます。

See the Pen
Hide on Scroll Down, Show on Scroll Up Header
by coliss (@coliss)
on CodePen.

CSS Scroll-Driven Animationsでスクロール方向を検出する

Solved by CSS Scroll-Driven Animationsの記事にアクティブなスクロール方向とスクロール速度に基づいた要素をスタイルするデモがあります。その中の一つに、スクロールダウンした時に非表示になるヘッダ要素があります。

下記はそのデモで、上下にスクロールするとヘッダが非表示になり、アイドル状態の時は再び表示されます。デモはChrome 115+でご覧ください。

See the Pen
CSS scroll-direction detection with Scroll-Driven Animations with moving header
by coliss (@coliss)
on CodePen.

CSS Scroll-Driven Animationsについて詳しくは、下記をご覧ください。

スクロールをトリガーにしたアニメーションを実装する方法

Scroll-driven AnimationsでCSSでの実装が大きく変わる! スクロールをトリガーにしたアニメーションを実装する方法

このデモのCSSには、特定の方向にスクロールしているときに01になるCSSの変数があります。CSSは下記の通りです。

transition-delayプロパティを使ったテクニック

記事で解説したように、これらの変数は一時的なものです。スクロールを止めた瞬間に--when-not-scrollingを除くすべての変数は再び0に戻ります。したがって、ヘッダはスクロールを止めると再び表示されます。

よりよいエクスペリエンスとしては、下にスクロールするときにヘッダを非表示にし、再び上にスクロールする瞬間までその状態を維持させることです。しかし、当時はそれを実現する解決策は見つかりませんでした。

CSS Day 2024Scheppはこれらのカスタムプロパティを「固定」する方法を見つけたことを共有しました。そのテクニックは、特定の方向にスクロールするときにプロパティのtransition-durationを長く設定することです。

下記のCSSがそれです。アイドル状態のときにトランジションが無期限に停止します。こうすることで--scroll-*カスタムプロパティは再びスクロールを開始するまでその値を保持します。

ヘッダをスクロール時に表示・非表示されるデモ

このテクニックをすぐに使用する時間がなかったのですが、Fabrizio CalderanからXのポストで連絡がありました。それが下記のデモです。

ヘッダは最初は表示されていて、スクロールダウン時に非表示に、そしてどの場所でもスクロールアップ時に表示されます。

See the Pen
Hide on Scroll Down, Show on Scroll Up Header
by coliss (@coliss)
on CodePen.

Fabrizioはスタイルクエリで設定するトランジションビヘイビアを利用して、Scheppが提案したものと同じテクニックを作成しました。

これは素晴らしいです!

デモを試してみると分かると思いますが、100%完璧というわけではありません。スクロールダウンしてすぐにスクロールアップすると、ヘッダが隠れたままになることがあります。このことからScroll-Driven Animationsに頼るのではなく、ブラウザ自体がスクロール方向を表示する必要があることが分かりました。現在のところ、Scroll State Containerを使用することを考えています。

sponsors

top of page

©2024 coliss