本文へスキップ
  1. Web BENTO JS
  2. カテゴリ一覧
  3. スクロール出現
06 / REVEAL 12 パーツ

スクロール出現アニメーション 12選

コピペで動くスクロール出現(スクロールリビール)のサンプル集です。プレビューは枠の中だけをスクロールして動きを試せます。すべてscrollイベント不使用のIntersectionObserverで軽快に動作します。HTML / CSS / JS タブでコードを確認し、全部コピーを押せば1回の貼り付けで完成します。依存ライブラリなしのバニラJSdata-bnto-* 属性による自動初期化式です。

該当するパーツが見つかりませんでした。

↓ この枠内を下にスクロール

下からふわっと出現!
いちばん基本のフェードアップです。

フェードアップ

<!-- 出現させたい要素に class と data-bnto-rev を付けるだけ -->
<div class="bnto-rev" data-bnto-rev>
  ここに中身(テキスト・カード・画像など何でもOK)
</div>
<!-- 内側スクロール領域の中で使う場合のみ data-root="#その要素のセレクタ" を追加 -->
使い方のコツ

ページ内の複数要素にそれぞれ付けてOKです。translateY(24px)40px にすると動きが大きく、--dur を短くするとキビキビした印象になります。カードの装飾(背景や枠線)は自由に差し替えてください。

↓ この枠内を下にスクロール

← 左からスライドイン
右からスライドイン →

左右からスライドイン

<!-- .from-left / .from-right で出現方向を指定 -->
<div class="bnto-rev-side from-left" data-bnto-rev-side>
  左から出現する要素
</div>
<div class="bnto-rev-side from-right" data-bnto-rev-side>
  右から出現する要素
</div>
使い方のコツ

横にはみ出した初期状態がページの横スクロールを生むことがあるので、親要素(または body)に overflow-x: hidden を付けておくと安心です。画像とテキストを左右交互に出すレイアウトと好相性です。

↓ この枠内を下にスクロール

ズームイン出現!

ズームイン

<div class="bnto-rev-zoom" data-bnto-rev-zoom>
  ズームインで出現する要素
</div>
使い方のコツ

バッジ・CTAボタン・数字の実績など「主役」を1つだけ目立たせる用途に向いています。scale(.7).5 にすると勢いが増し、1.15(行き過ぎ量)を 1 にすると弾まない落ち着いた動きになります。

↓ この枠内を下にスクロール

1つ目が出て
2つ目が続き
3つ目で完成!

順番に出現(stagger)

<!-- 直下の子要素に自動で遅延が付く。data-step で間隔(秒)を変更可 -->
<div class="bnto-stagger" data-bnto-rev-stagger data-step="0.12">
  <div class="it">項目1</div>
  <div class="it">項目2</div>
  <div class="it">項目3</div>
</div>
使い方のコツ

特徴リスト・料金カード・メンバー紹介などのグリッドに最適です。項目が多いときは data-step="0.06" のように間隔を詰めると、待たせずにリズム感だけ残せます。

↓ この枠内を下にスクロール

ピントが合うように、ぼかしが解除されて出現します。

ブラー解除

<div class="bnto-rev-blur" data-bnto-rev-blur>
  <b>ピントが合う</b>ように出現する要素
</div>
使い方のコツ

filter: blur() は描画コストがやや高めの効果です。多数の要素に一斉適用せず、キャッチコピーやキービジュアルなど「ここ一番」に絞って使うと、印象と軽さを両立できます。

↓↑ この枠内を往復スクロール

REPEAT
上に戻して、もう一度下へ。何度でも出現します。

一度だけ/毎回 切替

<!-- data-once="false" にするとスクロールで戻すたびに再生(既定は一度だけ) -->
<div class="bnto-rev-re" data-bnto-rev-re data-once="false">
  <span class="tag">REPEAT</span><br>
  何度でも出現する要素
</div>
使い方のコツ

毎回再生は目を引きますが、本文中で多用するとうるさく感じられます。読み物ページでは既定の「一度だけ」を推奨します。毎回再生はループ動画的な装飾や、遊び心のあるLPのアクセントに向いています。

↓ この枠内を下にスクロール

スクロールに合わせて、 1行ずつ順番に テキストが現れます。

行ごとにテキスト出現

<!-- 出したい行ごとに .ln で区切る(遅延はJSが自動付与) -->
<p class="bnto-rev-lines" data-bnto-rev-lines>
  <span class="ln">1行目のテキスト</span>
  <span class="ln"><b>2行目は強調</b></span>
  <span class="ln">3行目のテキスト</span>
</p>
使い方のコツ

行の区切りは .ln で手動指定する設計です(自動分割は画面幅で折り返し位置が変わり崩れやすいため)。キャッチコピーやセクション見出しなど、行数が決まった短文に使ってください。

↓ この枠内を下にスクロール

デモ画像(グラデーション)

画像ふわっと表示

<!-- src は軽いプレースホルダ、data-src に本画像。読み込み完了(onload)でフェードイン -->
<img class="bnto-rev-img" data-bnto-rev-img loading="lazy"
  src="placeholder.jpg" data-src="photo.jpg"
  width="600" height="300" alt="写真の説明">
使い方のコツ

width/height 属性を必ず指定するとレイアウトシフト(CLS)を防げます。もっと早めに読み込み始めたいときは、observer のオプションに rootMargin: "200px" を足してください。デモの画像はCSSグラデのSVGで代用しています。

↓↑ この枠内を往復スクロール

背景の図形が少しずつ
遅れて
ついてきます。

軽量パララックス

<!-- data-speed=ついてくる割合(0.2〜0.5目安・大きいほどよく動く) -->
<div class="bnto-prlx" data-bnto-prlx>
  <span class="sp a" data-speed="0.2" aria-hidden="true"></span>
  <span class="sp b" data-speed="0.35" aria-hidden="true"></span>
  <span class="sp c" data-speed="0.5" aria-hidden="true"></span>
  <p class="cap">前景のコンテンツ</p>
</div>
<!-- 内側スクロール領域の中で使う場合のみ data-root="#その要素のセレクタ" を追加 -->
使い方のコツ

動かすのは transform のみ・計算は requestAnimationFrame で1フレーム1回に間引き・画面外では停止、と軽さ重視の構成です。data-speed0.2〜0.5程度の控えめな値が上品に見えます。図形の数は2〜3枚までにし、テキストの可読性を邪魔しない薄い色(opacity)で使ってください。

↓ この枠内を下にスクロール

セクション1
青みの背景

セクション2
緑の背景に変化

セクション3
オレンジに変化

セクション背景色モーフ

<!-- 親に data-bnto-bgmorph、各セクションに data-bg="色" を指定 -->
<div class="bnto-bgmorph" data-bnto-bgmorph>
  <div class="sec" data-bg="hsl(199 80% 52%)">セクション1</div>
  <div class="sec" data-bg="hsl(150 58% 42%)">セクション2</div>
  <div class="sec" data-bg="hsl(26 90% 55%)">セクション3</div>
</div>
<!-- 内側スクロール領域の中で使う場合のみ data-root="#その要素のセレクタ" を追加 -->
使い方のコツ

各セクションの data-bg に指定した色へ、スクロールに応じてなめらかに切り替わります。ページ全体で使う場合は複数の <section> を縦に並べて親要素にまとめてください。色数は3〜5程度に絞ると、どこを読んでいるか分かりやすいままになります。

↓ この枠内を下にスクロール

カーテンが開いて
中身が現れます

COVER

カーテン開きリビール

<!-- .curtain-cover が見えたタイミングで横にスライドして中身が現れる -->
<div class="bnto-curtain" data-bnto-curtainreveal>
  <p class="cap">画像やボックスの中身</p>
  <div class="curtain-cover"></div>
</div>
使い方のコツ

.curtain-cover の背景色をサイトのベースカラーに合わせると馴染みます。画像に使う場合は .bnto-curtain の中に <img> を敷き詰めるだけでOKです。translateX(-100%)translateY(-100%) にすれば上に開く演出にもなります。

↓ この枠内を下にスクロール

  • STEP 1お問い合わせ
  • STEP 2ヒアリング
  • STEP 3制作・実装
  • STEP 4公開・納品

伸びるタイムライン

<!-- li を工程の数だけ並べ、最後に空の span.bar を1つ置く -->
<ul class="bnto-tl" data-bnto-timelinegrow>
  <li><b>STEP 1</b>お問い合わせ</li>
  <li><b>STEP 2</b>ヒアリング</li>
  <li><b>STEP 3</b>制作・実装</li>
  <li><b>STEP 4</b>公開・納品</li>
  <span class="bar"></span>
</ul>
<!-- 内側スクロール領域の中で使う場合のみ data-root="#その要素のセレクタ" を追加 -->
使い方のコツ

採用フロー・制作の流れ・料金プランの手順など、3〜5ステップ程度の工程紹介に向いています。ステップ数が多いページでは、線の伸びを追いやすいよう1画面に収まる高さに調整すると読みやすくなります。

スクロール出現アニメーションの基礎知識

スクロール出現(スクロールリビール)は、ページを読み進めるのに合わせてコンテンツをふわっと表示させる演出です。「読む→現れる」のリズムが生まれ、LPやコーポレートサイトの印象がぐっと上質になります。このページのサンプルはすべて依存ライブラリなしのバニラJavaScriptです。jQueryもAOSなどのプラグインも不要です。

使い方は、HTML / CSS / JSの3タブをそれぞれ貼り付けるか、「全部コピー」ボタンでひとまとめになったコードを1回貼り付けるだけです。初期化は data-bnto-* 属性の自動検出式なので、同じページに何個置いても、うっかりコードを2回貼っても壊れません。

IntersectionObserverがscrollイベントより軽い理由

従来の scroll イベント方式は、スクロールのたびにハンドラが発火し、getBoundingClientRect() などで要素の位置を毎回計算する必要がありました。これはメインスレッドを占有し、スクロールのカクつき(ジャンク)の原因になります。IntersectionObserver「要素が見えたかどうか」の判定をブラウザ側が非同期で行い、変化したときだけ通知してくれるAPIです。JS側は通知を受けてクラスを付けるだけなので、監視対象が増えても負荷がほとんど変わりません。

使いすぎに注意(動きは「ここぞ」で)

すべての要素をアニメーションさせると、ユーザーは「表示待ち」を強いられ、かえって読みにくくなります。1画面につき1〜2カ所、セクションの見出しやキービジュアルなど視線を集めたい場所に絞るのがコツです。また filter: blur() のような描画コストの高い効果は多用を避け、透明度と位置(opacity / transform)中心の軽い効果を基本にしましょう。

prefers-reduced-motion への配慮

OSの設定で「視差効果を減らす」を選んでいるユーザーには、動きの大きな演出が不快感や体調不良(前庭障害など)につながることがあります。このページのサンプルはすべて matchMedia('(prefers-reduced-motion: reduce)') で設定を判定し、該当ユーザーにはアニメーションなしで即表示するフォールバックを実装済みです。コピペするだけでアクセシブルな挙動になります。

「全部コピー」と「分けて貼る」の使い分け

「全部コピー」を使うと、HTML・CSS・JavaScriptがひとつの自己完結ブロックとしてコピーされるので、1回の貼り付けだけですぐ動きを確認できます。動作のお試しや、1ページ完結のLPに組み込むときはこの方法が手軽です。

一方、本番サイトへ本格的に組み込む場合は、CSSはスタイルシート(.cssファイル)へ、JavaScriptは</body>直前や共通の.jsファイルへ、HTMLは使いたい場所へと分けて貼るのが一般的です。スタイルとスクリプトを1か所に集約できるため、複数ページ・複数パーツで使い回すときの管理がしやすく、ブラウザのキャッシュも効きやすくなります。なお、同じパーツをページ内で何度も使う場合でも、CSSとJSを貼るのは1回だけで大丈夫です(初期化スクリプトが該当要素すべてに自動で効きます)。

よくある質問

コピーしたコードはそのまま動きますか?
はい。「全部コピー」を押すとHTML・CSS・JSがひとつの自己完結ブロックになってコピーされ、ページに貼り付けるだけで動きます。ライブラリの読み込みは一切不要です。
scrollイベントではなくIntersectionObserverを使うのはなぜですか?
scroll イベントはスクロールのたびに発火して要素の位置計算が必要ですが、IntersectionObserver は要素が見えた瞬間だけブラウザが非同期で通知してくれるため、メインスレッドの負荷が小さく、スクロールがカクつきません。
一度表示したあと、もう一度アニメーションさせられますか?
できます。「一度だけ/毎回 切替」パーツのように、画面外に出たら is-view クラスを外す実装にすると、スクロールで戻すたびに再生されます。既定では unobserve して一度だけの再生にしています。
アニメーションが苦手なユーザーへの配慮はありますか?
すべてのサンプルは prefers-reduced-motionmatchMedia で判定し、OSで「視差効果を減らす」を設定しているユーザーにはアニメーションなしで即表示するフォールバックを実装しています。
このページのパーツはAIコーディングツールでも使えますか?
はい。Claude CodeやCursorのようにWebページを読めるAIには、このページのURLとパーツ名(例:「左右からスライドイン」)を伝えるだけで実装を指示できます。AIがWebを読めない場合は、「全部コピー」で取得した自己完結ブロックをチャットに貼り付けて調整を頼むのが確実です。改変後のコードは、公開前に動作確認することをおすすめします。

関連カテゴリ

スクロール出現と組み合わせて使いやすいパーツはこちらです。