OmochiXを検索

Esc で閉じる

スクロール演出 #014

追従ヘッダー Sticky header

スクロールすると細くなって追従する

ページを下へスクロールすると、ヘッダーが少し薄く・影付きになって上に貼り付き、内容がその下を流れます。

調整する

値を変えるとプレビューに反映され、「プロンプトをコピー」「コードをコピー」も調整後の内容になります。

AIへの頼み方

ヘッダーをスクロールで追従させて。少しスクロールしたら高さを縮めて、影を付けて。

動きの仕様

  • ヘッダーは position: sticky; top: 0
  • スクロール量が8pxを超えたら .is-scrolled を付ける(scrollイベントは passive)
  • .is-scrolled で高さ 72px→56px、box-shadow を付ける。遷移は約0.2秒
  • 本文側の見出しには scroll-margin-top をヘッダー分だけ付ける

使いどころ

長いページで常にナビへ戻れるようにしたいとき。

コピーされるプロンプト全文を見る
「追従ヘッダー(Sticky header)」の動きを実装してください。
OmochiX Learn の動く見本 #014(スクロール演出)です。

頼み方の例: ヘッダーをスクロールで追従させて。少しスクロールしたら高さを縮めて、影を付けて。
どんな動きか: スクロールすると細くなって追従する
見本で起きること: ページを下へスクロールすると、ヘッダーが少し薄く・影付きになって上に貼り付き、内容がその下を流れます。
仕様:
- ヘッダーは position: sticky; top: 0
- スクロール量が8pxを超えたら .is-scrolled を付ける(scrollイベントは passive)
- .is-scrolled で高さ 72px→56px、box-shadow を付ける。遷移は約0.2秒
- 本文側の見出しには scroll-margin-top をヘッダー分だけ付ける
使いどころ: 長いページで常にナビへ戻れるようにしたいとき。
調整した値:
- スクロールの1周期は4.5s(既定)
- スクロール後のヘッダーの高さは32px(既定)
- 影の濃さは0.12(0〜1)(既定)
- ロゴの色: #6e4bff(既定)

実装の条件:
- HTML / CSS(必要なら素のJavaScript)で、外部ライブラリは使わない
- 見本の形・タイミング・イージングの数値はそのまま使い、文字・色・素材だけ今作っているものに合わせる
- prefers-reduced-motion: reduce の環境では動きを止めるか最小限にする
- 使った技術: CSS

見本(動くプレビューと参考コード): https://omochix.com/learn/motion/sticky-header/

コード

プレビューで動いているものと同じコードです。HTMLに貼り付ければそのまま動きます。

HTML / CSS / JavaScript
<!-- 追従ヘッダー (Sticky header) | OmochiX Learn 動く見本 #014 | https://omochix.com/learn/motion/sticky-header/ -->

<style>
.sh{position:relative;width:240px;height:160px;overflow:hidden;border-radius:12px;background:var(--surface);border:1px solid var(--line)}
.sh__bar{position:absolute;z-index:1;inset:0 0 auto 0;display:flex;align-items:center;justify-content:space-between;height:44px;padding:0 14px;background:var(--surface);border-bottom:1px solid var(--line);animation:sh-bar var(--p-cycle,4.5s) cubic-bezier(.65,0,.35,1) infinite}
.sh__logo{width:60px;height:12px;border-radius:6px;background:var(--p-color,var(--primary))}
.sh__nav{width:80px;height:8px;border-radius:4px;background:var(--line)}
.sh__page{display:grid;gap:12px;padding:58px 14px 14px;animation:sh-scroll var(--p-cycle,4.5s) cubic-bezier(.65,0,.35,1) infinite}
.sh__page i{display:block;height:44px;border-radius:8px;background:var(--bg);border:1px solid var(--line)}
@keyframes sh-scroll{0%,15%{transform:translateY(0)}65%,85%{transform:translateY(-180px)}100%{transform:translateY(0)}}
@keyframes sh-bar{0%,15%{height:44px;box-shadow:none}30%,85%{height:var(--p-compact,32px);box-shadow:0 6px 18px rgba(0,0,0,var(--p-shadow,.12))}100%{height:44px;box-shadow:none}}
</style>

<div class="sh"><header class="sh__bar"><span class="sh__logo"></span><span class="sh__nav"></span></header><div class="sh__page"><i></i><i></i><i></i><i></i><i></i><i></i></div></div>