ํฐ์คํ ๋ฆฌ ๋ทฐ
๋ถ๋๋ฌ์ด ์ ๋๋ฉ์ด์ ํจ๊ณผ_RequestAnimationFrame ๊ตฌํํด๋ณด๊ธฐ
choi95 2021. 10. 9. 00:20๋ฌธ์
window.addEventListener('scroll', () => {
box.style.width = `${window.pageYOffset}px`;
});
๋ค์๊ณผ ๊ฐ์ด ์คํฌ๋กค๋ Window.pageYoffset๊ฐ ๋งํผ ์์์ ๋ฐ์ค ์์์ ๊ฐ๋ก ๋๋น๋ฅผ ๋์ ์ผ๋ก ๋์ด๋๊ฒ ์ฝ๋๋ฅผ ์์ฑํ์๋ค.
ํ๋ฉด์ ๋๋๋ง๋ ์์์ ๋ฐ์ค์ ๊ฐ๋ก ๋๋น๊ฐ ๋์ด๋๋ ์ ๋๋ฉ์ด์ ํจ๊ณผ๋ ์ธ๋ป ๋ณด๋ฉด ์์ฐ์ค๋ฌ์ด ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์คํฌ๋กค์ ๋ฐฉํฅํค๋ฅผ ํตํด ๋ด๋ ค๋ณธ๋ค๋ฉด ๋ค์ ๋ถ์์ฐ์ค๋ฝ๊ฒ ๋๊ธฐ๋ ๊ฑฐ๋ฅผ ํ์ธํ ์ ์๋ค.
์ด๋ฌํ ํ์์ ํด๊ฒฐํ๊ธฐ ์ํด์ requestAnimationFrame์ ๋์ ์๋ฆฌ๋ฅผ ์ดํด๋ณด๊ณ ๊ตฌํํด ๋ณด๊ณ ์ ํ๋ค.
requestAnimationFrame
https://developer.mozilla.org/ko/docs/Web/API/Window/requestAnimationFrame
The window.requestAnimationFrame() method tells the browser that you wish to perform an animation and requests that the browser calls a specified function to update an animation before the next repaint. The method takes a callback as an argument to be invoked before the repaint.
MDN์ ๋ณด๋ฉด requestAnimationFrame์ ๋ค์ ๋ฆฌํ์ธํธ ์ด์ ์ ํด๋น ์ ๋๋ฉ์ด์ ์ ์ ๋ฐ์ดํธํ๋ ํจ์๋ฅผ ํธ์ถํ๋ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ฆ, ๋ฃจํ๋ฅผ ๊ณ์ ๋๋ฉด์ ํด๋น ์ ๋๋ฉ์ด์ ๊ณผ ๊ด๋ จ๋ ์ฐ์ฐ ๊ณผ์ ์ ํจ์๋ฅผ ์ผ์ ์กฐ๊ฑด์ด ๋ ๋๊น์ง ๋ฐ๋ณต ํธ์ถํ๋ค๋ ๊ฒ์ธ๋ฐ, ์ด๋ฌํ ๋์ ๋ฐฉ์์ ์ ์์๋ฅผ ํตํด ์ง์ ๊ตฌํํด๋ณด๊ณ ์ ํ๋ค.
๋ถ๋๋ฌ์ด ์ ๋๋ฉ์ด์ ์ ์ํด์๋ ์ถ๋ฐ ์ง์ ์์๋ถํฐ ๋์ฐฉ ์ง์ ์์๊น์ง์ ์๋๊ฐ ์ผ์ ํ ๊ฒ๋ณด๋ค๋ ์ ์ง์ ์ผ๋ก ๊ฐ์๋๋ ๋์กธ๋ธ(desolve) ํจ๊ณผ๊ฐ ํจ๊ณผ์ ์ด๋ค.
๋ค์ ๊ทธ๋ฆผ์ ํตํด ์ด๋ฅผ ํ์ธํด ๋ณด์.
๋ณํ๋๋ ๊ฑฐ๋ฆฌ๊ฐ์ ์๋์ ์ผ๋ก ๋ณํ์ ํญ์ ์ค์ด๊ธฐ ์ํ ๊ฐ์ ์ฐ์ฐํจ์ผ๋ก์จ ์ ๋๋ฉ์ด์ ์ ๋๋ ์ด๋ฅผ ๊ฑธ์ด์ฃผ์๋ค.
ํด๋น ์ฌํญ์ ์์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
let delayedYOffset = delayedYOffset + (pageYOffset - delayedYOffset) * acc;
๋ค์์ผ๋ก ์กฐ๊ฑด์ ๋ง์กฑํ๊ธฐ ์ ์ ๋ฌดํ ๋ฃจํ๋ฅผ ์ํํ๋ ์ฌ๊ท ํจ์ ๋ด์์ ํด๋น ์์ ํฌํจ์์ผ ์ฃผ๋ฉด ๋ฐ๋ณต์ด ํ๋ฒ์ฉ ์ํ๋ ๋๋ง๋ค ์ด๋ํด์ผ ๋ ์ ์ฒด ๊ฑฐ๋ฆฌ๋ ์ค์ด๋ค๊ฒ ๋๊ณ ์ด์ ๋ฐ๋ผ ์ ๋์ ์ผ๋ก ๊ฐ๋ก ๋๋น๊ฐ ๋ณํ๋๋ ์ ๋๋ฉ์ด์ ์ ๊ตฌํํ ์ ์๋ค.
ํ์ฌ๋ ๊ฐ๋จํ ๋ฐ์ค๋ฅผ ๊ฐ์ง๊ณ ํ ์คํธํด ๋ณธ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ก์ ์์ผ๋ก ํฐ ์ฐจ์ด๋ ์์ง๋ง ์ฐ์์ ์ธ ์ด๋ฏธ์ง์ ๋์ด์ ์ด์ฉํ์ฌ ๋น๋์ค ํจ๊ณผ๋ฅผ ๊ตฌํํ๋ค๋ ๋ฑ๊ณผ ๊ฐ์ด ๋ฏธ๋์ด๋ฅผ ์์ฐ์ค๋ฝ๊ฒ ํํํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ํจ๊ณผ์ ์ด๋ค.
์ ์ฒด ์ฝ๋
const box = document.querySelector('.box');
let acc = 0.1; //delay๋ฅผ ์ํ ๊ฐ
let delayedYOffset = 0;
let rafId; //requestFrameAnimation๋ฅผ ํน์ ์กฐ๊ฑด์ด ๋๋ฉด ๋ฉ์ถ๊ธฐ ์ํ ์๋ณ ๋ณ์_setTimeout๊ณผ ๋น์ทํ ์๋ฆฌ
let rafState;
window.addEventListener('scroll', () => {
if (!rafState) {
rafId = requestAnimationFrame(loop);
rafState = true;
}
});
function loop() {
delayedYOffset = delayedYOffset + (pageYOffset - delayedYOffset) * acc;
box.style.width = `${delayedYOffset}px`;
rafId = requestAnimationFrame(loop); //๋ฆฌํ์ธํธ ๋๊ธฐ ์ ์ ๊ณ์ loopํจ์๋ฅผ ํธ์ถ
if (Math.abs(pageYOffset - delayedYOffset) < 1) { //์คํฌ๋กค ๋น์จ์ ๋ฐ๋ฅธ end๊ฐ๊น์ง ๋๋ฌํ์ ๊ฒฝ์ฐ ์ข
๋ฃ
cancelAnimationFrame(rafId);
rafState = false;
}
};
loop();
๊ด๋ จ ํฌ์คํ
https://choi95.tistory.com/9?category=857834
'JS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ ๋ ฌ]๊ฐ์ฅ ํฐ ์_Array.prototype.sort()์ ๋ํ ๊ณ ์ฐฐ (0) | 2021.10.10 |
---|---|
event target ํฌ์ปค์ฑํ๊ธฐ (0) | 2021.10.09 |
์์์ ๋์ ์ธ ์์น๊ฐ์ ๋ฐ๋ผ ์๋์ผ๋ก ์คํฌ๋กค์ด ์๋๋ ๋ฌธ์ _element.scrollintoView() (0) | 2021.09.07 |
๋นํธ ์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ ์ด์ง์ ๊ฐํธํ๊ฒ ๊ตฌํ๊ธฐ (0) | 2021.09.04 |
๋ณ์ UI (0) | 2021.08.28 |