궁금한게 많은 코린이의 Developer 노트

헤더 인디게이터 바 만들기 (with Javascript)+ 가로스크롤 + 스크롤 시밑줄 그어지는 효과 본문

Javascript

헤더 인디게이터 바 만들기 (with Javascript)+ 가로스크롤 + 스크롤 시밑줄 그어지는 효과

lemonarr🍋 2023. 6. 29. 17:43

헤더를 스크롤하면 인디게이터의 너비가 길어지는 효과를 구현하는 방법에 대해 정리하여 작성한 것입니다.

 

-헤더 스크롤 이벤트: 스크롤 시에 인디게이터 바의 너비를 조정하여 현재 위치를 알려줌.


 window.addEventListener("scroll", () => {
        const indicatorBar = document.querySelector(".scroll-indicator-bar");

        const pageScroll = document.body.scrollTop || document.documentElement.scrollTop;
        const height = document.documentElement.scrollHeight - document.documentElement.clientHeight;
        const scrollValue = (pageScroll / height) * 100;

        indicatorBar.style.width = scrollValue + "%";
    });
 window.addEventListener("scroll", () => {
        const indicatorBar = document.querySelector(".scroll-indicator-bar");

        const pageScroll = document.body.scrollTop || document.documentElement.scrollTop;
        const height = document.documentElement.scrollHeight - document.documentElement.clientHeight;
        const scrollValue = (pageScroll / height) * 100;

        indicatorBar.style.width = scrollValue + "%";
    });

 

 

-전체적인 코드:

 

<HTML>

div요소 scroll-indicator-bar를 작성하는 위치: 메뉴를 감싸는 박스 밑에 작성. (하단의 코드를 기준으로 설명.)

: 메뉴를 감싸는 nav 박스 밑에 보여야 시각적으로 보기 편하기 때문이다.

 
 <header id="header">
       
        <nav class="nav-bar">

                <a href="index.html" id="logo">Plastic World</a>
                <div class="menu-btn"></div>
                <div class="navigation">
                <div class="nav-items">
                    <a href="#sec08">Animals suffering</a>
                    <a href="zero-waste.html">Zero-waste</a>
                    <a href="market.html">Market</a>
                </div>
            </div>
        </nav>
       
        <div class="scroll-indicator-container">
            <div class="scroll-indicator-bar"></div>
        </div>
 
    </header>

<CSS>

 /*Scroll indicator Bar===========================================*/
    .scroll-indicator-container{
        width:100%;
        height:5px;
    }
   
    /*bar*/
    .scroll-indicator-bar{
        background: #b9b9b9;
        width:0%;
        height:3px;
        box-shadow: 0 3px 52px #7cc8ff, 0 1px 50px #81cbff;
    }

<Javascript>

    //javascript for the scroll indicator
    //scroll 이벤트 리스너를 만듦.
    window.addEventListener("scroll", () => {

        //html에서 scroll-indicator-bar인 클래스를 찾는다.
        const indicatorBar = document.querySelector(".scroll-indicator-bar");
        //현재 페이지의 스크롤 위치(수직).
        const pageScroll = document.body.scrollTop || document.documentElement.scrollTop;
        //문서의 총 높이(전체높이) - 현재 뷰포트의 높이 = 스크롤 가능한 전체 높이를 계산.
        const height = document.documentElement.scrollHeight - document.documentElement.clientHeight;
        //pageScroll을 전체 높이로 나누고, 100을 곱하여 스크롤 위치의 백분율을 계산합니다. 이는 스크롤 인디케이터 바의 너비를 나타냅니다.
        const scrollValue = (pageScroll / height) * 100;

        //indicatorBar.style.width를 사용하여 스크롤 인디케이터 바의 너비를 조정합니다. scrollValue에 "%"를 추가하여 백분율 값으로 설정합니다.
        indicatorBar.style.width = scrollValue + "%";

    });

 

-구동원리 파악.

 

 

원리 파악하기 전에 알아둬야 할 식

문서 현재 스크롤 위치 백분율 구하기 : " 현재 페이지의 수직 스크롤 위치 / 문서의 총 높이 *100 "

 

이 값을 사용하여 클래스의 위드 값을 "동적"으로 변환시키면 된다.

(scroll-indigator-bar클래스 스타일의 위드 값 = 현재 위치 백분율 + "%"로 선언.)

 

동적으로 변환시키는 데에는 총 4개의 변수를 선언해야 한다!

(이유: 해당 코드를 구현하는데 필요한 부품이 4개 이기 때문...)

 

1. html에서 해당 요소의 클래스를 찾는 변수 선언. (클래스로 선언했으면-클래스, 아이디로 선언했으면 -아이디 불러오기)

2. 문서의 총 높이(전체 높이)를 알 수 있는 변수 선언.

3. 현재 페이지의 스크롤 위치를 알 수 있는 변수 선언.

4. 현재 위치를 '퍼센테이지'로 만드는 변수 선언. -> 위의 2,3번 변수를 선언한 이유.

 

5. scroll-indigator-bar 의 스타일의 너비 값(Widht)은 scrollValue(4번 변수) + "%" 으로 명령.

-> 스크롤 할 때마다 위드 값이 늘어나도록(+) 만든다.

 

Q. 왜 변수에 + "%"값을 더해요?  

 

A: JavaScript에서 변수와 문자열을 더하는 경우, 결과는 문자열이 됩니다. JavaScript의 동적 타입 언어 특성으로 인해 발생하는 형 변환이며, "문자열 연결" 또는 "문자열 병합"이라고도 합니다.

동적으로 만들어주기 위해 값을 문자열로 병합시킴. 값을 문자열로 통일하게 하여 그 값을 사용한다. 

 

결국 스크롤을 하면 인디게이터 너비가 늘어나서 해당 스크롤의 위치를 파악할 수 있는 헤더를 만들 수 있다.

 

 

구현 화면 

: 인디게이터가 스크롤 위치에 따라 너비값이 늘어나고 있음.

 

 


 

 

-가로스크롤 : gsap사용하여 구현하는 방법.

 

<HTML>

하단에 타입 스크립트 소스를 작성한다.

 
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.9.1/gsap.min.js"></script>
 

<Javascript>

 

//가로 스크롤
var $sections = document.querySelectorAll(".horizon_box");
var tl = gsap.timeline({
    scrollTrigger: {
        trigger: ".sec4",
        pin: true,
        //스크롤 했을 때 요소들의 트렌지션 애니메이션 효과 수가 높을 수록 자연스럽게 붙음.
        scrub: 0.3,
        //start: "top top", //이건 안해줘도 잘 작동이 되네?
        //이걸 해줘야 해당 위치에서 작동이 되어짐.
        //안해주면 보이는 화면마다 가로스크롤이 보임.
        end: "+=300%",
    }
});
tl.from($sections, { x: '300%', autoAlpha: 0, duration: 2, ease: "none", stagger: 3 })
    .to($sections, { duration: 3 });

gsap.registerPlugin(ScrollTrigger);

 

 

 


 

 

-스크롤 시 글자에 밑줄 그어지는 효과 : gsap사용하여 구현하는 방법.

 

 

<HTML>

하단에 타입 스크립트 소스를 작성한다.

   
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.9.1/ScrollTrigger.min.js"></script>
 

<Javascript>

 
gsap.registerPlugin(ScrollTrigger);

//문서 내의 모든 <span> 요소를 배열로 가져오는 역할.
//forEach안의 글자는 아무거나 사용해도 됨.
gsap.utils.toArray('span').forEach((s) => {
    // ScrollTrigger.create(): 인스턴스 생성-> 특정 요소의 스크롤 위치에 따라 애니메이션을 트리거 할 수 있다.
    ScrollTrigger.create({
        trigger: s, //트리거로 사용할 요소를 지정('s').
        start: 'top center', //애니메이션이 시작될 스크롤 위치를 정한다.
        toggleClass: 'active', // 스크롤 백 할 때 거꾸로 다시 돌아오게 하는 코드.
        onEnter: () => s.classList.add('active'), //span 요소에 active를 붙여서 사용.
        //markers: true,
    })
})
 

 

'Javascript' 카테고리의 다른 글

자바스크립트 -템플릿 리터럴 : '백틱'을 왜 사용하는 걸까?  (0) 2023.09.25
함수의 종류  (1) 2023.09.22
BOM DOM에 대한 이해  (0) 2023.05.13
사용자 정의 함수 개념 정리  (0) 2023.05.05
마우스 이벤트  (0) 2023.05.02