์์ฒ๋ผ ํ ์คํธ์ path๋ฅผ ๋ฐ์ ์ ๋๋ฉ์ด์ ํจ๊ณผ๋ฅผ ์ฃผ๋ ์์ ๋ฅผ ๋ง๋ค์ด๋ดค๋ค.
ํ๋กํ ํ์ดํ ํด๋ก ์ ์ฌ์ฉํ๊ณ ์๋ figma๋ก ๊ธฐ๋ณธ์ด ๋๋ SVG๋ฅผ ๋ง๋ค๊ณ , ๊ฐ๋จํ ์๋ฐ์คํฌ๋ฆฝํธ์ CSS๋ก ์ ๋๋ฉ์ด์ ์ ๋ง๋ค์๋ค.
SVG ํ๊ทธ ์์ฑ
figma๋ก ์๋ฌด draft๋ ์ด์ด์ ์บ๋ฒ์ค๋ฅผ ๋ง๋ ๋ค์, T ์์ด์ฝ์ ๋๋ฌ ํ ์คํธ๋ฅผ ์์ฑํ๋ค. figma์์ ํ๊ธ์ ๋ฐ์นจ์ ํ์ดํํ ๋ ๋ฌธ์ ๊ฐ ์์ด์, ํ๊ตญ์ด ํ ์คํธ๋ก SVG ์์ค๋ฅผ ์ค๋นํด์ผ ํ๋ค๋ฉด, ํฌํ ์ต ๋ฑ ๋ค๋ฅธ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ซ๋ค.
์ด๋ ๊ฒ ์๋ฌด ํ ์คํธ ๋ฐ์ค๊ฐ ์์ฑ๋๊ณ , ํ์ฌ๋ Path๋ฅผ ๋ฐ์ง ์์์ผ๋ฏ๋ก ํ๋์ ํ ํฌ๋ฆฌ๊ฐ ํ ์คํธ ๋ฐ์ค ์ ์ฒด์ ๊ฑธ์ณ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ฌ๊ธฐ์ ์ฐํด๋ฆญ -> outline stroke๋ฅผ ๋๋ฌ์ฃผ๊ณ ,
์ด ์ํ์์ ์ค๋ฅธ์ชฝ์ Design ํจ๋์ Stroke ๋ Fill ์ ์ฌ๋ฌ ์ค์ ๊ฐ์ ์ฃผ์ด ๋์์ธํ๋ค. ๋๋ Fill์ ์ญ์ ํด์ฃผ๊ณ , Stroke์ width๋ฅผ 7๋ก, ๋ฐํ ์์ ํฐ์์ผ๋ก ๋ฐ๊ฟ์ฃผ์๋ค.
์ค์ ์ ๋ง์น๊ณ ๋๋ฉด, code editor์ ๋ถ๋ฌ์ ๋ถ์ฌ๋ฃ์ด์ฃผ๋ฉด ์๋์ฒ๋ผ <svg> ํ๊ทธ ์์ <mask> .. <rect> .. <path> ์์ผ๋ก ์ ์์ค๊ฐ ๋ณต์ฌ๋ ๊ฒ์ ์ ์ ์๋ค. ๋ฌผ๋ก ์ด๋ค ํํ๋ฅผ ๋ง๋๋๋์ ๋ฐ๋ผ ํ๊ทธ๋ ์์ดํ ์ ์๋ค.
SVG Path Animation ๋ง๋ค๊ธฐ
body {
margin: 0;
padding: 0;
background-color: #e7dcc2;
}
#logo {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
ํ์์ ๊ธ์๋ฅผ ๋ฐํ์ผ๋ก ํ๊ณ ์์ผ๋ฏ๋ก, ์์ฒ๋ผ ๊ธฐ๋ณธ CSS๋ฅผ ์์ฑํด์ฃผ๊ณ , ์ด์ getTotalLength()๋ฅผ ์ด์ฉํด ๊ฐ Path์ ์ ์ฒด ๊ธธ์ด๋ฅผ ๊ฐ์ง๊ณ ์ฌ ์ฐจ๋ก์ด๋ค.
์ฐ์ ์ ์ฒด์ ์ธ HTML ํํ๋ ์๋์ ๊ฐ๋ค.
๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด <svg> ์์ <mask>, <rect>, <path> ์์ธ๋ฐ, ์ ๋๋ฉ์ด์ ์ ๋์์ํฌ path๋ <mask> ํ๊ทธ๊ฐ ๋๋๊ณ ๋ ๋ค์์ ์ด 4๊ฐ์ <path> ํ๊ทธ์ด๋ค. ์ด๋ค ํ ์คํธ๋ฅผ ์ฌ์ฉํ๋๋์ ๋ฐ๋ผ ์ด <path> ํ๊ทธ์ ์๋ ๋ฌ๋ผ์ง๋ค.
๊ฐ๊ฐ์ path ํ๊ทธ์๋ myPath๋ผ๋ ํด๋์ค๋ฅผ ์จ์ฃผ์๊ณ , <svg>์๋ logo ์์ด๋๋ฅผ ๋ถ์ฌํ๋ค.
const logo = document.querySelectorAll("#logo .myPath");
for(let i = 0; i < logo.length; i++) {
console.log(`${i+1}๋ฒ์งธ path์ ์ด ๊ธธ์ด ${logo[i].getTotalLength()}`);
}
float someElement.getTotalLength();
path์ ์ด ๊ธธ์ด๋ฅผ ํ์ธํ๊ธฐ ์ํด querySelectorAll๋ก ์ ์ฒด node๋ฅผ ๊ฐ์ง๊ณ ์๋ค. for๋ฌธ์ ๋๋ ค i๋ฒ์งธ ๋ ธ๋์ ์ ์ฒด path ๊ธธ์ด๋ฅผ ๊ฐ์ง๊ณ ์ค๋ getTotalLength() ๋ฉ์๋๋ฅผ ์ด๋ค. ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ด์ด๋ณด๋ฉด ์๋์ฒ๋ผ ์ ์ฒด ๊ธธ์ด๊ฐ ๋ฐํ๋์ด ์จ๋ค.
๋ค์ CSS ํ์ผ๋ก ๋์์, ๊ฐ๊ฐ์ ๊ธ์์ ์ด๋ป๊ฒ stroke ๋ณํ๋ฅผ ์ค ์ ์๋์ง ์์๋ณด๊ธฐ ์ํด nth-child ๋๋ nth-of-type์ ์จ #logo ์๋์ .myPath๋ฅผ ํ๋ ํ๋ ์ ํํด์ค๋ค.
nth-of-type()๊ณผ nth-child() ๋น๊ต
/* nth-of-type์ ์ธ ๊ฒฝ์ฐ */
#logo .myPath:nth-of-type(1) {
}
#logo path:nth-of-type(2) {
}
#logo .myPath:nth-of-type(3) {
}
#logo .myPath:nth-of-type(4) {
}
/* nth-child๋ฅผ ์ธ ๊ฒฝ์ฐ */
#logo path:nth-child(2) {
}
#logo path:nth-child(3) {
}
#logo path:nth-child(4) {
}
#logo path:nth-child(5) {
}
ํ์ฌ html ํ๊ทธ์ <svg> ๋ด๋ถ๋ฅผ ๋ณด๋ฉด <mask> ํ๊ทธ ๊ทธ๋ฆฌ๊ณ 4๊ฐ์ <path> ํ๊ทธ๋ก ๊ตฌ์ฑ๋์ด ์๋ค. nth-child๋ ์๋ก ๋๋ฑํ ์์น์ ํ๊ทธ๋ค ๋ด์์์ ์์๋ฅผ ์ง๊ธฐ ๋๋ฌธ์, #logo์ path์ nth-child()๋ฅผ ์ธ ๊ฒฝ์ฐ mask ํ๊ทธ๋ฅผ ์ผ ๋ค์ 2๋ฒ์งธ์ ๋ฑ์ฅํ๋ฏ๋ก ์ซ์๊ฐ 2๋ถํฐ ์์ํ๊ฒ ๋๋ค.
nth-of-type์ ์ธ ๊ฒฝ์ฐ์๋ ๊ฐ์ ์ข ๋ฅ์ ํ์ ๋ด์์ ์์์ ์์๋ฅผ ์นด์ดํธ ํ๊ธฐ ๋๋ฌธ์, .myPath๋ผ๋ ํด๋์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฌถ๋ , path๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฌถ๋ #logo ํ์์ 4๊ฐ์ <path>๋ง์ ์๊ฐํด ๊ณ์ฐํ๋ฉด ๋๋ค.
stroke-dasharray, stroke-dashoffset
#logo path:nth-of-type(1) { stroke-dasharray: 50px; }
์ ํ๊ทธ๋ฅผ ์ ์ฉํ์ ๋๋ ์ผ์ชฝ์ ๋ชจ์ต๊ณผ ๊ฐ๋ค.
์ด๋ค element์๋ ์ ์ฉ๊ฐ๋ฅํ ์์ฑ์ด์ง๋ง, ์ค์ ๋ก ํจ๊ณผ๋ฅผ ๋ณผ ์ ์๋ ํ๊ทธ๋ ์๋ ์ด ๋ ๊ฐ๋ก ์ ํ์ ์ด๋ค.
<path>, <ellipse>, <line>, <polygon>, <rect>, <text>, <textPath>, <tref>, <tspan>, <altGlyph>, <circle>
dash๋ผ๋ ์ด๋ฆ์ด ๋ค์ด๊ฐ๋ ๊ทธ๋๋ก, ์ ์ ์ ๋ง๋ค์ด์ฃผ๋ ์์ฑ์ด๋ค. ์ด ์์ฑ๊ณผ ๊ฐ์ด stroke-dashoffset ์์ฑ์ด ์ฐ์ด๋๋ฐ, ์ด ์์ฑ์ ์ด๋์์๋ถํฐ ์์ํ ์ง๋ฅผ ์ ํด์ค๋ค.
Animation
์ํ๋ ์ ๋๋ฉ์ด์ ์ ๊ธ์๊ฐ ์ ํ ์๋ค๊ฐ ์์ํ path๊ฐ ๊ทธ๋ ค์ง๋ ํํ๋ก, ์ต์ข ์ ์ผ๋ก๋ ์ ์ฒด๊ฐ ๋ค ๋ณด์ด๋๋ก ํ ๊ฒ์ด๋ค. stroke-dasharray๊ฐ ํด๋น ์์์ ์ ์ฒด ๊ธธ์ด์ ๋์ผํ๋ค๋ฉด, ์ ์ ์ ํ๋๋ ์๋ ์ํ์ด๋ค. ๋ง์ผ offset๋ ๋์ผํ๊ฒ ๊ฐ์ ๊ฐ์ด๋ผ๋ฉด
์ด๋ ๊ฒ ์ฌ๋ผ์ ธ ์๋ ํํ๊ฐ ๋ ๊ฒ์ด๋ค. keyframe ์ ๋๋ฉ์ด์ ์ ํตํด stroke-dashoffset์ 0์ผ๋ก ์ฃผ๋๋ก ํด๋ณธ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ path์
animation: line-anime 5s ease-out forwards; ๋ฅผ ํ ์ค ์ถ๊ฐํ๋ค.
์์๋๋ก ํคํ๋ ์์ ์ด๋ฆ, ์ ๋๋ฉ์ด์ ์์ ์๊ฐ, ์ ๋๋ฉ์ด์ timing function, animation-fill-mode ์ด๋ค. forwards๋ ์ ๋๋ฉ์ด์ ์ด ํคํ๋ ์์ 100%์ ๋๋ฌํ์ ๋ ๋ง์ง๋ง ํคํ๋ ์์ ์ ์งํ๋ค.
๋ง์ง๋ง์ผ๋ก path๋ฅผ ๊ทธ๋ฆฌ๋ ์ ๋๋ฉ์ด์ ์ด ์ข ๋ฃ๋๋ฉด ์ ์ฒด ๊ธ์๋ฅผ ํ์์์ผ๋ก ๊ทธ๋ฆฌ๋ ์ ๋๋ฉ์ด์ ์ ๋ฃ๊ณ ์ข ๋ฃํ๊ณ ์ ํ ๋๋, <svg> ํ๊ทธ์ <mask> ํ๊ทธ์ ๋์์ ์ ๋๋ฉ์ด์ ์ ์ ์ฉํด์ผ ์ ๋๋ก ๋์ํ๋ค. #path-1-outside-1์ <mask> ํ๊ทธ์ ์๋์ผ๋ก ์ค์ ๋์ด ์๋ id ๊ฐ์ด๋ค.
#logo,
#path-1-outside-1 {
animation: fill-out 1s ease-out forwards 2s;
}
@keyframes fill-out {
from {
fill: transparent;
}
to {
fill: white;
}
}
๊ฐ์ธ์ ์ผ๋ก๋ ์์๋ก ์ฌ์ฉํ ํ์์ ๊ฒฝ์ฐ๊ฐ ๋ ์ ๋๋ฉ์ด์ ์์ง์์ด ๋ค์ํด์ ์ ํฉํด ๋ณด์ธ๋ค.
๋ค์์๋ JavaScript๊ฐ ์๋ SCSS๋ก๋ง ์ ๋๋ฉ์ด์ ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ๋ ์ฐพ์๋๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
'๐ฉโ๐ป > Web' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SOP(Same-Origin-Policy), CORS(Cross-Origin-Resource-Sharing) (0) | 2021.05.10 |
---|