OmochiXを検索

Esc で閉じる

スクロール演出 #013

スクロールでフェードイン Fade-in on scroll

画面に入った要素だけ順番に現れる

ページがゆっくりスクロールし、画面に入ってきたセクションから順に、下からふわっと現れます。

調整する

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

AIへの頼み方

LPの各セクションを、スクロールして画面に入ったときにフェードインさせて。16px下から0.5秒で。

動きの仕様

  • 初期状態は opacity: 0; transform: translateY(16px)
  • IntersectionObserver(threshold 0.2 程度)で画面に入ったら .is-visible を付ける
  • .is-visible で opacity: 1; translateY(0) へ約0.5秒、ease-out。1回だけ再生する
  • prefers-reduced-motion の環境では最初から表示状態にする

使いどころ

LP・紹介ページ・記事内の図版など、縦に長いページ全般。

コピーされるプロンプト全文を見る
「スクロールでフェードイン(Fade-in on scroll)」の動きを実装してください。
OmochiX Learn の動く見本 #013(スクロール演出)です。

頼み方の例: LPの各セクションを、スクロールして画面に入ったときにフェードインさせて。16px下から0.5秒で。
どんな動きか: 画面に入った要素だけ順番に現れる
見本で起きること: ページがゆっくりスクロールし、画面に入ってきたセクションから順に、下からふわっと現れます。
仕様:
- 初期状態は opacity: 0; transform: translateY(16px)
- IntersectionObserver(threshold 0.2 程度)で画面に入ったら .is-visible を付ける
- .is-visible で opacity: 1; translateY(0) へ約0.5秒、ease-out。1回だけ再生する
- prefers-reduced-motion の環境では最初から表示状態にする
使いどころ: LP・紹介ページ・記事内の図版など、縦に長いページ全般。
調整した値:
- 下からの移動量は16px(既定)
- セクションごとに0.9sずつ遅らせる(既定)
- スクロールの1周期は5s(既定)
- 動き方は「なめらか」(既定)

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

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

コード

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

HTML / CSS / JavaScript
<!-- スクロールでフェードイン (Fade-in on scroll) | OmochiX Learn 動く見本 #013 | https://omochix.com/learn/motion/scroll-fade-in/ -->

<style>
.sf{width:240px;height:160px;overflow:hidden;border-radius:12px;background:var(--surface);border:1px solid var(--line)}
.sf__page{display:grid;gap:14px;padding:14px;animation:sf-scroll var(--p-cycle,5s) cubic-bezier(.65,0,.35,1) infinite}
.sf__sec{display:grid;gap:8px;padding:12px;border-radius:10px;background:var(--bg);border:1px solid var(--line);opacity:0;transform:translateY(var(--p-distance,16px));animation:sf-in var(--p-cycle,5s) var(--p-ease,ease-out) calc(var(--i) * var(--p-stagger,.9s)) infinite}
.sf__sec b{display:block;height:34px;border-radius:8px;background:linear-gradient(135deg,var(--primary),var(--blue));opacity:.85}
.sf__sec i{display:block;height:8px;width:70%;border-radius:4px;background:var(--line)}
@keyframes sf-scroll{0%,12%{transform:translateY(0)}70%,88%{transform:translateY(-200px)}100%{transform:translateY(0)}}
@keyframes sf-in{0%,6%{opacity:0;transform:translateY(var(--p-distance,16px))}16%,80%{opacity:1;transform:translateY(0)}92%,100%{opacity:0;transform:translateY(var(--p-distance,16px))}}
</style>

<div class="sf"><div class="sf__page"><section class="sf__sec" style="--i:0"><b></b><i></i></section><section class="sf__sec" style="--i:1"><b></b><i></i></section><section class="sf__sec" style="--i:2"><b></b><i></i></section><section class="sf__sec" style="--i:3"><b></b><i></i></section></div></div>