๐จ SVG ๋ค๋ฃจ๊ธฐ ์ ๋ฆฌ (ํฌ๊ธฐ / ์์ ๋ณ๊ฒฝ)
SVG (Scalabe Vector Graphic)
SVG๋ ํ์ฅ ๊ฐ๋ฅํ ๋ฒกํฐ ๊ทธ๋ํฝ(Scalable Vector Graphics)์ ์ค์๋ง์ด๋ค.
SVG ์ด๋ฏธ์ง ํ์ผ์ XML ๋ฌธ๋ฒ์ ๊ธฐ๋ณธ์ผ๋ก ํ๋ ๋ฌธ์์ด๋ฉฐ ๋ก๊ณ ๋ ์์ด์ฝ, ๊ทธ๋ํ ๋ฑ ๋๋ฆฌ ์ฌ์ฉ๋๋ค.
์ฆ, 2์ฐจ์ ๊ทธ๋ํฝ์ ํํํ๊ธฐ ์ํด ๋ง๋ค์ด์ง XMLํ์ผ ํ์์ ๋งํฌ์
์ธ์ด์ด๋ผ๊ณ ๋ด๋ ๋๋ค.
๋ค๋ฅธ png๊ณผ jpg ์ด๋ฏธ์ง ํ์ผ์ ๋นํด ํ
์คํธ ํธ์ง๊ธฐ์์ CSS๋ JS๋ก ์์ ์ด ๊ฐ๋ฅํ๋ค๋ ์ ์ด ๊ฐ์ฅ ํฐ ์ฅ์ ์ด๋ผ ํ ์ ์๋ค.
๊ฐ์ฅ ํฐ ํน์ง์ผ๋ก๋ ํ์ฅ์ด ๊ฐ๋ฅํ๋ค๋ ์ ์์ ํ๋ํด๋ ํ์ง์ด ๋จ์ด์ง์ง ์๋๋ค๋ ํน์ง์ด ์๋ค.
์๋ฅผ ๋ค์ด ํ์ํฌ์ธํธ์์ ์ด๋ฏธ์ง๋ฅผ ๋๋ฆฌ๊ฑฐ๋ ์ค์ผ๋ ํ์ง์ด ๊นจ์ง์ง ์๋ ๊ฒ๋ ๋ฐ๋ก ์ด ์๋ฆฌ๋ฅผ ์ด์ฉํ ๊ฒ์ด๋ค.
- SVG ์ด๋ฏธ์ง๋ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ฑฐ๋ ๋๋ฆฌ๋๋ผ๋ ํ์ง์ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
- ์ํ๋ ์์์ผ๋ก ๋ฐ๋ก๋ฐ๋ก ์์ ๋กญ๊ฒ ์ ์ฉ๊ฐ๋ฅ ํ๋ค.
* ์ผ๋ฐ PNG ํ์ผ
* SVG ํ์ผ
SVG ์ฌ์ฉํ๊ธฐ
SVG ์ฝ์
<svg width="100%" height="100%" viewBox="0 0 172 140" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(1,0,0,1,-282.321,-396.307)">
<path id="path1" style="fill:rgb(42,169,224);fill-rule:nonzero;" d="M453.826,412.806C447.516,415.605 440.734,417.496 433.617,418.347C440.882,413.992 446.461,407.097 449.088,398.88C442.289,402.913 434.759,405.84 426.743,407.418C420.326,400.58 411.181,396.307 401.06,396.307C381.629,396.307 365.874,412.061 365.874,431.493C365.874,434.25 366.185,436.936 366.785,439.511C337.542,438.044 311.615,424.036 294.26,402.747C291.232,407.944 289.496,413.988 289.496,420.436C289.496,432.644 295.708,443.414 305.149,449.724C299.382,449.541 293.956,447.958 289.212,445.323C289.208,445.469 289.208,445.617 289.208,445.765C289.208,462.813 301.337,477.033 317.434,480.268C314.481,481.072 311.373,481.502 308.164,481.502C305.897,481.502 303.693,481.281 301.544,480.871C306.022,494.849 319.016,505.022 334.414,505.305C322.371,514.743 307.2,520.369 290.714,520.369C287.874,520.369 285.073,520.201 282.321,519.876C297.892,529.861 316.388,535.686 336.258,535.686C400.978,535.686 436.371,482.07 436.371,435.572C436.371,434.046 436.337,432.529 436.269,431.019C443.143,426.059 449.108,419.863 453.825,412.806L453.826,412.806Z"/>
</g>
</svg>
SVG๋ ๋ํ๊ณผ ์ ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ์ ์ฝ๋๋ฅผ ๋ณผ ์์๋ค์ด ๊ธธ๋ค๋ g๋ path์ ๊ฐ์ผ๋ก ์ด๋ฃจ์ด ์ง ๊ฒ์ ์์ ์๋ค.
SVG ํ์ผ์ ์ค์ ๋ฒกํฐ ๋๋ก์ ๋ฐ์ดํฐ๋ <svg></svg> ํ๊ทธ ์์ ํํ๋๋ค.
<g></g>ํ๊ทธ๋ ์ขํ๋ฅผ ๋ณด์ ํ๋ ์ญํ ์ ํ๋ฉฐ
<path/>ํ๊ทธ๋ ์ค์ ๋ํ์ ๊ทธ๋ฆฌ๋ ์ญํ ์ ํ๋ค.
์ ํ ๋ํ์ ๊ทธ๋ฆด๋๋ <ellipse/>, <rectangle/>, <circle/> ๋ฑ์ ๋ํ ํ๊ทธ๋ก ํํํ๋ค.
SVG๋ฅผ html์ ์ฝ์ ํ๋ ๋ฐฉ์์ ๋ค์ํ๋ค.
์ฐ์ ์ ์ฝ๋์ ๊ฐ์ด svgํ๊ทธ ์์ฒด๋ฅผ ์ธ๋ผ์ธ์ผ๋ก ์ฝ์ ํด๋ ๋ฌธ์ ์์ด ๋์ํ๋ค.
์ธ๋ผ์ธ์ผ๋ก SVG ํ์ค๋ฅผ ์ฝ์ ๋ฐฉ์์ ์ฅ์ ์ ์ด๋ฏธ์ง ๋ก๋๊ฐ ํ์ ์๋ค๋ ์ ์ด๋ค.
๋ธ๋ผ์ฐ์ ๋ ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ฌ ๋๋ง๋ค HTTP ์์ฒญ์ ํด์ผ ํ๋๋ฐ, ์ด ๊ฒฝ์ฐ์ ์์ฒญ-์๋ต์ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ก๋๋๋ ์๋๊ฐ ๋น ๋ฅด๋ค.
ํ์ง๋ง ๋จ์ ์ htmlํฌ๊ธฐ๊ฐ ์ปค์ง๊ณ ์บ์ฑ์ด ๋ถ๊ฐ๋ฅ ํด์ง๋ค.
์ด์ธ์๋ img ํ๊ทธ๋ object ํ๊ทธ, css์ background-image ์์ฑ์ ํตํด์๋ svg ํ์ฅ์ ํ์ผ์ ๋ฌธ์์ ์ฝ์ ์ด ๊ฐ๋ฅํ๋ค.
<img src="nana.svg" />
<object type="image/svg+xml" data="./potion.svg" class="nana"></object>
.className {
width: 300px; /* svg ํฌ๊ธฐ ์กฐ์ */
height: 120px;
outline: 2px solid red;
background-image: url("./potion.svg");
}
SVG ํฌ๊ธฐ ๋ณ๊ฒฝ
์์ธ๋ก ๊ฐ๋จํ๋ค.
svgํ๊ทธ ๋ด๋ถ์ width์ height ์์ฑ์ ๋ช ์ํ๋ฉด ๊ฐ๋จํ๊ฒ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์ ์๋ค.
<svg width="200" height="auto" viewBox="0 0 1981.355 1651.144" ...>
...
</svg>
๋จ, viewBox ๊ฐ๋ ์ ์์ํ ์ ์๋๋ฐ, ๊ฐ๋จํ ๋งํ์๋ฉด ๋๋ณด๊ธฐ ๊ฐ๋ ์ผ๋ก ์ดํดํ๋ฉด ๋๋ค.
๋ทฐํฌํธ(viewport)
๋ทฐํฌํธ๋ svg์ ๊ฐ์ ์์ญ์ผ๋ก ํด๋น ์์์ ๋๋น์ ๋์ด๋ฅผ ์๋ฏธํ๋ค.
svg๋ css๋ฅผ ํตํด width์ height ํน์ฑ์ ์ค์ ํ ๊ฒฝ์ฐ ์ด ๋ทฐํฌํธ ์์ญ์ด ๋ฐ๋๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์ฝ๊ฒ ๋งํด ์ํ๊ด์ ์คํฌ๋ฆฐ ์์ญ(๊ฐ์ ์์ญ)์ด๋ผ๊ณ ์๊ฐํ์. ์ํ๊ด ์คํฌ๋ฆฐ๋ณด๋ค ํฐ ์์์ ๋น์ถ๋ฉด ํ๋ฉด์ ์ ๋ณด์ด๊ฒ ๋๋ค.
๋๊ฐ์ด ๋ทฐํฌํธ ๋ฐ์ผ๋ก ์๋ฆฌ๋จผํธ๊ฐ ์์ ธ๋๊ฐ๋ค๋ฉด ๋ณผ ์ ์๋ค.
๋ทฐ๋ฐ์ค(viewbox)
๋ทฐ๋ฐ์ค๋ ์ขํ์ ๊ฐ๋ก, ์ธ๋ก์ ๋น์จ์ ๊ฒฐ์ ํ๋ svg์ ํน์ฑ์ด๋ค (viewBox="x์ขํ y์ขํ width๋น์จ height๋น์จ)
๋ทฐํฌํธ์ ๋ทฐ๋ฐ์ค๊ฐ ๋์ผํ๋ค๋ฉด ์๋ ํฌ๊ธฐ์ ๋์ผํ ์๋ฆฌ๋จผํธ๊ฐ ๋ณด์ธ๋ค.
๋ฐ๋ฉด์ ๋ทฐํฌํธ๊ฐ ๋ทฐ๋ฐ์ค๋ณด๋ค ์๋ค๋ฉด(๋ทฐํฌํธ < ๋ทฐ๋ฐ์ค) ์ถ์๋์ด ๋ณด์ด๊ณ ,
๋ทฐํฌํธ๊ฐ ๋ทฐ๋ฐ์ค๋ณด๋ค ํฌ๋ค๋ฉด(๋ทฐํฌํธ > ๋ทฐ๋ฐ์ค) ํ๋๋์ด ๋ณด์ด๊ฒ ๋๋ค.
viewBox๋ฅผ ์ค์ ํ๋ฉด์ viewBox์ ๊ฐ๋ก(width), ์ธ๋ก(height) ๋น์จ(=๋ทฐํฌํธ ๋น์จ)๋ ๊ผญ ๊ฐ์ด ์ค์ ํด ์ฃผ๋๊ฒ์ด ์ข๋ค.
SVG ๊ฐ์ ๋น์จ ์กฐ์ (๊ฐ๋ก/์ธ๋ก ํฌ๊ธฐ๋ฅผ ๋ง๋๋ก)
svg๋ฅผ ์์ญ์ ๊ฐ์ ๊ณ ์ ๋์ด ๋๋ฆฌ๊ฑฐ๋ ์ค์ด๊ณ ์ถ๋ค๋ฉด, preserveAspectRatio ์์ฑ์ ์กฐ์ ํ๋ฉด ๋๋ค.
svg ์ด๋ฏธ์ง ์ฌ์ด์ฆ(๊ฐ๋ก/์ธ๋ก)๋ ๋น์จ๋ก ๋์ค๋๋ฐ, ์ง์ ์ ์ผ๋ก ์กฐ์ ํ๊ณ ์ถ์๋๋ ‘none’์ผ๋ก ์ง์ ํ๋ฉด ๋๋ค.
<svg width="200" height="300" viewBox="0 0 1981.355 1651.144" ...>
...
</svg>
<svg width="200" height="300" viewBox="0 0 1981.355 1651.144" preserveAspectRatio="none" ...>
...
</svg>
<svg preserveAspectRatio="xMaxYMax slice" viewBox="0 0 30 40" width="50" height="30">&Smile;</svg>
<image preserveAspectRatio='xMinYMin meet' width='200' height='300' xlink:href='https://www.google.com/images/logos/google_logo_41.png' ></image>
svg ํฌ๊ธฐ ์กฐ์ ์น์ฌ์ดํธ
SVG ์์ ๋ณ๊ฒฝ
svg ํ๊ทธ ์์ "style", "fill" ์ด๋ผ๋ ์์ฑ์ ๋ณผ ์ ์๋ค.
์ด ์์ฑ์ด ๋ฒกํฐ ๊ฒฝ๋ก ๋ฐ์ดํฐ์ ์์์ ์ฑ์ฐ๋ ์ปฌ๋ฌ ๊ฐ์ ์ง์ ํ๋ ์์ฑ์ด๋ค.
fill ํ๋กํผํฐ๋ฅผ ๋ฐ๋ก ์ธ๋ผ์ธ์ผ๋ก ์ฌ์ฉํด๋ ๋๊ณ ,
<svg width="44" height="44" viewBox="0 0 104 104" fill="yellow">
<path d="M8.64453 8.64453L92.2962 31.0589L31.0589 92.2962L8.64453 8.64453Z" stroke="currentColor" stroke-width="8"></path>
</svg>
์ธ๋ผ์ธ style ํ๋กํผํฐ ์์ css ์์ฑ๊ฐ์ผ๋ก์ ์ฌ์ฉํด๋ ๋๋ค.
<svg width="44" height="44" viewBox="0 0 104 104" style="fill: yellow">
<path d="M8.64453 8.64453L92.2962 31.0589L31.0589 92.2962L8.64453 8.64453Z" stroke="currentColor" stroke-width="8"></path>
</svg>
svg style์ด๋ผ๊ณ ํด์ ํน๋ณํ๊ฒ ์๋ค.
๋๊ฐ์ด ๋งํฌ์ ์คํ์ผ ์์ฑ์ด๋ผ, ๋น์ฐํ cssํ์ผ๋ก ๋ถ๋ฆฌํด ์ ์ด๊ฐ ๊ฐ๋ฅํ๋ค.
svg {
fill: yellow;
}
fill์์ฑ์ ๋ฐ๋์ <svg>ํ๊ทธ์์๋ง ์ธ ์ ์๋ ๊ฒ์ ์๋๋ค.
๋ง์ผ ๋ณต์กํ ๊ทธ๋ฆผ์ svg์ผ๊ฒฝ์ฐ, ๊ฐ๊ฐ์ <path> ํ๊ทธ ์์๋ค๊ฐ fill ์์ฑ์ ์ง์ ํด์ฃผ๋ฉด ์ปฌ๋ฌํํ svg์ด๋ฏธ์ง๋ฅผ ๋ง๋ค ์ ์๋ค.
# ์ฐธ๊ณ ์๋ฃ
https://mingoogle.tistory.com/9