์๋ฐ์คํฌ๋ฆฝํธ : ํจ๋ด๋์ค ํจ๊ณผ : ๋ฉ๋ด ์จ๊น
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ค์ํ ํจ๊ณผ๋ค ์ค, ํจ๋ด๋์ค ํจ๊ณผ์ ๋๋ค. ์ด๋ฒ์๋ ํจ๋ด๋ ์ค ํจ๊ณผ 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);
๊ฒฐ๊ณผ
๋ด์ผ ์ฌํ์ ๊ฐ๊ธฐ ๋๋ฌธ์ ์ ์ด ๋์ ์์ฃผ ์ด์ฌํ ๊ธ์ ์์ฑํ์ต๋๋ค. ํฐ๊ฐ ๋๋์? ๊น๊น.
'Javascript Effect' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋ฐ์คํฌ๋ฆฝํธ ์ฌ๋ผ์ด๋ ํจ๊ณผ : ๋ฒํผ (3) | 2022.09.18 |
---|---|
์๋ฐ์คํฌ๋ฆฝํธ ํจ๋ด๋์ค ํจ๊ณผ : ๋ํ๋๊ธฐ (4) | 2022.09.18 |
์๋ฐ์คํฌ๋ฆฝํธ ํจ๋ด๋์ค ํจ๊ณผ : ์ฌ์ด๋ ๋ฉ๋ด (5) | 2022.09.08 |
์๋ฐ์คํฌ๋ฆฝํธ ํจ๋ด๋์ค ํจ๊ณผ : ๋ฉ๋ด ์ด๋ (9) | 2022.09.06 |
์๋ฐ์คํฌ๋ฆฝํธ ๋ง์ฐ์ค ํจ๊ณผ : ๋ง์ฐ์ค ๋ฐ๋ผ๋ค๋๊ธฐ (2) | 2022.09.06 |
๋๊ธ