๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Javascript Effect

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒจ๋Ÿด๋ž™์Šค ํšจ๊ณผ : ๋ฉ”๋‰ด ์ˆจ๊น€, TOP๋ฒ„ํŠผ

by ์ฝ”ํŒŒ์นด 2022. 9. 10.
728x90

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ : ํŒจ๋Ÿด๋ž™์Šค ํšจ๊ณผ : ๋ฉ”๋‰ด ์ˆจ๊น€

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋‹ค์–‘ํ•œ ํšจ๊ณผ๋“ค ์ค‘, ํŒจ๋Ÿด๋ž™์Šค ํšจ๊ณผ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ํŒจ๋Ÿด๋ ‰์Šค ํšจ๊ณผ 1๋ฒˆ๊ณผ ๊ฐ™์€ ๋ฉ”๋‰ด ๋””์ž์ธ์ด์ง€๋งŒ, ์Šคํฌ๋กค์„ ์•„๋ž˜๋กœ ๋‚ด๋ฆฌ๋ฉด ๋ฉ”๋‰ด๊ฐ€ ์‚ฌ๋ผ์ง€๊ณ , ์œ„๋กœ ์˜ฌ๋ฆฌ๋ฉด ๋ฉ”๋‰ด๊ฐ€ ๋‚˜ํƒ€๋‚˜๋„๋ก ์ž‘์—…ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜, ์Šคํฌ๋กค์ด ์ตœํ•˜๋‹จ ๋ถ€๊ทผ์— ์œ„์น˜ํ•˜๋ฉด Top ๋ฒ„ํŠผ์ด ๋‚˜ํƒ€๋‚˜๊ณ , Top ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ตœ์ƒ๋‹จ์œผ๋กœ ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.


1. ์Šคํฌ๋กค ์ด๋ฒคํŠธ ๋งŒ๋“ค์–ด ์ฃผ๊ธฐ

window.addEventListener("scroll", () => {
    /* 1) ์Šคํฌ๋กค์˜ ๋†’์ด๊ฐ’ ๊ตฌํ•˜๊ธฐ */
    let scrollTop = window.pageYOffset || window.scrollY || document.documentElement.scrollTop;
    /* 2) info ๋ฐ•์Šค์— ์Šคํฌ๋กค์˜ ๋†’์ด๊ฐ’ ์ž…๋ ฅ */ 
    document.querySelector("#parallax__info span").innerText = Math.ceil(scrollTop);

    /* 3) ํ˜„์žฌ ์Šคํฌ๋กค์˜ ๋†’์ด๊ฐ’(scrollTop)๊ณผ ๊ฐ ์„น์…˜์˜ ๋†’์ด๊ฐ’(el.offsetTop)์„ ๋น„๊ตํ•˜์—ฌ,
             ํ•ด๋‹นํ•˜๋Š” ๋ฉ”๋‰ด์— active ํด๋ž˜์Šค๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ , ๋‚˜๋จธ์ง€ ๋ฉ”๋‰ด์˜ active ํด๋ž˜์Šค๋Š” ์ œ๊ฑฐ */
    document.querySelectorAll(".content__item").forEach((el, i) => {
        if (scrollTop > el.offsetTop - 500) {
            document.querySelectorAll("#parallax__nav li").forEach((li) => {
                li.classList.remove("active");
            });
            document.querySelector("#parallax__nav li:nth-child(" + (i + 1) + ")").classList.add("active");
        }
    });

    /* 4) ๋ธŒ๋ผ์šฐ์ €์˜ ์ „์ฒด ๋†’์ด๋ฅผ ๊ตฌํ•˜๊ณ , ๋ธŒ๋ผ์šฐ์ €์˜ ์ตœํ•˜๋‹จ ๋ถ€๊ทผ์— ์Šคํฌ๋กค์ด ์œ„์น˜ํ•˜๋ฉด TOP ๋ฒ„ํŠผ ๋ณด์—ฌ์ฃผ๊ธฐ */
    let body = document.body.offsetHeight;
    if (body - 1000 <= scrollTop) {
        document.querySelector("#parallax__top").classList.add("show");
    } else {
        document.querySelector("#parallax__top").classList.remove("show");
    }
});

์Šคํฌ๋กค์˜ ๋†’์ด๊ฐ’์„ ๊ตฌํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ๋ชจ๋‘ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ์ค€์œผ๋กœ ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๊ฐ™์€ ์†์„ฑ์ด์ง€๋งŒ, ํ˜ธํ™˜๋˜๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์„ธ ๊ฐ€์ง€ ๋ชจ๋‘ ์ž‘์„ฑํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์œ„์™€ ๊ฐ™์ด ์Šคํฌ๋กค ์ด๋ฒคํŠธ๋ฅผ 3๊ฐ€์ง€ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๋†’์ด๊ฐ’์—์„œ ๋นผ๊ธฐ๋ฅผ ํ•ด์ฃผ๋Š” ์ด์œ ๋Š” ์˜ค์ฐจ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.

2. ํด๋ฆญ ์ด๋ฒคํŠธ ๋งŒ๋“ค์–ด ์ฃผ๊ธฐ

/* MENU */
document.querySelectorAll("#parallax__nav a").forEach((el) => {
    el.addEventListener("click", (e) => {
        e.preventDefault();
        document.querySelector(el.getAttribute("href")).scrollIntoView({ behavior: "smooth" });
    });
});

/* TOP ๋ฒ„ํŠผ */
let TOP = document.querySelector("#parallax__top");
TOP.addEventListener("click", (e) => {
    e.preventDefault();
    window.scroll({
        top: 0,
        left: 0,
        behavior: "smooth"
    });
});

preventDefault()๋Š” ๊ธฐ์กด์˜ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.
๋จผ์ €, ๊ฐ๊ฐ์˜ MENU ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ, a ํƒœ๊ทธ์˜ ๊ธฐ๋ณธ ์†์„ฑ์œผ๋กœ ์ธํ•ด ๊ฐ ์„น์…˜์œผ๋กœ ์ฆ‰์‹œ ์ด๋™ํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋‹ค์Œ, smooth ์†์„ฑ์„ ์ ์šฉํ•˜์—ฌ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ด๋™ํ•˜๋„๋ก ์ž‘์—…ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
TOP ๋ฒ„ํŠผ์˜ ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์ค€ ํ›„, ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ top, left์˜ ๊ฐ’์ด 0์— ์œ„์น˜ํ•˜๋„๋ก, ์ฆ‰ ์ตœ์ƒ๋‹จ์œผ๋กœ, smooth ์†์„ฑ์— ๋”ฐ๋ผ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž‘์—…ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

3. ๋ฉ”๋‰ด ์ˆจ๊น€ ํšจ๊ณผ ์ถ”๊ฐ€ํ•˜๊ธฐ

let nowScroll = true;
let lastScroll = 0;

function scrollProgress() {
    nowScroll = true;

    setInterval(() => {
        if (nowScroll) {
            nowScroll = false;
            hasScroll();
        }
    }, 300);
}

function hasScroll() {
    /* ์ง€์—ญ๋ณ€์ˆ˜ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ */
    let scrollTop = window.pageYOffset || window.scrollY || document.documentElement.scrollTop;
    /* ์Šคํฌ๋กค์„ ์˜ฌ๋ฆด ๋•Œ ๋ฉ”๋‰ด๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ , ๋‚ด๋ฆด ๋•Œ ์ˆจ๊ธฐ๊ธฐ */
    if (scrollTop < lastScroll) {
        document.querySelector("#parallax__nav").classList.add("show");
    } else {
        document.querySelector("#parallax__nav").classList.remove("show");
    }
    lastScroll = scrollTop;
}

๋ฉ”๋‰ด ์ˆจ๊น€ ํšจ๊ณผ๋Š” ํŠธ๋ฆฌ๊ฑฐ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํŠธ๋ฆฌ๊ฑฐ๋ณ€์ˆ˜๋Š” ๊ฐ’์ด true์ผ ๋•Œ ์‹คํ–‰ํ•˜๊ณ , false์ผ ๋•Œ ์‹คํ–‰์„ ์ค‘์ง€ํ•˜๋Š” ๋ณ€์ˆ˜๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. setInterval() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”, ์‹œ๊ฐ„์ฐจ๋ฅผ ์คŒ์œผ๋กœ์จ ๋ฒ„๋ฒ…๊ฑฐ๋ฆผ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.
lastScroll์€ ๊ณผ๊ฑฐ์˜ ์Šคํฌ๋กค ๊ฐ’์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฆ‰, lastScroll(๊ณผ๊ฑฐ)์ด scrollTop(ํ˜„์žฌ)์˜ ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด, ์Šคํฌ๋กค์„ ์˜ฌ๋ฆฌ๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๊ณ , ๊ทธ ๋ฐ˜๋Œ€๋ผ๋ฉด ์Šคํฌ๋กค์„ ๋‚ด๋ฆฌ๊ณ  ์žˆ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ํ•จ์ˆ˜ ์‹คํ–‰์‹œํ‚ค๊ธฐ

window.addEventListener("scroll", scrollProgress);

๊ฒฐ๊ณผ

๋‚ด์ผ ์—ฌํ–‰์„ ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์‹ ์ด ๋‚˜์„œ ์•„์ฃผ ์—ด์‹ฌํžˆ ๊ธ€์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ํ‹ฐ๊ฐ€ ๋‚˜๋‚˜์š”? ๊น”๊น”.

728x90

๋Œ“๊ธ€

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๐Ÿฆ™

CSS
๊ด‘๊ณ  ์ค€๋น„์ค‘