Skip to content

๐Ÿ’ซ CSS, JS ์—†์ด๋„ SVG ๋ชจํ•‘์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋‹ˆ

Byeongju Park edited this page Dec 3, 2024 · 2 revisions

๋ฌธ์ œ ์ •์˜: ๋ฉ”๋‰ด ํ‘œ์‹œ ์• ๋‹ˆ๋ฉ”์ด์…˜

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-11-15 แ„‹แ…ฉแ„’แ…ฎ 1 23 08

์ฃผ์š” ๋ชฉํ‘œ๋Š” ์œ„ ์ดˆ์•ˆ๊ณผ ๊ฐ™์ด ๋ฉ”๋‰ด๊ฐ€ ํ‘œ์‹œ๋  ๋•Œ ๋“ฑ์žฅ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์„œ์น˜๋ฅผ ์ง„ํ–‰ํ–ˆ์„ ๋•Œ๋Š” framer-motion๊ณผ ๊ฐ™์€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ๋“ค์„ ๋งŽ์ด ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ, ์ด ์• ๋‹ˆ๋ฉ”์ด์…˜๋งŒ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ƒˆ๋กœ์šด ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ค์–ด์„œ ์ถ”๊ฐ€์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ์ƒ‰ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ผ๋‹จ ํ•ด๊ฒฐํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์ •์˜ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. palette menu ์ปดํฌ๋„ŒํŠธ๋Š” ๊ฐ ๋ฒ„ํŠผ์ด ์œก๊ฐํ˜• SVG๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ํ•ด์•ผํ•  ์ผ์€ ์› ๋ชจ์–‘์˜ SVG๋ฅผ ์„ ์–ธํ•ด์ฃผ๊ณ  ์œก๊ฐํ˜• SVG๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณ€ํ•˜๋Š” ๋ชจ์…˜์„ ๋งŒ๋“ค๋ฉด ๋ฉ๋‹ˆ๋‹ค.

CSS Transition์„ ์จ๋ณผ๊นŒ์š”?

์ฒ˜์Œ์œผ๋กœ ์‹œ๋„ํ–ˆ๋˜ ๋ฐฉ๋ฒ•์€ CSS Transition ์†์„ฑ์„ ์ด์šฉํ•˜๋Š” ๋ฐฉํ–ฅ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์œก๊ฐํ˜•์€ SVG ๋‚ด์—์„œ Polygon ์†์„ฑ์œผ๋กœ ์ •์˜๋˜๊ณ  ์žˆ๋Š”๋ฐ, ๋ชจ์…˜ ์—ฐ๊ฒฐ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ Path๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ Path ๋‚ด์—์„œ ์–ด๋–ป๊ฒŒ ๊ทธ๋ ค์งˆ์ง€๋ฅผ ์ •์˜ํ•ด์ฃผ๋Š” ์†์„ฑ์ด d ์†์„ฑ์ธ๋ฐ, transition์„ d์— ๊ฑธ์–ด์ฃผ๋ฉด ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ณ€๊ฒฝ์ด ๋˜์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์•„์‰ฝ๊ฒŒ๋„ transition์€ d ์†์„ฑ์„ ์ง€์›ํ•ด์ฃผ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. (์ฐธ๊ณ : CSS Animations and Transitions on SVG Attributes)

์ฒ˜์Œ ๋งŒ๋‚œ animate

SVG์— ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ฐพ๋˜์ค‘ animate ์†์„ฑ์„ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. animiate ๋Š” svg ๋‚ด์—์„œ ์†์„ฑ์œผ๋กœ์จ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ณ , SMIL ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ณ„๋„์˜ CSS๋‚˜ JS ์—†์ด๋„ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ •์˜ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” XML ๊ธฐ๋ฐ˜ ์ •์˜๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ ์ฝ”๋“œ๋Š” ํ•˜๋‹จ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<svg>
  <animate
    attributeName="d"
    dur="10s"
    repeatCount="indefinite"
    values="M 1045,520 L 1173,558 L 1184,393 Z;
  	    M 1036,540 L 883,540 L 883,693 Z;
	    M 1045,520 L 1173,558 L 1184,393 Z"
    keyTimes="0; 0.5; 1" />
</svg>

css์˜ keyframes์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•˜๋Š” keytimes๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, from๊ณผ to ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์„ ๋•Œ๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ์— ๊ฐ€๊นŒ์›Œ์กŒ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, animate ์†์„ฑ์ด ๋š๋š ๋Š๊ฒจ์„œ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ œ๊ฐ€ ์›ํ•˜๋Š” ๋ถ€๋“œ๋Ÿฌ์šด ํŠธ๋žœ์ง€์…˜์ด ๋˜๊ณ ์žˆ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

ohno1

๋‚ด ์• ๋‹ˆ๋ฉ”์ด์…˜๋งŒ ๋ถ€๋“œ๋Ÿฝ์ง€ ์•Š์€ ์ด์œ 

ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์˜ˆ์ œ๋“ค์„ ๋ณด๋ฉด ๋ถ„๋ช…ํžˆ animate ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ํŠธ๋žœ์ง€์…˜์„ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ฐพ์•„๋ณธ ๊ฒฐ๊ณผ, ๋ถ€๋“œ๋Ÿฌ์šด ํŠธ๋žœ์ง€์…˜์ด ์ง€์›๋˜๋ ค๋ฉด svg path๊ฐ€ ํŠน์ • ์กฐ๊ฑด์„ ์ถฉ์กฑํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ์•ต์ปค ํฌ์ธํŠธ์˜ ์ˆ˜๊ฐ€ ์ผ์น˜ํ•  ๊ฒƒ
  2. ์•ต์ปค ํฌ์ธํŠธ์˜ ์ˆœ์„œ๊ฐ€ ์ผ์น˜ํ•  ๊ฒƒ
  3. ๋ชจ๋“  ๊ฒฝ๋กœ ๋ช…๋ น์–ด ํƒ€์ž…์ด ์ผ์น˜ํ•  ๊ฒƒ

path d๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”๋ฐ, ์•ž์— ์•ŒํŒŒ๋ฒณ์œผ๋กœ M,C,Q,L,Z์™€ ๊ฐ™์ด ๋ช…๋ น์„ ์ ์„ ์ˆ˜ ์žˆ๊ณ  ๊ทธ ์˜†์—๋Š” ํ•ด๋‹น ๋ช…๋ น์— ๋”ฐ๋ฅธ ํฌ์ธํŠธ๋“ค์„ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด L์€ ์„ ๋ถ„์„ ๊ทธ๋ฆฌ๋Š” ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค.)

const d = `
  M 50 0
  Q 71.65 12.5, 93.3 25
  Q 93.3 50, 93.3 75
  ... ์ดํ•˜ ์ƒ๋žต

๋ถ€๋“œ๋Ÿฌ์šด ํŠธ๋žœ์ง€์…˜ ์กฐ๊ฑด์„ ์ผ์น˜์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ ์›๊ณผ ์œก๊ฐํ˜•์„ ๊ทธ๋ฆฌ๋Š” ๊ฒฝ๋กœ ๋ช…๋ น ํƒ€์ž…์ด ์ผ์น˜ํ•ด์•ผํ•˜๋Š”๋ฐ, ๊ณ ๋ คํ•ด๋ณด๋ฉด ์›์€ ๋ฌด์กฐ๊ฑด ๊ณก์„  ๋ช…๋ น์œผ๋กœ ๊ทธ๋ ค์•ผํ•˜๋‹ˆ ์œก๊ฐํ˜•์„ line ๋ช…๋ น์ด ์•„๋‹Œ ๊ณก์„  ๋ช…๋ น์œผ๋กœ ๊ทธ๋ ค์ง€๋„๋ก SVG path๋ฅผ ์ˆ˜์ •ํ•ด์ค˜์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฌผ์„ ์–ป๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š์•„์„œ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. AIํ•œํ…Œ ์ˆ˜์ฐจ๋ก€ ์ˆ˜์ • ์š”์ฒญ์„ ๋ถ€ํƒํ•œ ๋์— ์œก๊ฐํ˜•๊ณผ ๊ฐ€๊นŒ์šด svg๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์—์„œ ์•Œ๊ฒŒ๋œ ์ ์€ C(3์ฐจ ๋ฒ ์ง€์–ด ๊ณก์„ )์ด ์•„๋‹ˆ๋ผ Q(2์ฐจ ๋ฒ ์ง€์–ด ๊ณก์„ )์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‹ค๊ฐํ˜• ํ˜•ํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋” ์ˆ˜์›”ํ•˜๊ฒŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์œก๊ฐํ˜•์€ ๊ณก๋ฅ ์„ ์ ๊ฒŒํ•˜๊ณ , ์›์€ ๊ณก๋ฅ ์„ ๋งค์šฐ ์˜ฌ๋ ค์„œ ๊ทธ๋ฆฌ๋ฉด ๋ฒ ์ง€์–ด ๊ณก์„ ์œผ๋กœ๋„ ๋‹ค์–‘ํ•œ ๋„ํ˜•์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›๊ณผ ์œก๊ฐํ˜•์„ Q ๋ช…๋ น์„ ํ†ตํ•ด์„œ ๊ทธ๋ฆฐ ํ›„, ๋ชจํ•‘์ด ์ง€์›๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ CSS transition-transform์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐ ๋ฒ„ํŠผ์ด ์ค‘์•™์—์„œ๋ถ€ํ„ฐ ํผ์ ธ๋‚˜์˜ค๋„๋ก ์„ค์ •์„ ํ•ด์ฃผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ohyes

๋งˆ์น˜๋ฉฐ

์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ•  ๋•Œ, ๋ณต์žกํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š” ์„œ๋น„์Šค๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด SVG ๊ด€๋ จ ๋‚ด์žฅ ๊ธฐ์ˆ ์„ ํ†ตํ•ด์„œ ์šฉ์ดํ•˜๊ฒŒ ๋ชจํ•‘์„ ๊ตฌํ˜„ํ•ด๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ path d ์†์„ฑ์— ๋ณ€ํ™”๋ฅผ ์ค˜์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ, rx , ry ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋” ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋ ค์› ๋˜ ์ ์€, SVG๊ฐ€ ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ๊ด€๋ จ๋œ ์ž๋ฃŒ๋Š” ์ธํ„ฐ๋„ท์— ๋งŽ์ง€ ์•Š์•˜๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  path๋ฅผ ์กฐ์ ˆํ•˜๋Š” ๊ฒƒ์€ ์ง์ ‘ ํŽธ์ง‘ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์ƒ AI์—๊ฒŒ ์ˆ˜์ • ์š”์ฒญ์„ ํ•ด์ค˜์•ผ ํ•˜๋Š”๋ฐ, "์–ด๋–ค ๋ถ€๋ถ„์„ ์–ด๋–ค ๊ณก์„ ์„ ํ†ตํ•ด์„œ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •ํ•ด์ค˜"์™€ ๊ฐ™์ด ๊ตฌ์ฒด์ ์ธ ํ‚ค์›Œ๋“œ๋ฅผ ํฌํ•จํ•ด์•ผ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฌผ์— ๊ฐ€๊น๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์ธํ„ฐ๋ž™์…˜ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋” ๋งŽ๊ณ  ๋ณต์žกํ•ด์ง€๋Š” ๊ฒฝ์šฐ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ํŒ€์˜ ์ƒ์‚ฐ์„ฑ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ ์ƒํ™ฉ์„ ์ž˜ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค.

References

TEAM

DOCS

DEV-NOTES

PRESENTATION

Clone this wiki locally