카테고리 없음

패럴럭스 효과

Hyeon been 2023. 5. 17. 14:11
728x90

 

리빌효과

 

스크립트

        document.querySelectorAll("p.reveal").forEach(text => {
            text.innerHTML = `<span>${text.innerHTML}</span>`
        })

        function scroll() {
            let scrollTop = window.scrollY || window.pageYOffset;

            const reveals = document.querySelectorAll(".reveal");

            reveals.forEach(reveal => {
                let revealOffset = reveal.offsetTop + reveal.parentElement.offsetTop;
                let revealDelay = reveal.dataset.delay;
                
                // if (scrollTop >= revealOffset - window.innerHeight) {
                //     reveal.classList.add("show")
                // }

                if (scrollTop >= revealOffset - window.innerHeight) {
                    if(revealDelay == undefined){
                        reveal.classList.add("show");
                    } else {
                        setTimeout(()=>{
                            reveal.classList.add("show");
                        }, revealDelay);
                    }
                }
                
            })

            document.querySelector(".scroll span").innerText = parseInt(scrollTop);
            requestAnimationFrame(scroll);
        }
        scroll();

p에 reveal이 붙으면  text.innerHTMlL 앞과 뒤에 span을 넣어줍니다. 

        document.querySelectorAll("p.reveal").forEach(text => {
            text.innerHTML = `<span>${text.innerHTML}</span>`
        })

스크롤 함수를 생성합니다.

그 안에 스크롤 값을 구하는 변수를 넣습니다.

            let scrollTop = window.scrollY || window.pageYOffset;

            const reveals = document.querySelectorAll(".reveal");

변수 reveals를 만들어 줍니다 reveals는 다중 선택자이기 때문에 forEach를 사용해줍니다.

const reveals = document.querySelectorAll(".reveal");

reveals.forEach(reveal => {
                let revealOffset = reveal.offsetTop + reveal.parentElement.offsetTop;
                let revealDelay = reveal.dataset.delay;

그 안에 변수 let revealOffset를 reveal.offsetTop + reveal.parentElement.offsetTop로 정의 해주고

et revealDelay를 reveal.dataset.delay로 정의 해줍니다. 

그리고 조건문을 걸어줍니다.

                if (scrollTop >= revealOffset - window.innerHeight) {
                    if(revealDelay == undefined){
                        reveal.classList.add("show");
                    } else {
                        setTimeout(()=>{
                            reveal.classList.add("show");
                        }, revealDelay);
                    }
                }
.reveal {
            position: relative;
        }

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

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

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

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

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

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

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

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

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

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

    
        /* .parallax__item__desc.reveal.show::after {
            animation: reveal 1s ease 1.5s;
        }

        .parallax__item__desc.reveal.reveal-RTL.show::after {
            animation: reveal-RTL 1s ease 1.5s;
        }

        .parallax__item__desc.reveal.reveal-TTB.show::after {
            animation: reveal-TTB 1s ease 1.5s;
        }

        .parallax__item__desc.reveal.reveal-BTT.show::after {
            animation: reveal-BTT 1s ease 1.5s;
        } */

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        .reveal>span,
        .reveal>div {
            opacity: 0;

        }

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

        /* animation */
        @keyframes opacity {
            0% {
                opacity: 0;
            }

            60% {
                opacity: 0;
            }

            70% {
                opacity: 1;
            }

            100% {
                opacity: 1;
            }
        }

        .parallax__item__num,
        .parallax__item__title {
            display: none;
        }

.reveal에 각자의 클래스가 붙으면 바뀌는 애니메이션 css를  설정해줍니다.