๐ ์ค๋ ๋์ ํ ๊ธฐ๋ฅ
ํ๋ก์ ํธ๋ฅผ ์๊ฐํ๋ ๋ฉ์ธํ์ด์ง ๋์์ธ์ ์ฌ์ค ๊ฐ์ฅ ๋ฆ๊ฒ ๋์ถ๋์๋ค.
๋ ธ์ ์ฒ๋ผ [ ๊ธฐ๋ฅ + ๊ฐ๋จํ ์๊ฐ + gif ] ๊ธฐ๋ฅ์ ์ปดํฉํธํ๊ฒ ํํํ๋ ๊ฑด ์ด๋ ต์ง์๋ค๊ณ ๋๊ผ๊ธฐ ๋๋ฌธ์ด๋ค.
ํ ์คํธ ๋ช ์๋ gif ๋ฃ์ง ๋ญ .. ๋ผ๊ณ ์๊ฐํ์ผ๋ ๊ฒฐ๊ณผ๋ฌผ์ ๊ฝค ๋น์ฝํด๋ณด์๋ค ๐ค ๐จ
์ง์ง ์์ผํ ์๊ฐ์ด์๋ค !!
๊ฐ์ธ์ ์ผ๋ก ์์ฝ๊ธฐ๋ ํ๊ณ , ์คํฌ๋กค ์ ๋๋ฉ์ด์ ๊ณต๋ถ๋ ํ ๊ฒธ ๋ฉ์ธํ์ด์ง ์ ์ฒด๋ฅผ ์์ ํ๊ฒ ๋์๋ค.
๊ทธ๋ฆฌ๊ณ ํ๋ก์ ํธ๋ฅผ ๋ ์ ๊ทน์ ์ผ๋ก ์๊ฐํ๋ ค๊ณ ํ๋ค !! ๋ฉ์ธํ์ด์ง๋ ์ฒซ์ธ์์ ์ข์ฐํ๋๊น ์ค์ํ๋ค !!
๐ ์ฐธ๊ณ ๋ ํผ๋ฐ์ค
UI ์ปดํฌ๋ํธ๊ฐ ๋ง์ ์ฐ๋ฆฌ ํ๋ก์ ํธ๋ ์ ๋ง๊ฒ ๋จ ์๊ฐ์ ํ๋ค !! ๐
์คํฌ๋กค ์ด๋ฒคํธ๋ก ์ธํด ์คํฌ๋ฆฐ ์ ์ฒด์ ์ด๋ฏธ์ง๊ฐ ๋ถ๋๋ฝ๊ฒ ๋ฐ๋๋ ๊ฒ๋ ๋ง์์ ๋ค์๊ณ ,
ํนํ ์ ์์ํ ํ์ด๋์ค๋ํ ์ ๋๋ฉ์ด์ ...! ๊ผญ ๊ตฌํํ๊ณ ์ถ์๋ค ใ ใ
• Bare-minimum Requirements
โ ์คํฌ๋กค ์ด๋ฒคํธ : up & down ์ ๋ฐ๋ผ ์์น ์ด๋
โ ํ ์คํธ, ์ปดํฌ๋ํธ transition ์ ๋๋ฉ์ด์ ์ถ๊ฐ
โ ์ฌ์ฉ์ ํ๊ธฐ ๋ณผ ์ ์๋ < , > ๋ฒํผ ๊ตฌํ
โ ์ฒดํํ๊ธฐ ๋ฒํผ, Footer ๋์์ธ
• Advanced Requirements
โ ๋ฐฑ๊ทธ๋ผ์ด๋ ๋์ ์ ๋๋ฉ์ด์ ? (ํ์ฌ๋ ์ด๋ป๊ฒ ๊ตฌํํ๋ ์ง ๊ฐ์ด ์์ด)
๐ ์คํฌ๋กค ์ด๋ฒคํธ : up & down ์ ๋ฐ๋ผ ์์น ์ด๋
๊ณ ๋ คํด์ผํ๋ ์กฐ๊ฑด๋ค
โ ๋ง์ฐ์ค ํ ์ ๋ด๋ ธ์ ๋ ๋ค์ ์น์ element๋ก ์ด๋ํด์ผํ๋ค.
โ ๋ง์ฐ์ค ํ ์ ์ฌ๋ ธ์ ๋ ์ด์ ์น์ element๋ก ์ด๋ํด์ผํ๋ค.
โ ์คํฌ๋กค์ ์ง์ ์ก๊ณ ๋งจ ์๋ก ์ฌ๋ ธ์ ๋ ํ์ฌ element๋ก ์ํ๊ฐ ์ด๊ธฐํ๋์ด์ผํ๋ค.
โ ์คํฌ๋กค์ ์ง์ ์ก๊ณ ๋งจ ์๋๋ก ๋ด๋ ธ์ ๋ ํ์ฌ element๋ก ์ํ๊ฐ ๋ณ๊ฒฝ๋์ด์ผํ๋ค.
โ ๋ธ๋ผ์ฐ์ ์ ํฌ๊ธฐ๊ฐ ๋ณํ์ ๋ ์น์ element์ ํฌ๊ธฐ๊ฐ ๋์๋์ด์ผํ๋ค.
๐พ ์ค๊ฐ ๊ณผ์ ๋ ๋๋ง
์คํฌ๋กค ์ด๋ฒคํธ๋ ์ต์ํ์ผ๋ก, (ํ ์์ง์ 1๋ฒ๋น ์ด๋ฒคํธ ๋ฐ์ 1๋ฒ) 1:1 ๋์์ด ๊ฐ๋ฅํ๋๋ก ์ค๊ณํ์๋ค.
์ฝ์์ฐฝ์ ์คํฌ๋กค์ ๋ฐ์ผ๋ก ๋ด๋ฆด ๋ scroll down ์ด, ์๋ก ์ฌ๋ฆด ๋ scroll up ์ด ์ถ๋ ฅ๋๋ ๊ฑธ ๋ณผ ์ ์๋ค.
์คํฌ๋กค์ ์ง์ ์ก๊ณ ์ฎ๊ฒผ์ ๋ ์์๊ณผ ๋ ๋ถ๋ถ๋ง ์ธ์ํ๊ฒ ํ์๋ค. (๊ทธ ์ธ์ ์๋ฏธ์๋ค๊ณ ํ๋จ)
๋ฆฌ์ฌ์ด์ฆ ์ด๋ฒคํธ ๋ํ re-rendering ์ ์ต์ํํ๋ ๋ฐฉํฅ์ ์ค๊ณํ๋ค.
๋ฆฌ์ฌ์ด์ฆ๋ view์ ๋ง์ถฐ ์น์ ์ ๋์ด๊ฐ ์กฐ์ ๋๋ ๊ฑธ ๋ณผ ์ ์๋ค.
๊ตฌํํ๋ฉด์ ๋๋๊ฑด๋ฐ, ๋ฆฌ์ฌ์ด์ฆ์ด๋ฒคํธ์ scrollBy ์ด๋ฒคํธ๋ฅผ ๋ถ์ฌ์ผํ๋ ๊ณ ๋ฏผ์ด ๋๋ค.
(ํ์ฌ ๋ฆฌ์ฌ์ด์ฆ์ด๋ฒคํธ๋ custom Hook ์ผ๋ก ์คํฌ๋กค์ด๋ฒคํธ์ ๋ก์ง์ด ๋ถ๋ฆฌ๋์ด์์)
(์ด๋ฒคํธ๋ฅผ ๋ถ์ด๊ฒ ๋๋ฉด custom Hook์ ํด์ฒดํด์ผํ ์๋ ์ ... ๋ค)
๐พ ์ค๊ฐ ๊ณผ์ ์ฝ๋
// view height ๊ตฌํ๋ custom Hook
export function useHeight() {
const [docsHeight, setDocsHeight] = useState<number>(window.innerHeight);
useEffect(() => {
let mounted = true; // ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋์์ ๋
let timer: any = null; // useEffect ์์์ setTimeout์ด ํ๋ฒ๋ง ๋์ํ๋๋ก ์ ํ
window.addEventListener('resize', () => {
if (mounted) {
// timer๋ผ๋ ๋ณ์์ ๋น๋๊ธฐ ํจ์๋ฅผ ์ฌํ ๋นํ๋ ๋ฐฉ์์ผ๋ก ์ด๋ฒคํธ ํธ์ถ์ ์ ํํ๋ค
clearTimeout(timer);
timer = setTimeout(() => {
console.log('๋ฆฌ์ฌ์ด์ฆ ์ด๋ฒคํธ ์์');
setDocsHeight(window.innerHeight);
}, 300);
}
});
// useEffect์์ return function์
// component๊ฐ unmount๋ ๋ ์คํ๋๋ callback function์ด๋ค!
return () => {
// console.log('๋ฆฌ์ฌ์ด์ฆ ์ด๋ฒคํธ ์ข
๋ฃ');
mounted = false; // ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ๋์์ ๋
};
});
return {
docsHeight,
};
}
// scroll event ๋์ ๋ก์ง
const { docsHeight } = useHeight();
const [currSectIdx, setCurrSectIdx] = useState<number>(0);
const [scrollY, setScrollY] = useState<number>(0);
useEffect(() => {
const elementsArray = document.querySelectorAll('.mainpage-section');
let mounted = true;
let timer: any = null;
window.addEventListener('scroll', () => {
if (mounted) {
clearTimeout(timer);
timer = setTimeout(() => {
// scroll top
if (window.pageYOffset === 0) {
console.log('scroll top!');
setCurrSectIdx(0);
}
// scroll bottom
else if (
window.pageYOffset ===
(elementsArray.length - 1) * docsHeight
) {
console.log('scroll bottom!');
setCurrSectIdx(elementsArray.length - 1);
}
// scroll down
else if (
window.pageYOffset &&
currSectIdx * docsHeight < window.pageYOffset &&
window.pageYOffset < (currSectIdx + 1) * docsHeight
) {
console.log('scroll down');
setCurrSectIdx((prev) => {
const curr = prev + 1;
if (elementsArray !== undefined) {
window.scrollBy({
top: elementsArray[curr].getBoundingClientRect().top,
behavior: 'smooth',
});
}
return curr;
});
}
// scroll up
else if (
window.pageYOffset &&
window.pageYOffset < currSectIdx * docsHeight
) {
console.log('scroll up');
setCurrSectIdx((curr) => {
const prev = curr - 1;
if (elementsArray !== undefined) {
window.scrollBy({
top: elementsArray[prev].getBoundingClientRect().top,
behavior: 'smooth',
});
}
return prev;
});
}
setScrollY(window.pageYOffset);
}, 100);
}
});
return () => {
mounted = false;
};
}, [scrollY]);
'Dev-diary > ์ผ์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
MAU, DAU, MCU, ACU ์งํ์ฑ ์ธ์ด ์ ๋ฆฌ (0) | 2022.04.07 |
---|---|
๊ธฐ๋ฅ์ถ๊ฐ : 4์ฃผ์ฐจ ํ์ ๋ฉ์ธํ์ด์ง ์ ๋๋ฉ์ด์ ๊ตฌํ (2) (0) | 2022.02.27 |
๋ฆฌํฉํ ๋ง : 4์ฃผ์ฐจ ํ์ ๋ง์ปค ์ ๋ณด์ฐฝ css ๋ณ๊ฒฝ (0) | 2022.02.21 |
๋ฆฌํฉํ ๋ง : 4์ฃผ์ฐจ ํ์ input ์ฐฝ ํ ์คํธ ๊ธธ์ด ์ ํ (0) | 2022.02.17 |
๋ฆฌํฉํ ๋ง : 4์ฃผ์ฐจ ํ์ kakao Map API ๋ง์ปค ์ํ ๊ด๋ฆฌ (1) (0) | 2022.02.16 |
๋๊ธ