ss PARALLAX Effect 07
본문 바로가기
JAVASCRIPT Effect

PARALLAX Effect 07

by 꿈나무개발 2022. 10. 10.
728x90

패럴랙스 효과07

자바스크립트를 이용하여 패럴랙스 효과를 만들 수 있습니다. 가려져 있던 그림과 글씨가 스크롤을 내리면서 점점 드러납니다.



자바스크립트

패럴랙스 효과를 만들기 위한 자바스크립트 작성법입니다.

//reveal 클래스 자식에 글씨가 있다면, 가상으로 span태그 만들어 넣어주기
const revealText = document.querySelectorAll(".reveal");
revealText.forEach((el) => {
    let splitText = el.innerText;

    if (splitText) {
        el.innerHTML = '' + splitText + '';
    }
})

//자기 자신을 호출하는 재귀함수 사용
function scroll() {
    let scrollTop = window.scrollY;

    const reveal = document.querySelectorAll(".reveal");
    reveal.forEach(el => {
        let revealOffset = el.offsetTop + el.parentElement.offsetTop;
        let revealDelay = el.dataset.delay; //dataset 이용하여 delay 주기

        // if (scrollTop > revealOffset - window.innerHeight) {
        //     el.classList.add("show");
        // }

        if (scrollTop >= revealOffset - window.innerHeight) {
            if (revealDelay == undefined) {
                el.classList.add("show");
            } else {
                //일정 시간 지난 이후에 함수 실행
                setTimeout(() => {
                    el.classList.add("show");
                }, revealDelay)
            }
        }
    })

    document.querySelector(".scroll span").innerText = Math.round(scrollTop);   //scrollTop값 부여. Math.round() : 반올림
    requestAnimationFrame(scroll);  //무한실행을 막기 위해 1초에 60회 실행
}
scroll();

HTML

패럴랙스 효과를 만들기 위한 HTML 작성법입니다. reveal 효과를 위해 ".split" 클래스를 추가하였습니다.

소스보기
<main id="parallax__cont">
    <div id="contents">
        <section id="section1" class="content__item">
            <span class="content__item__num">01</span>
            <h2 class="content__item__title">section1</h2>
            <figure class="content__item__imgWrap reveal">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc reveal">언제나 현재에 집중할수 있다면 행복할것이다.</p>
        </section>
        <!-- section1 -->

        <section id="section2" class="content__item">
            <span class="content__item__num">02</span>
            <h2 class="content__item__title">section2</h2>
            <figure class="content__item__imgWrap reveal reveal-RTL">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc reveal reveal-RTL" data-delay="500">진정으로 웃으려면 고통을 참아야하며, 고통을 즐길 줄
                알아야 한다.</span></p>
        </section>
        <!-- section2 -->

        <section id="section3" class="content__item">
            <span class="content__item__num">03</span>
            <h2 class="content__item__title">section3</h2>
            <figure class="content__item__imgWrap reveal reveal-TTB">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc reveal reveal-TTB" data-delay="500">한번의 실패와 영원한 실패를 혼동하지 마라.
            </p>
        </section>
        <!-- section3 -->

        <section id="section4" class="content__item">
            <span class="content__item__num">04</span>
            <h2 class="content__item__title">section4</h2>
            <figure class="content__item__imgWrap reveal reveal-BTT" data-delay="500">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc reveal reveal-BTT">계단을 밟아야 계단 위에 올라설수 있다.</p>
        </section>
        <!-- section4 -->

        <section id="section5" class="content__item">
            <span class="content__item__num">05</span>
            <h2 class="content__item__title">section5</h2>
            <figure class="content__item__imgWrap reveal reveal-TWO">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc reveal reveal-TWO">행복은 습관이다,그것을 몸에 지니라.</p>
        </section>
        <!-- section5 -->

        <section id="section6" class="content__item">
            <span class="content__item__num">06</span>
            <h2 class="content__item__title">section6</h2>
            <figure class="content__item__imgWrap reveal reveal-TWO reveal-RTL">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc reveal reveal-TWO reveal-RTL">1퍼센트의 가능성, 그것이 나의 길이다.</p>
        </section>
        <!-- section6 -->

        <section id="section7" class="content__item">
            <span class="content__item__num">07</span>
            <h2 class="content__item__title">section7</h2>
            <figure class="content__item__imgWrap reveal reveal-TWO reveal-TTB">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc reveal reveal-TWO reveal-TTB">그대의 하루 하루를 그대의 마지막 날이라고 생각하라.
            </p>
        </section>
        <!-- section7 -->

        <section id="section8" class="content__item">
            <span class="content__item__num">08</span>
            <h2 class="content__item__title">section8</h2>
            <figure class="content__item__imgWrap reveal reveal-TWO reveal-BTT">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc reveal reveal-TWO reveal-BTT">작은 기회로 부터 종종 위대한 업적이 시작된다.</p>
        </section>
        <!-- section8 -->

        <section id="section9" class="content__item">
            <span class="content__item__num">09</span>
            <h2 class="content__item__title">section9</h2>
            <figure class="content__item__imgWrap reveal reveal reveal-TWO reveal-TTB">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc reveal reveal reveal-TWO reveal-TTB">최고에 도달하려면 최저에서 시작하라.</p>
        </section>
        <!-- section9 -->
    </div>
</main>

CSS

패럴랙스 효과를 만들기 위한 CSS 작성법입니다. 다양한 애니메이션 효과를 주었습니다.

소스보기
/* option */
.reveal>div,
.reveal>span {
    opacity: 0;
}

.reveal.show>div,
.reveal.show>span {
    animation: opacity 1s linear forwards;
}

.reveal {
    position: relative;
}

.reveal::before {
    content: '';
    position: absolute;
    left: 0;
    top: 0;
    width: 0;
    height: 100%;
    background: #fff;
    z-index: 1;
}

.reveal.reveal-TWO::after {
    content: '';
    position: absolute;
    left: 0;
    top: 0;
    width: 0;
    height: 100%;
    z-index: 1;
    background: orange;
}

/* 1개 */
.reveal.show::before {
    animation: reveal 1s;
}

.reveal.reveal-RTL.show::before {
    animation: reveal-RTL 1s;
}

.reveal.reveal-TTB.show::before {
    animation: reveal-TTB 1s;
}

.reveal.reveal-BTT.show::before {
    animation: reveal-BTT 1s;
}

/* 2개 */
.reveal.show::after {
    animation: reveal 1s 0.3s;
}

.reveal.reveal-RTL.show::after {
    animation: reveal-RTL 1s 0.3s;
}

.reveal.reveal-TTB.show::after {
    animation: reveal-TTB 1s 0.3s;
}

.reveal.reveal-BTT.show::after {
    animation: reveal-BTT 1s 0.3s;
}

@keyframes opacity {
    0% {
        opacity: 0;
    }

    60% {
        opacity: 0;
    }

    70% {
        opacity: 1;
    }

    100% {
        opacity: 1;
    }
}

@keyframes reveal {
    0% {
        width: 0;
        left: 0;
    }

    50% {
        width: 100%;
        left: 0;
    }

    80% {
        width: 100%;
        left: 0;
    }

    100% {
        width: 0;
        left: 100%;
    }
}

@keyframes reveal-RTL {
    0% {
        width: 0;
        right: 0;
        left: auto;
    }

    50% {
        width: 100%;
        right: 0;
        left: auto;
    }

    80% {
        width: 100%;
        right: 0;
        left: auto;
    }

    100% {
        width: 0;
        right: 100%;
        left: auto;
    }
}

@keyframes reveal-TTB {
    0% {
        width: 100%;
        height: 0;
        top: 0;
        left: auto;
    }

    50% {
        width: 100%;
        height: 100%;
        top: 0;
        left: auto;
    }

    80% {
        width: 100%;
        height: 100%;
        top: 0;
        left: auto;
    }

    100% {
        width: 100%;
        height: 0;
        top: 100%;
        left: auto;
    }
}

@keyframes reveal-BTT {
    0% {
        width: 100%;
        height: 0;
        bottom: 0;
        top: auto;
    }

    50% {
        width: 100%;
        height: 100%;
        bottom: 0;
        top: auto;
    }

    80% {
        width: 100%;
        height: 100%;
        bottom: 0;
        top: auto;
    }

    100% {
        width: 100%;
        height: 0;
        bottom: 100%;
        top: auto;
    }
}

.content__item__num,
.content__item__title {
    display: none;
}
728x90
반응형

'JAVASCRIPT Effect' 카테고리의 다른 글

SLIDER Effect 06  (1) 2022.10.23
SLIDER Effect 05  (1) 2022.10.23
PARALLAX Effect 06  (2) 2022.09.29
Mouse Effect 06  (2) 2022.09.29
SEARCH Effect 05  (2) 2022.09.29

댓글


HTML
CSS
JAVASCRIPT

JAVASCRIPT

자세히보기
광고 준비중입니다.