본문 바로가기
Javascript응용_Effect

Parallax Effect 06

by 코딩대원 2022. 9. 30.

패럴랙스 이펙트 06

페럴랙스 이펙트 여섯번째 시간입니다.
이번 시간에는 스크롤을 내릴때 텍스트를 한자씩 쪼개서 나타나도록 효과를 줬습니다.

01. HTML 코드

content__item__desc에 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">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc split">결과도 중요하지만, 과정을 더 중요하게 생각한다.</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">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc split">피할수 없으면 즐겨라</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">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc split">승리하면 조금 배울 수 있고 패배하면 모든 것을 배울 수 있다</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">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc split">과거를 지배하는 자가 마래를 지배하며 현재를 지배하는 자가 과거를 지배한다.</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">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc split">세상은 고통으로 가득하지만 한편 그것을 이겨내는 일로도 가득차 있다</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">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc split">가장 하기 힘든 일은 아무 일도 안하는 것이다</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">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc split">말을 많이 하는 것과 말을 잘하는 것은 다르다.</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">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc split">오늘 할 수 있는 일에 전력을 다하라, 그러면 내일에는 한 걸음 더 진보한다. </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">
                <div class="content__item__img"></div>
            </figure>
            <p class="content__item__desc split">끝을 맺기를 처음과 같이 하면 실패가 없다.</p>
        </section>
        <!-- //section9 -->
    </div>
</main>
<!-- //main -->
<aside id="parallax__info">
    <div class="scroll">scrollTop : <span>0</span>px</div>
</aside>
}

02. CSS 코드

cubic-bezie효과를 줬습니다.

{
    #parallax__nav {
        position:fixed;
        right: 20px;
        top: 20px;
        z-index: 2000;
        background-color: rgba(0,0,0,0.4);
        padding: 20px 30px;
        border-radius: 50px;
        transition: top .4s ease;
    }
    #parallax__nav li {
        display: inline;
        margin: 0 5px;
    }
    #parallax__nav li a {
        display: inline-block;
        height: 30px;
        padding: 5px 20px;
        text-align: center;
        line-height: 30px;

    }

    #parallax__nav li.active a {
        background-color: #fff;
        color: #000;
        border-radius: 20px;
        box-sizing: content-box;
    }
    #parallax__cont {
        max-width: 1600px;
        width: 98%;
        margin: 0 auto;
        /* background-color: rgba(255,255,255,0.1); */
    }
    .content__item {
        width: 1000px;
        max-width: 70vw;
        margin: 30vw auto;
        /* background-color: rgba(255,255,255,0.3); */
        text-align: left;
        margin-right: 0;
        position: relative;
        padding-top: 8vw;
    }
    .content__item:nth-child(even){
        margin-left: 0;
        text-align: right;
    }
    .content__item__num {
        font-size: 35vw;
        font-family: 'Lato';
        font-weight: 100;
        position: absolute;
        left: -5vw;
        top: -16vw;
        opacity: 0.07;
        z-index: -2;
    }
    .content__item:nth-child(even) .content__item__num {
        left: auto;
        right: -5vw;
    }
    .content__item__title {
        font-weight: 400;
        text-transform: capitalize;
        
    }
    .content__item__imgWrap {
        width: 100%;
        padding-bottom: 56.25%;
        background: #000;
        position: relative;
        overflow: hidden;
        z-index: -1;
    }
    .content__item__img {
        position: absolute;
        background: url(../assets/img/effect_bg18-min.jpg);
        background-repeat: no-repeat;
        background-position: center center;
        background-size: cover;
        width: 110%;
        height: 110%;
        left: -5%;
        top: -5%;
        filter: saturate(0%);
        /* transition: all 1s; */
        padding-top: 8vw;
    }
    .content__item:nth-child(1) .content__item__img {
        background-image: url(../assets/img/effect_bg14-min.jpg);
    }
    .content__item:nth-child(2) .content__item__img {
        background-image: url(../assets/img/effect_bg15-min.jpg);
    }
    .content__item:nth-child(3) .content__item__img {
        background-image: url(../assets/img/effect_bg16-min.jpg);
    }
    .content__item:nth-child(4) .content__item__img {
        background-image: url(../assets/img/effect_bg17-min.jpg);
    }
    .content__item:nth-child(5) .content__item__img {
        background-image: url(../assets/img/effect_bg18-min.jpg);
    }
    .content__item:nth-child(6) .content__item__img {
        background-image: url(../assets/img/effect_bg19-min.jpg);
    }
    .content__item:nth-child(7) .content__item__img {
        background-image: url(../assets/img/effect_bg01-min.jpg);
    }
    .content__item:nth-child(8) .content__item__img {
        background-image: url(../assets/img/effect_bg02-min.jpg);
    }
    .content__item:nth-child(9) .content__item__img {
        background-image: url(../assets/img/effect_bg03-min.jpg);
    }
    .content__item__desc {
        font-size: 4vw;
        line-height: 1.4;
        margin-top: -5vw;
        margin-left: -4vw;
        word-break: keep-all;
    }
    .content__item:nth-child(even) .content__item__desc {
        margin-left: auto;
        margin-right: -4vw;
    }

    @media (max-width: 800px){
        #parallax__cont {
            margin-top: 70vw;
        }
        #parallax__nav {
            padding: 10px;
            right: auto;
            left: 10px;
            top: 50%;
            transform: translateY(-50%);
            border-radius: 5px;
            background-color: rgba(0,0,0,0.8);
        }
        #parallax__nav li {
            display: block;
            margin: 5px;
        }
        #parallax__nav li a {
            font-size: 14px;
            padding: 5px;
            border-radius: 5px;
            height: auto;
            line-height: 1;

        }
        #parallax__nav li.active a {
            border-radius: 5px;
        }
        #parallax__info {
            left: 10px;
            bottom: 10px;
        }
    }
    #parallax__info {
        position: fixed;
        left: 20px;
        bottom: 20px;
        z-index: 2000;
        background-color: rgba(0,0,0,0.4);
        color: #fff;
        padding: 20px;
        border-radius: 10px;
    }
    /* option */
    .split span {
        opacity: 0;
        transform: translateY(50px);
        transition: all 0.6s cubic-bezier(0, 0.71, 0.11, 1.66);
        display: inline-block;
        min-width: 1vw;
        min-height: 1vw;
    }
    .split span.show {
        opacity: 1;
        transform: translateY(0);
    }
     /* .split span:nth-child(1) {
        transition-delay: 100ms;
     }
     .split span:nth-child(2) {
        transition-delay: 150ms;
     }
     .split span:nth-child(3) {
        transition-delay: 200ms;
     }
     .split span:nth-child(4) {
        transition-delay: 250ms;
     }
     .split span:nth-child(5) {
        transition-delay: 300ms;
     }
     .split span:nth-child(6) {
        transition-delay: 350ms;
     }
     .split span:nth-child(7) {
        transition-delay: 400ms;
     }
     .split span:nth-child(8) {
        transition-delay: 450ms;
     }
     .split span:nth-child(9) {
        transition-delay: 500ms;
     }
     .split span:nth-child(10) {
        transition-delay: 550ms;
     }
     .split span:nth-child(11) {
        transition-delay: 600ms;
     }
     .split span:nth-child(12) {
        transition-delay: 650ms;
     }
     .split span:nth-child(13) {
        transition-delay: 700ms;
     }
     .split span:nth-child(14) {
        transition-delay: 750ms;
     }
     .split span:nth-child(15) {
        transition-delay: 800ms;
     }
     .split span:nth-child(16) {
        transition-delay: 850ms;
     }
     .split span:nth-child(17) {
        transition-delay: 900ms;
     }
     .split span:nth-child(18) {
        transition-delay: 950ms;
     }
     .split span:nth-child(19) {
        transition-delay: 1000ms;
     }
     .split span:nth-child(20) {
        transition-delay: 1050ms;
     }
     .split span:nth-child(21) {
        transition-delay: 1100ms;
     }
     .split span:nth-child(22) {
        transition-delay: 1150ms;
     }
     .split span:nth-child(23) {
        transition-delay: 1200ms;
     }
     .split span:nth-child(24) {
        transition-delay: 1250ms;
     }
     .split span:nth-child(25) {
        transition-delay: 1300ms;
     }
     .split span:nth-child(26) {
        transition-delay: 1350ms;
     }
     .split span:nth-child(27) {
        transition-delay: 1400ms;
     }
     .split span:nth-child(28) {
        transition-delay: 1450ms;
     }
     .split span:nth-child(29) {
        transition-delay: 1500ms;
     }
     .split span:nth-child(30) {
        transition-delay: 1550ms;
     } */
}

03. script 코드

split메서드와 join메서드를 이용해서 글씨를 쪼개줬고 span으로 감싸줬습니다.
transitionDelay를 이용해서 CSS효과를 줬습니다.

{
    //글씨 쪼개기
    // let text = document.querySelector("#section01 .content__item__desc");
    // let splitText = text.innerText;

    // let splitWrap = splitText.split('').join('</span><span>');

    // text.innerHTML = splitWrap = "<span>" + splitWrap + "</span>";

    //글씨 쪼개기(다중이)

    document.querySelectorAll(".split").forEach(text => {
        let splitText = text.innerText;
        let splitWrap = splitText.split('').join("</span><span aria-hidden='true'>");
        splitWrap = "<span>" + splitWrap + "</span>";
        text.innerHTML = splitWrap;
        text.setAttribute("aria-label", splitText);
    });

    function scroll(){
        let scrollTop = window.scrollY;
        document.querySelector("#parallax__info .scroll").innerText = Math.round(scrollTop);

        // CSS 클래스 추가 (노가다)
        // document.querySelectorAll(".content__item").forEach(item => {
        //     if(scrollTop >= item.offsetTop){
        //         item.querySelector(".split").classList.add("show");
        //     }
        // })

        document.querySelectorAll(".content__item").forEach(item => {
            if(scrollTop >= item.offsetTop){
                item.querySelectorAll(".split span").forEach((span, index) => {
                    span.classList.add("show");
                    span.style.transitionDelay = `${index * 50}ms`
                });
            }
        })

        requestAnimationFrame(scroll);

        //첫번째 span ---> 0.01
        //두번째 span ---> 0.02
        //세번째 span ---> 0.03
        //네번째 span ---> 0.04
        //다섯번째 span ---> 0.05
        //여섯번째 span ---> 0.06
        //...
    }
    scroll();
}

'Javascript응용_Effect' 카테고리의 다른 글

Parallax Effect 07  (1) 2022.10.11
Search Effect 05  (4) 2022.09.30
Mouse Effect 06  (2) 2022.09.30
Search Effect 04  (3) 2022.09.29
Mouse Effect 05  (3) 2022.09.28

댓글


HTML
CSS

JAVASCRIPT

자세히 보기