↓ この枠内を下にスクロール
いちばん基本のフェードアップです。
<!-- 出現させたい要素に class と data-bnto-rev を付けるだけ --> <div class="bnto-rev" data-bnto-rev> ここに中身(テキスト・カード・画像など何でもOK) </div> <!-- 内側スクロール領域の中で使う場合のみ data-root="#その要素のセレクタ" を追加 -->
.bnto-rev { --c1: hsl(187 64% 46%); /* アクセント色 */ --dur: .6s; /* 出現スピード */ background: #fff; border: 2px solid #DFE9F1; border-left: 5px solid var(--c1); border-radius: 12px; padding: 13px 15px; /* 初期状態:透明+下に24pxずらしておく */ opacity: 0; transform: translateY(24px); transition: opacity var(--dur) ease, transform var(--dur) ease; } .bnto-rev.is-view { opacity: 1; transform: none; } /* 動きが苦手な人には即表示 */ @media (prefers-reduced-motion: reduce) { .bnto-rev { transition: none; } }
// data-bnto-rev を自動検出して監視(複数設置OK・二重実行OK) (function () { var reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches; document.querySelectorAll('[data-bnto-rev]').forEach(function (el) { if (el.dataset.bntoInit) return; el.dataset.bntoInit = '1'; // 「視差効果を減らす」設定 or 非対応ブラウザは即表示 if (reduce || !('IntersectionObserver' in window)) { el.classList.add('is-view'); return; } // root は通常 null(ページ全体基準)。data-root="#セレクタ" 指定時はその要素基準(このページのデモはミニ枠を指定) var root = el.dataset.root ? document.querySelector(el.dataset.root) : null; var io = new IntersectionObserver(function (entries) { entries.forEach(function (en) { if (!en.isIntersecting) return; en.target.classList.add('is-view'); io.unobserve(en.target); // 一度表示したら監視解除 }); }, { root: root, threshold: 0.2 }); io.observe(el); }); })();
使い方のコツ
ページ内の複数要素にそれぞれ付けてOKです。translateY(24px) を 40px にすると動きが大きく、--dur を短くするとキビキビした印象になります。カードの装飾(背景や枠線)は自由に差し替えてください。