๊ตญ๋น์ง์ D+50
- canvas๋ฅผ ์ฌ์ฉํด ์คํฌ๋กค์ ๋ฐ์ํ๋ ์ด๋ฏธ์ง ์ ๋๋ฉ์ด์ ์ ์ฉํ๊ธฐ -
canvas๋ฅผ ์ฌ์ฉํด ์คํฌ๋กค์ ๋ฐ์ํ๋ ์ด๋ฏธ์ง ์ ๋๋ฉ์ด์ ์ ์ฉํ๊ธฐ
canvas๋ฅผ ์ฌ์ฉํด์ ์คํฌ๋กค์ ๋ฐ๋ผ์ ์ด๋ฏธ์ง๊ฐ ์์ง์ด๋ ํจ๊ณผ๋ฅผ ์ ์ฉํด ๋ณด๋ ค๊ณ ํ๋ค.
์ผ๋จ 3๊ฐ์ง ๋จ๊ณ๋ณ๋ก ์์ฐจ์ ์ผ๋ก ์งํํด ๋ณด๋๋ก ํ์.
0 > ์ด๋ฏธ์ง ํ์ผ ์ค๋นํ๊ธฐ
1 > html์ canvas ํ๊ทธ ์ถ๊ฐ
2 > canvas ํ๊ทธ์ ๋ํ CSS ์ค์
3 > canvas ์ปจํธ๋กค ๊ธฐ๋ฅ๋ค์ ์ถ๊ฐ
0 > ์ด๋ฏธ์ง ํ์ผ ์ค๋นํ๊ธฐ
๋๋ ์คํฌ๋กค์ ํ ๋๋ง๋ค ์ฌ๊ณผ๊ฐ ๋์๊ฐ๋ ๊ฒ๊ฐ์ ํจ๊ณผ๋ฅผ ๋ณด์ด๊ธฐ์ํด ๋์์์ ํ๋ ์๋ณ๋ก ์ชผ๊ฐ์ ์ด๋ฏธ์ง๋ก ์ ์ฅํด imageํด๋์์ ๋ฃ์ด์ฃผ์๋ค.
1 > html์ canvas ํ๊ทธ ์ถ๊ฐ
<canvas id="main-canvas" width="1920" height="1080"></canvas>
๋จผ์ body์์ canvasํ๊ทธ๋ฅผ ๋ฃ์ด์ฃผ์์ผ๋ฉฐ id์ค์ ๋ฐ ํฌ๊ธฐ๋ฅผ ์ค์ ํด ์ฃผ์๋ค.
2 > canvas ํ๊ทธ์ ๋ํ CSS ์ค์
#main-canvas {
border: 1px solid black;
position: fixed;
}
body {
margin: 0;
padding: 0;
border: 0;
height: 4000px;
}
ํ๊ทธ์๋ํ ์คํ์ผ์ ์ ์ฉํด์ฃผ์์ผ๋ฉฐ ์ด๋ ์คํฌ๋กค์ ์์ง์ผ๋๋ง๋ค ์ ๋๋ฉ์ด์ ์ ์ ์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ body์ ๋์ด๋ฅผ ์์๋ก ์ง์ ํด ์ฃผ์๋ค.
3 > canvas ์ปจํธ๋กค ๊ธฐ๋ฅ๋ค ์ถ๊ฐ
• STEP01 > ๋ ๋๋ง ์ปจํ ์คํธ ์ค์
๋จ์ํ canvas ์๋ฆฌ๋จผํธ๋ฅผ ๊ฐ์ง๊ณ ์จ๋ค๊ณ ํด์ ๋ฐ๋ก ์ฌ์ฉํ ์๋ ์๋ค.
๋๋ก์์ ํ๊ธฐ ์ํด์๋ ๋ง์ ์ค์ ๋ค์ ํด์ฃผ์ด์ผ ํ๋๋ฐ (์ขํ, ์, ํฌ๊ธฐ, ๋ฉ๋ชจ๋ฆฌ์ค์ ๋ฑ๋ฑ...) ์ด๋ฌํ ์ค์ ๋ค์ด ๋์ด์์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฌํ ์ค์ ๊ฐ๋ค์ ์งํฉ์ graphic context๋ผ๊ณ ํ๋๋ฐ gc๋ ์ผ์ผํ ์ค์ ํด์ค ์๋ ์์ง๋ง ๊ธฐ๋ณธ๊ฐ๋ค๋ก ์ค์ ๋์ด ์๋ ๋๊ตฌ๋ฅผ ๊ฐ์ ธ์์ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ์๋ ์๋ค.
const mainCanvas = document.querySelector('#main-canvas');
const gc = mainCanvas.getContext('2d');
getContext() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๋ ๋๋ง ์ปจํ ์คํธ์ ๊ทธ๋ฆฌ๊ธฐ ํจ์๋ค์ ์ฌ์ฉํด ์ค ์ ์๋ค.
์ฐธ๊ณ ๋ก ๋ด๊ฐ ๋ค๋ฃฐ ์ด๋ฏธ์ง๋ 2D ๊ทธ๋ํฝ์ด๋ฏ๋ก 2D์ ๊ด๋ จ๋ ๋๋ก์ ์ปจํ ์คํธ๋ฅผ ์ค์ ํด ์ฃผ์๋ค.
• STEP02 > canvas ์ด๋ฏธ์ง ๋ฐฐ์ด ์ ํ
ํ์ฌ ์ด๋ฏธ์ง๋ imageํด๋ ์์ ์๋ ๊ฒ์ผ๋ฟ ๋ด๊ฐ ๋ฐ๋ก ๋ถ๋ฌ์ค๊ฑฐ๋ ํ์ง๋ ์์ ์ํ์ด๋ค.
ํ๋ฉด์ ์ด๋ฏธ์ง๋ฅผ ์ฌ๋ฆฌ๊ธฐ ์ํด ๊ฐ๊ฐ์ ์ด๋ฏธ์ง๋ค์๋ํ ์๋ฆฌ๋จผํธ๋ฅผ ๋ง๋ค๊ณ ๊ฒฝ๋ก๋ฅผ ์ค์ ํด์ค ๋ค์์ ๋ฐฐ์ด์ ๋ฃ์ด์ฃผ๋๋ก ํ๋ค.
let imgElement;
let canvasImages = []; // ๊ฐ๊ฐ์ imgElement๋ฅผ ๋ฃ์ด์ค ๋ฐฐ์ด
for(let i = 0; i < 500; i++)
{
imgElement = new Image();
imgElement.src = `./image/apple_${i}.png`;
// ๋ฐฐ์ด์์ ๋จ์ํ ๊ฒฝ๋ก๊ฐ์ ๋ฃ๋ ๊ฒ์ด ์๋๋ผ ์ด๋ฏธ์ง๋ฅผ ๋๊ณ ํ
ํด์ ๊ฐ์ง๊ณ ์๋ ๊ฒ
canvasImages.push(imgElement);
}
๋๋ ์ด๋ฏธ์ง๋ฅผ 500์ฅ์ ์ค๋นํ์๊ธฐ ๋๋ฌธ์ ๊ฐ ์ด๋ฏธ์ง๋ค์๋ํ image ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ฒฝ๋ก๋ฅผ ์ค์ ํด canvasImages๋ฐฐ์ด์์ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํด์ ๋ฃ์ด์ฃผ์๋ค.
์ด๋ ๊ธฐ์ตํด์ผํ ๊ฒ์ ๋ฐฐ์ด์์ ๋จ์ํ ๊ฒฝ๋ก๊ฐ์ ๋ฃ์ด์ค ๊ฒ์ด ์๋๋ผ ๋๋๋งํ ์ค๋น๊ฐ ๋์ด์๋ imgํ๊ทธ๋ค์ ๋ฃ์๋ค๊ณ ์๊ฐํด์ผํ๋ค.
• STEP03 > ์คํฌ๋กค์์น๊ฐ์ ๋ฐ๋ฅธ CSS๊ฐ ๊ณ์ฐ ํจ์ ์์ฑ
๋น์จ์๋ฐ๋ฅธ CSS๊ฐ ๊ณ์ฐ ํจ์๋ ์ด์ ๊ฒ์๋ฌผ์๋ ์ฌ๋ ค๋จ๊ธฐ์ ์ค๋ช ์ ์๋ตํ๋๋ก ํ๋ค.
let yOffset = 0;
const mainCanvas = document.querySelector('#main-canvas');
const calcValue = function(values){
let result = 0;
let rate = 0;
let height = document.body.scrollHeight - window.innerHeight;
rate = yOffset / height;
result = (rate * (values[1] - values[0])) + values[0];
return result;
}
• STEP04 > ์ด๋ฒคํธ ์ ์ฉ
๊ฐ ์ด๋ฒคํธ๊ฐ ๋ฐ์๋์์๋์ ๋ํ ๊ธฐ๋ฅ์ด ์คํ๋ ์ ์๋๋ก ์ค์ ํด์ฃผ๋ฉฐ, ์ฒ์ ๋ก๋๋์์๋์๋ ์ด๋ฏธ์ง์ ์ฒซํ๋ฉด์ด ์ ํ ๋๋๋ก ํด์ฃผ์๋ค.
์ดํ ์คํฌ๋กค์ด ๋ฐ์๋ ๋๋ง๋ค scrollY๊ฐ์ ๋ํ CSS๊ฐ์ ๊ณ์ฐํด์ ์คํฌ๋กค ์์น์ ๋ฐ๋ฅธ ์ด๋ฏธ์ง๋ฅผ ๊ทธ๋ ค๋ผ ์ ์๋๋ก ํด์ฃผ์๋ค.
// load๋์๋ค๋ ๊ฒ์ ์ด์ ์๋ฆฌ๋จผํธ๋ค ํฌํจ ๋ชจ๋ ์๋ฆฌ๋จผํธ๋ค์ด ๋ค ๋์๋ค๋ ๊ฒ์ด๋ค.
imgElement.addEventListener('load', () => {
// ํ๋ฉด์ ๊ทธ๋ ค๋ผ (์ด๋ฏธ์ง๊ฐ์ฒด, ์์น)
gc.drawImage(canvasImages[0], 0, 0);
});
window.addEventListener("scroll", () => {
let imageIndex = 0;
yOffset = window.scrollY;
imageIndex = Math.floor(calcValue([0, 499]));
gc.drawImage(canvasImages[imageIndex], 0, 0);
});
4 > ๊ฒฐ๊ณผํ๋ฉด
๋๊ธ