Top

メモ書き

今日は表示・非表示するアニメーション。
表示する方だけでも使えるので、一部コピペでもどうぞ。
つくるのはこんな感じです。demo

JavaScriptで画面内にの出入りするときに表示・非表示するアニメーションを実装

まずHTMLから。

<ul class="box__list">
    <li>
        <dl>
            <dt>Lorem ipsum dolor sit amet consectetur adipisicing elit. </dt>
            <dd>
                <img src="" alt="画像">
            </dd>
        </dl>
    </li>
    <li>
        <dl>
            <dt>Lorem ipsum dolor sit amet consectetur adipisicing elit. </dt>
            <dd>
                <img src="" alt="画像">
            </dd>
        </dl>
    </li>
</ul>

scssはこちら。

.box__list {
    width: 90%;
    margin: 0 auto;

    li {
        margin-bottom: 2rem;

        dl {
            display: flex;
            justify-content: space-between;
            align-items: center;

            dt {
                width: 52%;
            }
            dd {
                width: 36%;
                @include trans;
                opacity: 0;

                &.isActive {
                    opacity: 1;
                }
            }
        }
        &:nth-child(even) {
            dl {
                flex-direction: row-reverse;
            }
        }
    }
}

条件を満たした<dd>(画像)にクラス名(isActive)をつけるようにしているので、opacityを仕込んでおきます。

そしてメインとなるjs

let targets = document.querySelectorAll('.box__list li dd'); //アニメーションさせたい要素
const topLine = Math.floor(window.innerHeight * .35);
const underLine = Math.floor(window.innerHeight * .68);

//スクロールイベント
window.addEventListener('scroll', function () {
	for(let i = 0; i < targets.length; i++) {
		let targetTop = Math.floor(targets[i].getBoundingClientRect().top); //ターゲット要素の位置を取得
		let targetBottom = Math.floor(targets[i].getBoundingClientRect().bottom); //ターゲット要素の位置を取得
		
		if (targetTop < underLine && topLine < targetBottom) { 
			targets[i].classList.add('isActive'); 
		} else {
			targets[i].classList.remove('isActive'); 
		}
	}
});

2,3行目の.35と.68は画面の何%でクラス名をつけたり消したりするかを指定しています。
あとは8,9行目でターゲットの上下の位置を取得して、それぞれがラインを超えた時に発火するようなイメージですね。

特定の要素が画面内に入ったらクラス名を付与してアニメーションを発火させる方法

ちなみに冒頭でお話しした、表示する方だけの時は下記jsでいけます。

$(window).on('load',function(){
    let targets = document.querySelectorAll('.box__list li dd');
    const underLine = Math.floor(window.innerHeight * .65);

    //スクロールイベント
    window.addEventListener('scroll', function () {
        for(let i = 0; i < targets.length; i++) {
            let targetTop = Math.floor(targets[i].getBoundingClientRect().top); //ターゲット要素の位置を取得

            if (targetTop < underLine) { 
                targets[i].classList.add('isActive'); 
            }
        }
    });
});

結構使いどこはあるかと。ぜひお役立てください。