scroll
section color swap / background color transition on scroll
スクロールでセクションに差しかかると、ページ全体の背景色がなめらかに切り替わる演出。1ページの中でセクションごとに世界観を切り替えられ、章立ての体感が生まれる。実装はCSS変数の書き換えとtransitionだけで軽い。
02 — Prompt template
03 — Params
duration(遷移時間 s) — 範囲 0.2〜2 / 初期 0.8
0.6〜1sがなめらか。0.3s以下はパキッと切り替わり、1.5sを超えると次のセクションに色が追いつかない。trigger(切替タイミング) — 範囲 0.1〜0.9 / 初期 0.4
次セクションがビューポートにどれだけ入ったら切り替えるか(IntersectionObserverのthreshold)。0.3〜0.5が自然。
04 — Vocab
IntersectionObserver — 要素のビューポート進入を非同期で検知するAPI。scrollイベントの毎フレーム計算より軽く、この演出の標準装備。
threshold — 要素が何割見えたら発火するかの設定。切替タイミングの調整はここで行う。
CSS変数(カスタムプロパティ) — --bgのようにJSから1箇所書き換えれば全体に波及する値。JSの状態をCSSへ橋渡しする配線になる。
transition: background-color — 色の補間はブラウザに任せる指定。JSで毎フレームRGBを計算する必要はなく、ページ全体1枚なら負荷も軽い。
05 — NG → OK examples
NG
言い方: 「「スクロールで背景の色が変わるようにして」」
なぜNG: scrollイベントで毎フレーム位置計算して色をJSで補間する重い実装や、セクションごとに背景を塗り分けただけで境目がぶつ切りになる実装が返ってくる。切替タイミングも遷移時間も決まらない。
OK
言い方: 「「section color swapを実装。背景はbody1枚+CSS変数--bg、各セクションのdata-bgをIntersectionObserver(threshold 0.4)で検知して書き換え、transition 0.8s ease。文字色も同時に切り替えてコントラスト維持」」
なぜOK: 検知方法(IO)・状態の持ち方(CSS変数1枚)・数値まで指定している。「body1枚で管理」の一言で、境目がぶつ切りになる塗り分け実装を防げる。
