
みんな大好きスクロールアクションの1つのやり方です。
jQueryで書いたり、プラグイン入れたりする人多いと思います。
が個人的なやり方の1提案です。
スクロールアクションのやり方
やり方1 プラグインを使う
有名なのは inview.jsですね。
はGITなのでダウンロードして使ってみましょう inview.js
ブラウザ表示領域に入ったらinviewがクラスつけてくれるので、クラスがついたらcssアニメーションかけてフワッとさせるやつです。
やり方は簡単、CDN読む→JS書く→CSSでアニメ作る ですね。
HTML
headかbody下でjs読む
<script src="js/jquery-3.5.1.min.js"></script>
<script src="js/jquery.inview.min.js"></script>
<div class="scroll">スクロールする部分</div>
CSS
// actが付いたらオパシティ1して表示
.scroll{
opcity:0;
transition: all .3s ease;
}
.act{
opacity:1;
}
JS
//scrollが表示領域に入ったらactを追加する
$(function() {
$('.scroll').on('inview', function(event, isInView) {
if (isInView) {
// .actがビューポートに入った場合
$(this).addClass('act');
} else {
// .actが表示領域から抜けた場合
$(this).removeClass('act');
}
});
});
やり方2 JQueryのみ
JQueryのみ読み込んで、スクロール量で判別。
スクロールした量が、元々いた位置より大きくなればactをつけるみたいな感じのこと書いてます。
function scrollAnimation() {
$(window).scroll(function () {
$(".scroll").each(function () {
let t = $(this).offset().top;
$(window).scrollTop() > t - $(window).height() + 200 && $(this).addClass("act")
})
})
}
やり方3 JSのみ
色々書いてますが、下の方のtargetsでクラスをして上のほうのclassList.addで何のクラスをつけるか指定するだけ。
動きはcssで書きます。
ライブラリ読み込みが必要ないので軽くなるし、ライトハウスにレンダリングの話もされません。
const setObserver = () => {
const callback = (entries) => {//各 entry(IntersectionObserverEntry オブジェクト)に対して
entries.forEach((entry) => {//監視対象の要素が領域内に入った場合の処理
if (entry.isIntersecting) {
entry.target.classList.add('act');
}
});
}
const options = {
threshold: [.2, 1]
}
const observer = new IntersectionObserver(callback, options); //引数にコールバック関数とオプションを指定してオブザーバーを生成
const targets = document.querySelectorAll('.scroll'); //監視対象の要素(target クラスを指定した要素)を全て取得
targets.forEach((elem) => {
observer.observe(elem); //observe() に監視対象の要素を指定
});
}
おすすめはJSのみ
ReactでJQとかプラグインの読み込みが面倒だったので色々調べてたらjsのみのやつがあったので使いました。
簡単だし軽いのでいいことばかりです!