๐ Today I Learned
svg ์ด๋ฏธ์ง ๋ค๋ฃจ๊ธฐ
- ์์๋ณ๊ฒฝ
- ํฌ๊ธฐ์กฐ์
- keyframe ์ ๋๋ฉ์ด์
๐จ์์๋ณ๊ฒฝ
1. style or fill ์์ฑ ์ฌ์ฉ
<div class="red">
<svg width="24" height="24" viewBox="0 0 24 24">
<path fill="red" d="M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm4.393 7.5l-5.643 5.784-2.644-2.506-1.856 1.858 4.5 4.364 7.5-7.643-1.857-1.857z"/>
</svg>
</div>
<path> ํ๊ทธ์ style="fill:___" ์์ฑ์ ์ฌ์ฉํ๊ฑฐ๋, ๋ ๊ฐ๋จํ๊ฒ fill="___" ์์ฑ์ ์ฌ์ฉํ์ฌ svg ์ด๋ฏธ์ง์ ์์์ ์ ์ดํ ์ ์๋ค. ์์์ rgbํํ, hex ๊ฐ, ๋๋ ์์์ ์ด๋ฆ์ ์ง์ ์ ์ํ ์๋ ์๋ค.
style="fill:rgb(42,169,224)"
fill="#689edf"
fill="green"
2. css๋ก ๋ณ๊ฒฝํ๊ธฐ
html
<div class="img-box">
<svg width="24" height="24" viewBox="0 0 24 24">
<path class="green" d="M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm4.393 7.5l-5.643 5.784-2.644-2.506-1.856 1.858 4.5 4.364 7.5-7.643-1.857-1.857z"/>
</svg>
</div>
css
.img-box .green {
fill: green;
}
<path>์ class๋ฅผ ์ฃผ๊ณ css๋ก ์์์ ๋ณ๊ฒฝํ ์ ์๋ค.
๐ํฌ๊ธฐ์กฐ์
<div class="size-up">
<svg class="orange" width="100" height="100" viewBox="0 0 24 24">
<path fill="orange" d="M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm4.393 7.5l-5.643 5.784-2.644-2.506-1.856 1.858 4.5 4.364 7.5-7.643-1.857-1.857z"/>
</svg>
</div>
svg ํ๊ทธ ๋ด๋ถ์ width์ height ์์ฑ์ ๋ช
์ํ๋ฉด ์ฝ๊ฒ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์ ์๋ค.
๋จ, svg์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ๋๋ width์ height๋ฟ ์๋๋ผ viewbox ์์ฑ๋ ์ฃผ์ํด์ผ ํ๋ค.
viewbox
<svg class="orange" width="100" height="100" viewBox="0 0 24 24"
viewbox๋ svg ๋ด๋ถ ์์์ ์ขํ ์์ญ๊ณผ ๋น์จ, ๋ทฐํฌํธ ๋ด์์ ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ์ค ์์น๋ฅผ ์ค์ ํ๋ ์์ฑ์ด๊ณ , min-x , min-y , width , height๋ฅผ ์์๋๋ก ๋ฐ๋๋ค.
- min-x , min-y : ์ผ์ชฝ ์๋ฅผ ๊ธฐ์ค์ ์ผ๋ก ํ๋ ๋ทฐ๋ฐ์ค์ ์ขํ
- width , height : ๋ทฐ๋ฐ์ค์ ๊ฐ๋ก์ธ๋ก ํฌ๊ธฐ
ํด๋น svg์ ํฌ๊ธฐ(viewport)์ viewbox๊ฐ ๋์ผํ๋ค๋ฉด ์๋ ํฌ๊ธฐ์ ๋์ผํ ์์๊ฐ ๋ณด์ธ๋ค.
๋ฐ๋ฉด viewport๊ฐ viewbox๋ณด๋ค ์๋ค๋ฉด(viewport < viewbox) ์ถ์๋์ด ๋ณด์ด๊ณ ,
viewport๊ฐ viewbox๋ณด๋ค ํฌ๋ค๋ฉด(viewport > viewbox) ํ๋๋์ด ๋ณด์ธ๋ค.
๐ฌkeyframe ์ ๋๋ฉ์ด์
html
<div class="stars">
<svg width="75" height="72" viewBox="0 0 75 72" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M22 3.23607L25.9883 15.5106L26.2128 16.2016H26.9393H39.8456L29.4042 23.7877L28.8164 24.2148L29.0409 24.9058L33.0292 37.1803L22.5878 29.5942L22 29.1672L21.4122 29.5942L10.9708 37.1803L14.9591 24.9058L15.1836 24.2148L14.5958 23.7877L4.15444 16.2016H17.0607H17.7872L18.0117 15.5106L22 3.23607Z" stroke="black" stroke-width="2"/>
<path d="M58.3214 25.4489L56.8777 34.2414L56.76 34.9584L57.4055 35.2919L65.3216 39.3819L56.5133 40.726L55.795 40.8356L55.6773 41.5525L54.2337 50.345L50.2335 42.3832L49.9073 41.734L49.1891 41.8436L40.3808 43.1876L46.7168 36.9229L47.2335 36.412L46.9073 35.7628L42.9071 27.801L50.8232 31.891L51.4687 32.2245L51.9853 31.7137L58.3214 25.4489Z" stroke="black" stroke-width="2"/>
<path d="M27.5897 50.2071L30.456 54.3513L30.8693 54.9488L31.5653 54.7404L36.3924 53.295L33.3368 57.3017L32.8962 57.8794L33.3095 58.4769L36.1758 62.6211L31.421 60.9532L30.7355 60.7127L30.2949 61.2904L27.2393 65.297L27.3563 60.2595L27.3731 59.5332L26.6875 59.2927L21.9327 57.6247L26.7598 56.1793L27.4559 55.9709L27.4727 55.2446L27.5897 50.2071Z" stroke="black" stroke-width="2"/>
</svg>
</div>
css
.stars path {
stroke-dasharray: 136;
stroke-dashoffset: 0;
animation: pathAni 5s linear infinite;
}
@keyframes pathAni {
0% {
stroke-dashoffset: 136;
}
50% {
stroke-dashoffset: 0;
}
100% {
stroke-dashoffset: -136;
}
}
1. stroke-dasharray๋ก svg์ ๊ฐ๊ฒฉ ์ฃผ๊ธฐ
stroke-dasharray๋ ์ ์ ๋์ฌ ํํ๋ก ๋ง๋ ๋ค.
path์ ๊ธธ์ด๊ฐ 100์ด๊ณ dasharray๊ฐ 50์ด๋ผ๋ฉด ์ด ๊ทธ๋ฆผ์ ์ ๋ฐ๋ง ๋ณด์ด๊ฒ ๋๋ค. ๋ฐ๋ผ์ svg๋ฅผ ๋ชจ๋ ๋ณด์ด๊ฒ ํ๊ธฐ ์ํด dasharray๋ฅผ path์ ์ ์ฒด ๊ธธ์ด์ ๊ฐ์ ๊ฐ์ ์ค๋ค.
๊ฐ์ ๊ฐ์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
<script type="text/javascript">
path = document.querySelector('path').getTotalLength();
console.log(path);
//172.18614196777344
</script>
2. stroke-dashoffset์ผ๋ก svg๋ฅผ ๋ํ๋ผ ์ง์ ์ ํ๊ธฐ
stroke-dashoffset์ ์ด svg๊ฐ ์ด๋ ์ง์ ์์๋ถํฐ ์์ํ ์ง ์ ํด์ฃผ๋ ์์ฑ์ด๋ค.
dashoffset์ด 50์ผ๋
dashoffset์ด 90์ผ๋
3. ์ ๋๋ฉ์ด์ ๋ฃ๊ธฐ
@keyframes pathAni {
0% {
stroke-dashoffset: 136;
/* 136์ง์ ๋ถํฐ ๋ณด์ฌ์ค (์๋ณด์) */
}
50% {
stroke-dashoffset: 0;
/* 0๋ถํฐ ๋ณด์ฌ์ค (๋ชจ๋ ๋ณด์) */
}
100% {
stroke-dashoffset: -136;
/* -136๋ถํฐ ๋ณด์ฌ์ค (๋ฐ๋๋ก ๊ทธ๋ ค์ง) */
}
}
๐
svg๋ฅผ ์์ ์ ๊ณต๋ถํ์๋๋ ๊ฝค ์ด๋ ค์ ์๋๋ฐ ์ง๊ธ์ ๊ทธ๋ ๋๊ผ๋ ๊ฒ๋งํผ ์์ฃผ ์ด๋ ต์ง๋ ์์ ๊ฒ ๊ฐ๋ค. ๊ทธ๋๋ ์ด๋ ๊ฒ ๋ฐฐ์ด ๋ถ๋ถ์ ์ ์ ๋ฆฌํด๋๋ ์กฐ๊ธ ๋ ์ดํด๊ฐ ์ ๋๋ ๊ฒ ๊ฐ๋ค.