JS์ ์ ๋๋ฉ์ด์
์ CSS ์ ๋๋ฉ์ด์
๊ณผ ๋ค๋ฅด๋ค
CSS๋ keyframes
๋ก ์๋์ ์ผ๋ก ์์ง์ด๊ฒ ํ ์ ์์ง๋ง,
JS๋ ๋ฐ๋ณต์ ์ธ ์ฐ์ฐ์ ํตํด ๊ฐ์ฒด์ ์ขํ๋ฅผ ๋ฐ๊ฟ์ฃผ๋ ๋ฐฉ์์ผ๋ก ์ ๋๋ฉ์ด์
๊ตฌํ
์ฆ, JS ์ ๋๋ฉ์ด์
๋ผ์ด๋ธ๋ฌ๋ฆฌ
= ์๋์ ์ผ๋ก ๊ณ์ฐ์ ํด์ฃผ๋ ์ฝ๋๊ฐ ๋ด์ฅ๋์ด ์๋ ๊ฒ
๊ฐ๋ : ๋ธ๋ผ์ฐ์ ์๊ฒ ์ํํ๊ธฐ๋ฅผ ์ํ๋ ์ ๋๋ฉ
๋ธ๋ผ์ฐ์ ๊ฐ ๊ทธ๋ ค๋ผ ๋, reflow ๊ณผ์ ํ => repaint
reflow
= ๊ณ์ฐํ๋ ๊ณผ์
repaint
= ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง๊ณ ์์ ์น ํ๋ ์์
repaint
๊ฐ ๋์ด์ผ ๋์ ๋ณด์, ์น ํ๊ธฐ ์ ์ ์น ํ ์ค๋น๋๋์ง ๊ธฐ๋ค๋ฆฌ๋ ํจ์
= ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฌด๊ฑฐ์ด๋ฐ paint๊ฐ ์งํ๋๋ฉด ํ๋ ์์ด ์ ์ค๋๊ฑฐ๋, ๋ฒ๋ฒ ์ผ ์ ์์ผ๋ฏ๋ก ๊ทธ๋ฆฌ๊ธฐ ์ต์ ํ๋ ์ํ๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ํจ์ (=> ์ธ์์ ์ผ๋ก ๋ฐ๋ณต์ํด)
function draw(){
context.arc(10, 150, 10, 0, Math.PI * 2);
context.fill();
requestAnimationFrame(draw);
console.log("drawing...");
}
draw();
์ฌ๊ธฐ์๋ ์ฌ๊ทํจ์
๊ฐ ์ฐ์ด๋ค!! Interesting!
์ด์ ํด์ค ๊ฑด, ์ขํ๋ฅผ ๋ฐ๊ฟ์ฃผ๋ ๊ฒ
// setInterval์ ๊ฒฝ์ฐ
function draw(){
context.clearRect(0, 0, canvas.width, canvas.height);
context.beginPath();
context.arc(xPos, 150, 10, 0, Math.PI * 2);
context.fill();
xPos += 10;
//requestAnimationFrame(draw);
}
setInterval(draw, 100);
์๋ ์ปจํธ๋กค์ด ์ฌ์. ์ฆ๊ฐ๋๊ณผ ์๋๋ง ์ปจํธ๋กคํ๋ฉด ์ํ๋ ๋๋์ ๋น ๋ฅด๊ธฐ ์กฐ์ ๊ฐ๋ฅ
BUT requestionAnimationFrame()
๊ณผ ๋ฌ๋ฆฌ '๋ฌด๋๋ฝ ๊ทธ๋ฆฌ๊ธฐ'๋ผ์ ๋๋ฐ์ด์ค ์ฑ๋ฅ์ด ์ ์ข์ผ๋ฉด ํ๋ ์ ์ ์ค ๋ฐ ๋๋ ๋๊น ํ์ ๋ฐ์...
๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ์์ ๋ฐฐํฐ๋ฆฌ ์ ์ฝ์๋ requestAnimationFrame()
์ด ์ข๋ค๊ณ ํจ
๋ฌผ๋ก , setInterval
์ธํฐ๋ฒ์ ์กฐ์ ํ ์ ์๋ ์ฅ์ ์ด ์๋ค๋ ๊ฑด ๋ง์
์ด๋น 60ํ ๋ฐ๋ณต์ ๋ชฉํ๋ก ํ๋ฏ๋ก ์ผ์ถ 0.5์ด ์ธํฐ๋ฒ
function draw(){
if(count % 30 === 0){
context.clearRect(0, 0, canvas.width, canvas.height);
context.beginPath();
context.arc(xPos, 150, 10, 0, Math.PI * 2);
context.fill();
xPos += 5;
}
count++;
requestAnimationFrame(draw);
}
draw();
if (xPos >= canvas.width-10) {
return;
}
timerId = requestAnimationFrame(draw);
if (xPos >= canvas.width-10) {
cancelAnimationFrame(timerId);
}
// requestAnimationFrame()
canvas.addEventListener('click', () => {
cancelAnimationFrame(timerId);
});
// setInterval
canvas.addEventListener('click', () => {
clearInterval(timerId);
});