스크롤로 움직이는 구조 검증【Javascript】【탈jQuery】

소개



화면을 스크롤로, 뭔가의 요소가 떠오르거나, 반응하는 구조를, JQuery 없이 만드는데,
구체적으로 요소가 어떻게 판정되고 있는지를 검증하는 것입니다.

또, 움직임의 요소에 코딩 종료 후에 클래스를 덧붙임으로써, 움직임을 일괄해 구현할 수 있으므로
제작 속도가 향상됩니다.

동작 데모



See the Pen 스크롤 판정 데모 by masato yamada ( @marchin133 )
on CodePen .


스크롤 측정



스크롤은 window.pageYOffset 로 취득.



판정하고 싶은 요소의 계측



getBoundingClientRect().top 에서, 판정하고 싶은 요소의 상부의, HTML의 맨 위로부터의 높이를 알 수 있다.



판정 로직





javascript



document.addEventListener("DOMContentLoaded", function () {

    let windowHeight = document.getElementById('windowHeight');
    let scrollVolume = document.getElementById('scrollVolume');
    let markerLine = document.getElementById('markerLine');
    let markerLinetext = document.getElementById('markerLinetext');

    //動かす要素を探す
    let fadeConts = document.querySelectorAll('.anime');
    //動かす要素の配列を作る
    let moveConts = [];


    //windowの高さ & リサイズされたら再取得
    let windowH = window.innerHeight;
    window.addEventListener('resize', function () {
        windowH = window.innerHeight;
        windowHeight.textContent = windowH;
    }, false);

    windowHeight.textContent = windowH;

    //動かす要素の位置情報を取得しておく
    for (let i = 0; i < fadeConts.length; i++) {
        let rect = fadeConts[i].getBoundingClientRect().top;
        moveConts.push(rect);
        fadeConts[i].textContent = rect;
    }

    // marker
    // 画面の下からXpxのライン

    let markerLineVolume = windowH - (windowH / 4);
    markerLinetext.textContent = markerLineVolume;

    markerLine.style.top = markerLineVolume + 'px';

    //画面スクロールしたときに呼び出される
    window.addEventListener('scroll', function () {

        //スクロール位置
        let scrollDepth = window.pageYOffset;
        scrollVolume.textContent = scrollDepth;

        //判定位置は、スクロール量に伴ってそのままずれる
        markerLine.style.top = markerLineVolume + scrollDepth + 'px';

        //判定位置
        let markerLineNum = markerLineVolume + scrollDepth;

        for (let i = 0; i < moveConts.length; i++) {
            if (markerLineNum > moveConts[i]) {
                fadeConts[i].classList.add("show");
                console.log(i + "が超えた");
                //console.log(moveConts[0]);
                //console.log(windowHeight);
                //console.log(moveConts[i]);
            } else {
                //fadeConts[i].classList.remove("show");
            }
        }


    }, { passive: true });



}, false);


스크롤량의 생각



당연한 것 같아, 의외로 나는 빠져 버렸습니다.

스크롤량과 판정 요소의 관계로부터, 화면에 대해서 아래에 스크롤량이 발생하는 것 같은 감각이었습니다만,

화면의 윈도우의 상부에 스크롤량이 발생하는 이미지로 생각하면 알기 쉽습니다.



판정하는 요소가, 브라우저 화면의 하단(실제로는 화면의 비율 등으로 판정 위치는 바뀌는 것이 많다고 생각합니다만 그것도 예에는 포함하고 있습니다)

에 이르고 있다는 것은, 스크롤량만으로는 부족하고, 스크롤량에, 화면의 높이를 더한 것이, 판정 위치가 됩니다.



예:

판정 위치의 요소가 2000px 위치에 절대 위치로 배치된다고 가정합니다.
화면의 높이는, 1200px(브라우저의 표시 영역의 높이)의 경우, 800px 스크롤하면, 판정 위치의 2000px에 이른다.




좋은 웹페이지 즐겨찾기