CSS Motion Path์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์ ์ฐํ๊ณ ๋น์ ํ์ ์ธ ์ ๋๋ฉ์ด์ ์ ๋ง๋ค์ด ๋ณด์ธ์. ์ด ๊ฐ์ด๋์์๋ ๋ณต์กํ ๊ถค์ , ์ฑ๋ฅ, ๊ทธ๋ฆฌ๊ณ ๊ธ๋ก๋ฒ ์น ๊ฐ๋ฐ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
CSS Motion Path ๋ง์คํฐํ๊ธฐ: ๋งค๋ ฅ์ ์ธ ์น ๊ฒฝํ์ ์ํ ๋ณต์กํ ์ ๋๋ฉ์ด์ ๊ถค์ ์ ์
์ญ๋์ ์ธ ์น ๊ฐ๋ฐ์ ์ธ๊ณ์์, ๋งคํน์ ์ธ ์ ๋๋ฉ์ด์ ์ ๋ ์ด์ ๋จ์ํ ์ฅ์์ด ์๋๋๋ค. ์ง๊ด์ ์ด๊ณ ๊ธฐ์ต์ ๋จ์ผ๋ฉฐ, ๊ณ ์ฑ๋ฅ์ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๋๋ ๋ฐ ํ์์ ์ธ ์์์ ๋๋ค. transitions๋ keyframes์ ๊ฐ์ ์ ํต์ ์ธ CSS ์ ๋๋ฉ์ด์ ๊ธฐ๋ฒ์ ์์๋ฅผ ์ ํ ๊ฒฝ๋ก ๋๋ ๋จ์ํ ํธ๋ฅผ ๋ฐ๋ผ ์์ง์ด๊ฒ ํ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง, ์ง์ ์ผ๋ก ๋ณต์กํ๊ณ ๋น์ ํ์ ์ธ ์์ง์์ ๊ตฌํํด์ผ ํ ๋๋ ์ข ์ข ํ๊ณ์ ๋ถ๋ชํ๋๋ค.
์ ํ ์ด๋ฏธ์ง๊ฐ ์ค์ฌ์ ์ ๊ธฐ์ค์ผ๋ก ์์ฉ๋์ด์น๊ฑฐ๋, ๋ก๊ณ ๊ฐ ํน์ ๋ธ๋๋ ๊ณก์ ์ ๋ฐ๋ผ๊ฐ๊ฑฐ๋, ๋ฐ์ดํฐ ํฌ์ธํธ๊ฐ ์ง๋์์ ์ ํํ ์ง๋ฆฌ์ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ฅด๊ฑฐ๋, ์ธํฐ๋ํฐ๋ธ ์บ๋ฆญํฐ๊ฐ ๋ง์ถค ๋ฏธ๋ก๋ฅผ ํ์ํด์ผ ํ๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ณด์ธ์. ์ด๋ฌํ ๋ณต์กํ ์ ๋๋ฉ์ด์
๊ถค์ ์ transform: translate()
, rotate()
, ๊ทธ๋ฆฌ๊ณ ํ์ด๋ฐ ํจ์์ ์กฐํฉ๋ง์ผ๋ก ์ ๋ฐํ๊ณ ์ ์ฐํ๊ฒ ๊ตฌํํ๋ ๊ฒ์ ๋ฒ๊ฑฐ๋กญ๊ฑฐ๋ ๊ฑฐ์ ๋ถ๊ฐ๋ฅ์ ๊ฐ๊น์ต๋๋ค.
๋ฐ๋ก ์ด ์ง์ ์์ CSS Motion Path๊ฐ ๊ฒ์ ์ฒด์ธ์ ๋ก ๋ฑ์ฅํฉ๋๋ค. ์๋ CSS Motion Path Module Level 1๋ก ๊ตฌ์๋์๊ณ ํ์ฌ CSS Animations Level 2์ ํตํฉ๋ ์ด ๊ฐ๋ ฅํ CSS ๋ชจ๋์ ๊ฐ๋ฐ์๊ฐ ์์์ ์ฌ์ฉ์ ์ ์ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์์์ ์์ง์์ ์ ์ํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ ์์๋ฅผ ์ง์ ๊ณผ ๋จ์ํ ํธ์ ์ ์ฝ์์ ํด๋ฐฉ์์ผ, ๋น๊ตํ ์ ์๋ ์ ์ด๋ ฅ๊ณผ ์ฐ์ํจ์ผ๋ก ๋ณต์กํ๊ณ ๋ง์ถคํ๋ ๊ถค์ ์ ๋ฐ๋ผ ์์ง์ด๊ฒ ํฉ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ๋ ํ๋ถํ๊ณ , ์ ๊ตํ๋ฉฐ, ๋ถ์ธํ ์ ์์ด ๋งค๋ ฅ์ ์ธ ์น ๊ฒฝํ์ด ๋ง๋ค์ด์ง๋๋ค.
์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ CSS Motion Path์ ๋ชจ๋ ์ธก๋ฉด์ ๊น์ด ์๊ฒ ๋ค๋ฃฐ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ ๊ธฐ๋ณธ ์์ฑ๋ค์ ํ์ํ๊ณ , SVG ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ณต์กํ ๊ฒฝ๋ก๋ฅผ ์ ์ํ๋ ๊ธฐ์ ์ ๋ช ํํ ์ค๋ช ํ๋ฉฐ, ์ค์ฉ์ ์ธ ์ ๋๋ฉ์ด์ ๊ธฐ๋ฒ์ ์์ํ๊ณ , ์ฑ๋ฅ ์ต์ ํ, ๋ธ๋ผ์ฐ์ ํธํ์ฑ, ๊ทธ๋ฆฌ๊ณ ๊ฒฐ์ ์ ์ผ๋ก ์ง์ ํ ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ์ ๊ทผ์ฑ๊ณผ ๋ฐ์์ฑ๊ณผ ๊ฐ์ ๊ณ ๊ธ ๊ณ ๋ ค ์ฌํญ๋ค์ ๊น์ด ํ๊ณ ๋ค ๊ฒ์ ๋๋ค. ์ด ์ฌ์ ์ด ๋๋ ๋์ฏค, ์ฌ๋ฌ๋ถ์ ์น ํ๋ก์ ํธ๋ฅผ ์๋ก์ด ์ฐจ์์ผ๋ก ๋์ด์ฌ๋ฆด ๋งคํน์ ์ด๊ณ , ์ ์ฐํ๋ฉฐ, ๋ณต์กํ ์ ๋๋ฉ์ด์ ์ ๋ง๋ค ์ ์๋ ์ง์๊ณผ ๋๊ตฌ๋ฅผ ๊ฐ์ถ๊ฒ ๋ ๊ฒ์ ๋๋ค.
CSS Motion Path์ ๊ธฐ๋ณธ ์์ฑ
ํต์ฌ์ ์ผ๋ก, CSS Motion Path๋ ์ ๋๋ฉ์ด์ ์ ํจ๋ฌ๋ค์์ ์์์ x/y ์ขํ๋ฅผ ์กฐ์ํ๋ ๊ฒ์์ ๋ฏธ๋ฆฌ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์์น์ํค๋ ๊ฒ์ผ๋ก ์ ํํฉ๋๋ค. ์ค๊ฐ ์์น๋ฅผ ์๋์ผ๋ก ๊ณ์ฐํ๋ ๋์ , ๊ฒฝ๋ก๋ฅผ ์ ์ํ๊ธฐ๋ง ํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ํด๋น ๊ถค์ ์ ๋ฐ๋ผ ๋ณต์กํ ์์น ์ง์ ์ ์ฒ๋ฆฌํฉ๋๋ค. ์ด ๋ชจ๋์ ์ ๊ทผ ๋ฐฉ์์ ์ ์ ์๋ CSS ์์ฑ ์งํฉ์ ์ํด ๊ตฌ๋๋ฉ๋๋ค:
offset-path
: ์ ๋๋ฉ์ด์
๊ถค์ ์ ์ํ๊ธฐ
offset-path
์์ฑ์ CSS Motion Path์ ์ด์์
๋๋ค. ์ด๊ฒ์ ์์๊ฐ ๋ฐ๋ผ๊ฐ ๊ธฐํํ์ ๊ฒฝ๋ก๋ฅผ ์ ์ํฉ๋๋ค. ์์๊ฐ ๋ฏธ๋๋ฌ์ง๋ ๋ณด์ด์ง ์๋ ๋ ์ผ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค. ์ ์๋ offset-path
๊ฐ ์์ผ๋ฉด ์์๊ฐ ๋ฐ๋ผ๊ฐ ๊ถค์ ์ด ์์ต๋๋ค.
- ๋ฌธ๋ฒ:
none | <path()> | <url()> | <basic-shape>
none
: ๊ธฐ๋ณธ๊ฐ์ ๋๋ค.none
์ผ๋ก ์ค์ ๋๋ฉด ๋ชจ์ ๊ฒฝ๋ก๊ฐ ์ ์๋์ง ์์ผ๋ฉฐ, ์์๋ ์ด ๋ชจ๋์ ์ํด ์ง์ ๋ ํน์ ๊ถค์ ์ ๋ฐ๋ฅด์ง ์์ต๋๋ค.<path()>
: ์ด๊ฒ์ ํ๋ฆผ์์ด ๊ฐ์ฅ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ์ต์ ์ ๋๋ค. SVG ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ์ ๊ฒฝ๋ก๋ฅผ ์ ์ํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ฅผ ํตํด ์์ํ ์ ์๋ ๊ฑฐ์ ๋ชจ๋ ๋ณต์กํ ๋ชจ์, ๊ณก์ ๋๋ ๊ถค์ ์ ๋ง๋ค ์ ์์ต๋๋ค. ๋ค์ ์น์ ์์ SVG ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ธํ ์ดํด๋ณผ ๊ฒ์ด์ง๋ง, ์ง๊ธ์ ์ด ํจ์๊ฐ SVG ๊ฒฝ๋ก ๋ช ๋ น์ด ๋ฌธ์์ด(์:path('M 0 0 L 100 100 Q 150 50, 200 100 Z')
)์ ๋ฐ๋๋ค๋ ๊ฒ์ ์ดํดํ์ธ์.path()
๋ด์ ์ขํ๋ ์ ๋๋ฉ์ด์ ๋๋ ์์์ ํฌํจ ๋ธ๋ก(containing block)์ ์๋์ ์ ๋๋ค.<url()>
: ์ด ์ต์ ์ ์ฌ์ฉํ๋ฉด HTML ๋ด์ ์ธ๋ผ์ธ SVG๋ ์ธ๋ถ SVG ํ์ผ ๋ฑ ๋ค๋ฅธ ๊ณณ์ ์ ์๋ SVG<path>
์์๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด,url(#myCustomPath)
๋id="myCustomPath"
๋ฅผ ๊ฐ์ง ๊ฒฝ๋ก ์์๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ์ด๋ ์ฌ๋ฌ ์์๋ ํ์ด์ง์ ๊ฑธ์ณ ๋ณต์กํ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฌ์ฉํ๊ฑฐ๋, ๊ฒฝ๋ก ๋ฐ์ดํฐ๊ฐ SVG ์์ฐ์์ ๋ณ๋๋ก ๊ด๋ฆฌ๋ ๋ ํนํ ์ ์ฉํฉ๋๋ค.<basic-shape>
: ๋ ๊ฐ๋จํ๊ณ ์ผ๋ฐ์ ์ธ ๊ธฐํํ์ ๊ถค์ ์ ์ํด ํ์ค CSS ๊ธฐ๋ณธ ๋ํ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ์ง๊ด์ ์ด๋ฉฐ SVG ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ณด๋ค ์๋ ์ขํ ์ ์๊ฐ ๋ ํ์ํฉ๋๋ค.circle(<radius> at <position>)
: ์ํ ๊ฒฝ๋ก๋ฅผ ์ ์ํฉ๋๋ค. ๋ฐ์ง๋ฆ๊ณผ ์ค์ฌ์ ์ ์ง์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด,circle(50% at 50% 50%)
๋ ์์์ ํฌํจ ๋ธ๋ก์ ์ฑ์ฐ๋ ์์ ๋ง๋ญ๋๋ค.ellipse(<radius-x> <radius-y> at <position>)
: ์๊ณผ ์ ์ฌํ์ง๋ง X์ถ๊ณผ Y์ถ์ ๋ํด ๋ ๋ฆฝ์ ์ธ ๋ฐ์ง๋ฆ์ ํ์ฉํ์ฌ ํ์ํ ๊ฒฝ๋ก๋ฅผ ๋ง๋ญ๋๋ค. ์:ellipse(40% 60% at 50% 50%)
.polygon(<point1>, <point2>, ...)
: ์ ์ ์ ๋์ดํ์ฌ ๋ค๊ฐํ ๊ฒฝ๋ก๋ฅผ ์ ์ํฉ๋๋ค(์: ์ ์ฌ๊ฐํ์ ๊ฒฝ์ฐpolygon(0 0, 100% 0, 100% 100%, 0 100%)
). ์ผ๊ฐํ, ์ฌ๊ฐํ ๋๋ ๋ถ๊ท์นํ ๋ค๊ฐํ ๊ฒฝ๋ก์ ํ์ํฉ๋๋ค.inset(<top> <right> <bottom> <left> round <border-radius>)
: ์ ํ์ ์ผ๋ก ๋ฅ๊ทผ ๋ชจ์๋ฆฌ๊ฐ ์๋ ์ง์ฌ๊ฐํ ๊ฒฝ๋ก๋ฅผ ์ ์ํฉ๋๋ค. ์ด๋clip-path
์์ฑ์inset()
๊ณผ ์ ์ฌํ๊ฒ ์๋ํฉ๋๋ค. ์:inset(10% 20% 10% 20% round 15px)
.
- ์ด๊ธฐ๊ฐ:
none
offset-distance
: ๊ฒฝ๋ก์ ์์น ์ง์ ํ๊ธฐ
offset-path
๊ฐ ์ ์๋๋ฉด, offset-distance
์์ฑ์ ์์๊ฐ ํด๋น ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์ผ๋ง๋ ๋ฉ๋ฆฌ ์์นํด์ผ ํ๋์ง๋ฅผ ์ง์ ํฉ๋๋ค. ์ด๊ฒ์ ์์๋ฅผ ์ ์๋ ๊ถค์ ์ ๋ฐ๋ผ ์์ง์ด๊ฒ ํ๊ธฐ ์ํด ์ ๋๋ฉ์ด์
ํ ์ฃผ์ ์์ฑ์
๋๋ค.
- ๋ฌธ๋ฒ:
<length-percentage>
- ๋จ์: ๊ฐ์ ํผ์ผํธ(์:
0%
,50%
,100%
) ๋๋ ์ ๋ ๊ธธ์ด(์:0px
,200px
,5em
)๋ก ํํ๋ ์ ์์ต๋๋ค. - ํผ์ผํธ ๊ฐ: ํผ์ผํธ๋ฅผ ์ฌ์ฉํ ๋, ๊ฐ์
offset-path
์ ์ด ๊ณ์ฐ๋ ๊ธธ์ด์ ์๋์ ์ ๋๋ค. ์๋ฅผ ๋ค์ด,50%
๋ ์ ๋ ๊ธธ์ด์ ๊ด๊ณ์์ด ์์๋ฅผ ๊ฒฝ๋ก์ ์ ํํ ์ค๊ฐ ์ง์ ์ ์์น์ํต๋๋ค. ์ด๋ ๊ฒฝ๋ก ์์ฒด๊ฐ ํฌ๊ธฐ ์กฐ์ ๋ ๊ฒฝ์ฐ ์ ๋๋ฉ์ด์ ์ด ์์ฐ์ค๋ฝ๊ฒ ํ์ฅ๋๋ฏ๋ก ๋ฐ์ํ ๋์์ธ์ ๋งค์ฐ ๊ถ์ฅ๋ฉ๋๋ค. - ์ ๋ ๊ธธ์ด ๊ฐ: ์ ๋ ๊ธธ์ด๋ ๊ฒฝ๋ก์ ์์์ ์ผ๋ก๋ถํฐ ํน์ ํฝ์ (๋๋ ๋ค๋ฅธ ๊ธธ์ด ๋จ์) ๊ฑฐ๋ฆฌ์ ์์๋ฅผ ์์น์ํต๋๋ค. ์ ๋ฐํ์ง๋ง JavaScript๋ก ๋์ ์ผ๋ก ๊ด๋ฆฌํ์ง ์๋ ํ ๋ฐ์ํ ๋ ์ด์์์๋ ๋ ์ ์ฐํฉ๋๋ค.
- ์ ๋๋ฉ์ด์
๋๋ผ์ด๋ฒ: ์ด ์์ฑ์ ์ ๋๋ฉ์ด์
๋๋๋ก ์ค๊ณ๋์์ต๋๋ค.
offset-distance
๋ฅผ0%
์์100%
(๋๋ ์ํ๋ ๋ฒ์)๋ก ์ ํํ๊ฑฐ๋ ์ ๋๋ฉ์ด์ ํจ์ผ๋ก์จ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์์ง์ด๋ ๋ฏํ ํ์์ ๋ง๋ค์ด๋ ๋๋ค. - ์ด๊ธฐ๊ฐ:
0%
offset-rotate
: ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์์ ๋ฐฉํฅ ๋ง์ถ๊ธฐ
์์๊ฐ ๊ณก์ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์์ง์ผ ๋, ์ข
์ข
์์๊ฐ ํ์ ํ์ฌ ๊ฒฝ๋ก์ ๋ฐฉํฅ๊ณผ ์ ๋ ฌ๋๊ธฐ๋ฅผ ์ํฉ๋๋ค. ์ด๋ ๋ ์์ฐ์ค๋ฝ๊ณ ํ์ค์ ์ธ ์์ง์์ ๋ง๋ค์ด๋
๋๋ค. offset-rotate
์์ฑ์ด ์ด ๋ฐฉํฅ ์ค์ ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ๋ฌธ๋ฒ:
auto | reverse | <angle> | auto <angle> | reverse <angle>
auto
: ๊ฐ์ฅ ์ผ๋ฐ์ ์ด๊ณ ์ข ์ข ์ํ๋ ๊ฐ์ ๋๋ค. ์์์ Y์ถ(๋๋ ๊ฒฝ๋ก์ ๋ฒ์ )์ ํ์ฌ ์ง์ ์์์ ๊ฒฝ๋ก ๋ฐฉํฅ๊ณผ ์ ๋ ฌํ๋๋ก ์๋์ผ๋ก ํ์ ์ํต๋๋ค. ๊ตฌ๋ถ๊ตฌ๋ถํ ๊ธธ์ ๋ฐ๋ผ ์ด์ ํ๋ ์ฐจ๋ฅผ ์์ํด ๋ณด์ธ์. ์ฐจ์ ์๋ถ๋ถ์ ํญ์ ์งํ ๋ฐฉํฅ์ ํฅํฉ๋๋ค. ์ด๊ฒ์ดauto
๊ฐ ํ๋ ์ผ์ ๋๋ค.reverse
:auto
์ ์ ์ฌํ์ง๋ง, ์์์ Y์ถ์ด ๊ฒฝ๋ก์ ๋ฐฉํฅ์์ 180๋ ํ์ ๋ฉ๋๋ค. ๊ฐ์ฒด๊ฐ ๊ถค์ ์ ๋ฐ๋ผ ๋ค๋ฅผ ํฅํ๋ ํจ๊ณผ ๋ฑ์ ์ ์ฉํฉ๋๋ค.<angle>
: ๊ฒฝ๋ก์ ๋ฐฉํฅ์ ๊ด๊ณ์์ด ์์์ ์ ์ฉ๋๋ ๊ณ ์ ๋ ํ์ ์ ๋๋ค. ์๋ฅผ ๋ค์ด,offset-rotate: 90deg;
๋ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์์ง์ด๋ ๊ฒ๊ณผ ์๊ด์์ด ํญ์ ์์์ ๊ธฐ๋ณธ ๋ฐฉํฅ์์ 90๋ ํ์ ์ํต๋๋ค. ์์ง์ด๋ฉด์ ๊ณ ์ ๋ ๋ฐฉํฅ์ ์ ์งํด์ผ ํ๋ ์์์ ์ ์ฉํฉ๋๋ค.auto <angle>
/reverse <angle>
: ์ด ๊ฐ๋ค์auto
๋๋reverse
์ ์๋ ํ์ ๊ณผ ์ถ๊ฐ์ ์ธ ๊ณ ์ ์คํ์ ํ์ ์ ๊ฒฐํฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด,auto 45deg
๋ ์์๊ฐ ๊ฒฝ๋ก ๋ฐฉํฅ๊ณผ ์ ๋ ฌ๋ ํ ์ถ๊ฐ๋ก 45๋ ํ์ ํ๊ฒ ๋ง๋ญ๋๋ค. ์ด๋ฅผ ํตํด ๊ฒฝ๋ก์์ ์์ฐ์ค๋ฌ์ด ์ ๋ ฌ์ ์ ์งํ๋ฉด์ ์์์ ๋ฐฉํฅ์ ๋ฏธ์ธ ์กฐ์ ํ ์ ์์ต๋๋ค.- ์ด๊ธฐ๊ฐ:
auto
offset-anchor
: ๊ฒฝ๋ก์ ์์์ ๊ธฐ์ค์ ์ง์ ํ๊ธฐ
๊ธฐ๋ณธ์ ์ผ๋ก, ์์๊ฐ offset-path
๋ฅผ ๋ฐ๋ผ ์์ง์ผ ๋, ์์์ ์ค์ฌ(transform-origin: 50% 50%
์ ํด๋น)์ด ๊ฒฝ๋ก์ ๊ณ ์ ๋ฉ๋๋ค. offset-anchor
์์ฑ์ ์ฌ์ฉํ๋ฉด ์ด ๊ณ ์ ์ ์ ๋ณ๊ฒฝํ์ฌ ์์์ ์ด๋ ๋ถ๋ถ์ด ๊ฒฝ๋ก๋ฅผ ์ ํํ๊ฒ ๋ฐ๋ผ์ผ ํ๋์ง ์ง์ ํ ์ ์์ต๋๋ค.
- ๋ฌธ๋ฒ:
auto | <position>
auto
: ๊ธฐ๋ณธ๊ฐ์ ๋๋ค. ์์์ ์ค์ฌ์ (50% 50%)์ดoffset-path
๋ฅผ ๋ฐ๋ผ ์ด๋ํ๋ ๊ณ ์ ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.<position>
: ํ์ค CSS ์์น ๊ฐ(์:top left
,20% 80%
,50px 100px
)์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ์ ๊ณ ์ ์ ์ ์ง์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด,offset-anchor: 0% 0%;
๋ก ์ค์ ํ๋ฉด ์์์ ์ผ์ชฝ ์๋จ ๋ชจ์๋ฆฌ๊ฐ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ฅด๊ฒ ๋ฉ๋๋ค. ์ด๋ ์์๊ฐ ๋์นญ์ด ์๋๊ฑฐ๋ ํน์ ์๊ฐ์ ์ง์ (์: ํ์ดํ์ ๋, ์บ๋ฆญํฐ์ ๋ฐ)์ด ๊ฒฝ๋ก๋ฅผ ์ ํํ๊ฒ ์ถ์ ํด์ผ ํ ๋ ๋งค์ฐ ์ค์ํฉ๋๋ค.- ํ์ ์ ๋ฏธ์น๋ ์ํฅ:
offset-anchor
๋transform-origin
์ดtransform: rotate()
์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ๊ณผ ์ ์ฌํ๊ฒ,offset-rotate
๊ฐ ์ฌ์ฉ๋ ๊ฒฝ์ฐ ์์๊ฐ ํ์ ํ๋ ์ค์ฌ์ ์๋ ์ํฅ์ ์ค๋๋ค. - ์ด๊ธฐ๊ฐ:
auto
path()
๋ก ๋ณต์กํ ์ ๋๋ฉ์ด์
๊ฒฝ๋ก ์ ์ํ๊ธฐ
๊ธฐ๋ณธ ๋ํ์ ์, ํ์, ๋ค๊ฐํ์ ํธ๋ฆฌํ์ง๋ง, ๋ณต์กํ ๊ถค์ ์ ๋ํ CSS Motion Path์ ์ง์ ํ ํ์ SVG ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ๋ path()
ํจ์์์ ๋์ต๋๋ค. SVG(Scalable Vector Graphics)๋ ๋ฒกํฐ ๋ํ์ ์ค๋ช
ํ๊ธฐ ์ํ ๊ฒฌ๊ณ ํ๊ณ ์ ๋ฐํ ์ธ์ด๋ฅผ ์ ๊ณตํ๋ฉฐ, ๊ทธ ๊ฒฝ๋ก ๋ช
๋ น์ด๋ฅผ ํ์ฉํ์ฌ ์์ํ ์ ์๋ ๊ฑฐ์ ๋ชจ๋ ๊ณก์ ์ด๋ ์ ๋ถ์ ์ ์ํ ์ ์์ต๋๋ค.
SVG ๊ฒฝ๋ก ๋ช ๋ น์ด๋ฅผ ์ดํดํ๋ ๊ฒ์ ๋ณต์กํ ๋ชจ์ ๊ฒฝ๋ก๋ฅผ ๋ง์คํฐํ๋ ๋ฐ ๊ธฐ๋ณธ์ ๋๋ค. ์ด ๋ช ๋ น์ด๋ค์ ๊ฐ๊ฒฐํ ๋ฏธ๋ ์ธ์ด๋ก, ํ๋์ ๋ฌธ์(์ ๋ ์ขํ๋ ๋๋ฌธ์, ์๋ ์ขํ๋ ์๋ฌธ์) ๋ค์ ํ๋ ์ด์์ ์ขํ ์์ด๋ ๊ฐ์ด ๋ฐ๋ฆ ๋๋ค. ๋ชจ๋ ์ขํ๋ SVG์ ์ขํ๊ณ(์ผ๋ฐ์ ์ผ๋ก ์ผ์ชฝ ์๋จ์ด 0,0, ์์ X๋ ์ค๋ฅธ์ชฝ, ์์ Y๋ ์๋)์ ์๋์ ์ ๋๋ค.
์ฃผ์ SVG ๊ฒฝ๋ก ๋ช ๋ น์ด ์ดํดํ๊ธฐ:
๋ค์์ ๋ณต์กํ ๊ฒฝ๋ก๋ฅผ ์ ์ํ๋ ๋ฐ ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ช ๋ น์ด๋ค์ ๋๋ค:
M
๋๋m
(Moveto):- ๋ฌธ๋ฒ:
M x y
๋๋m dx dy
M
๋ช ๋ น์ด๋ ์ ์ ๊ทธ๋ฆฌ์ง ์๊ณ "ํ"์ ์๋ก์ด ์ง์ ์ผ๋ก ์ด๋์ํต๋๋ค. ๊ฑฐ์ ํญ์ ๊ฒฝ๋ก์ ์ฒซ ๋ฒ์งธ ๋ช ๋ น์ด๋ก, ์์์ ์ ์ค์ ํฉ๋๋ค.- ์:
M 10 20
(์ ๋ ์์น X=10, Y=20์ผ๋ก ์ด๋).m 5 10
(ํ์ฌ ์ง์ ์์ ์ค๋ฅธ์ชฝ์ผ๋ก 5๋จ์, ์๋๋ก 10๋จ์ ์ด๋).
- ๋ฌธ๋ฒ:
L
๋๋l
(Lineto):- ๋ฌธ๋ฒ:
L x y
๋๋l dx dy
- ํ์ฌ ์ง์ ์์ ์ง์ ๋ ์๋ก์ด ์ง์ (x, y)๊น์ง ์ง์ ์ ๊ทธ๋ฆฝ๋๋ค.
- ์:
L 100 50
(์ ๋ ์์น X=100, Y=50๊น์ง ์ ์ ๊ทธ๋ฆผ).
- ๋ฌธ๋ฒ:
H
๋๋h
(Horizontal Lineto):- ๋ฌธ๋ฒ:
H x
๋๋h dx
- ํ์ฌ ์ง์ ์์ ์ง์ ๋ X ์ขํ๊น์ง ์ํ์ ์ ๊ทธ๋ฆฝ๋๋ค.
- ์:
H 200
(X=200๊น์ง ์ํ์ ์ ๊ทธ๋ฆผ).
- ๋ฌธ๋ฒ:
V
๋๋v
(Vertical Lineto):- ๋ฌธ๋ฒ:
V y
๋๋v dy
- ํ์ฌ ์ง์ ์์ ์ง์ ๋ Y ์ขํ๊น์ง ์์ง์ ์ ๊ทธ๋ฆฝ๋๋ค.
- ์:
V 150
(Y=150๊น์ง ์์ง์ ์ ๊ทธ๋ฆผ).
- ๋ฌธ๋ฒ:
C
๋๋c
(Cubic Bรฉzier Curve):- ๋ฌธ๋ฒ:
C x1 y1, x2 y2, x y
๋๋c dx1 dy1, dx2 dy2, dx dy
- ๋ถ๋๋ฝ๊ณ ๋ณต์กํ ๊ณก์ ์ ๊ทธ๋ฆฌ๋ ๋ฐ ๊ฐ์ฅ ๊ฐ๋ ฅํ ๋ช
๋ น์ด ์ค ํ๋์
๋๋ค. ๋ ๊ฐ์ ์ ์ด์ (
x1 y1
๊ณผx2 y2
)๊ณผ ๋์ (x y
)์ ์ธ ์ ์ด ํ์ํฉ๋๋ค. ๊ณก์ ์ ํ์ฌ ์ง์ ์์ ์์ํ์ฌx1 y1
์ ํฅํด ๊ตฌ๋ถ๋ฌ์ง๊ณ , ๊ทธ ๋ค์x2 y2
๋ฅผ ํฅํด ๊ตฌ๋ถ๋ฌ์ง ํ, ๋ง์ง๋ง์ผ๋กx y
์์ ๋๋ฉ๋๋ค. - ์:
C 50 0, 150 100, 200 50
(ํ์ฌ ์ง์ ์์ ์์ํ์ฌ, ์ ์ด์ 1์ 50,0, ์ ์ด์ 2๋ 150,100, ๋์ ์ 200,50).
- ๋ฌธ๋ฒ:
S
๋๋s
(Smooth Cubic Bรฉzier Curve):- ๋ฌธ๋ฒ:
S x2 y2, x y
๋๋s dx2 dy2, dx dy
- ์ผ๋ จ์ ๋ถ๋๋ฌ์ด ๊ณก์ ์ ์ํ ๋ ์ฌ์ฉ๋๋ 3์ฐจ ๋ฒ ์ง์ ๊ณก์ ์ ์ฝ์ด์
๋๋ค. ์ฒซ ๋ฒ์งธ ์ ์ด์ ์ ์ด์
C
๋๋S
๋ช ๋ น์ด์ ๋ ๋ฒ์งธ ์ ์ด์ ์ ๋ฐ์ฌ๋ก ๊ฐ์ฃผ๋์ด ์ฐ์์ ์ด๊ณ ๋ถ๋๋ฌ์ด ์ ํ์ ๋ณด์ฅํฉ๋๋ค. ๋ ๋ฒ์งธ ์ ์ด์ ๊ณผ ๋์ ๋ง ์ง์ ํ๋ฉด ๋ฉ๋๋ค. - ์:
C
๋ช ๋ น์ด ๋ค์์S 300 0, 400 50
์ ์ด์ ๊ณก์ ์ ๋ฐ์ฌ๋ ์ ์ด์ ์ ์ฌ์ฉํ์ฌ ๋ถ๋๋ฌ์ด ๊ณก์ ์ ๋ง๋ญ๋๋ค.
- ๋ฌธ๋ฒ:
Q
๋๋q
(Quadratic Bรฉzier Curve):- ๋ฌธ๋ฒ:
Q x1 y1, x y
๋๋q dx1 dy1, dx dy
- 3์ฐจ ๊ณก์ ๋ณด๋ค ๊ฐ๋จํ๋ฉฐ, ํ๋์ ์ ์ด์ (
x1 y1
)๊ณผ ๋์ (x y
)์ด ํ์ํฉ๋๋ค. ๊ณก์ ์ ํ์ฌ ์ง์ ์์ ์์ํ์ฌ ๋จ์ผ ์ ์ด์ ์ ํฅํด ๊ตฌ๋ถ๋ฌ์ง๊ณx y
์์ ๋๋ฉ๋๋ค. - ์:
Q 75 0, 100 50
(ํ์ฌ ์ง์ ์์ ์์ํ์ฌ, ์ ์ด์ ์ 75,0, ๋์ ์ 100,50).
- ๋ฌธ๋ฒ:
T
๋๋t
(Smooth Quadratic Bรฉzier Curve):- ๋ฌธ๋ฒ:
T x y
๋๋t dx dy
- 3์ฐจ ๊ณก์ ์ ๋ํ
S
์ ์ ์ฌํ, 2์ฐจ ๋ฒ ์ง์ ๊ณก์ ์ ์ฝ์ด์ ๋๋ค. ์ ์ด์ ์ ์ด์ Q
๋๋T
๋ช ๋ น์ด์ ์ ์ด์ ์ ๋ฐ์ฌ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ๋์ ๋ง ์ง์ ํ๋ฉด ๋ฉ๋๋ค. - ์:
Q
๋ช ๋ น์ด ๋ค์์T 200 50
์ 200,50๊น์ง ๋ถ๋๋ฌ์ด ๊ณก์ ์ ๋ง๋ญ๋๋ค.
- ๋ฌธ๋ฒ:
A
๋๋a
(Elliptical Arc Curve):- ๋ฌธ๋ฒ:
A rx ry x-axis-rotation large-arc-flag sweep-flag x y
๋๋a rx ry x-axis-rotation large-arc-flag sweep-flag dx dy
- ์ด ๋ช ๋ น์ด๋ ํ์ํ ํธ๋ฅผ ๊ทธ๋ฆฝ๋๋ค. ์์ด๋ ํ์์ ์ผ๋ถ๋ฅผ ๊ทธ๋ฆฌ๋ ๋ฐ ๋งค์ฐ ๋ค์ฌ๋ค๋ฅํฉ๋๋ค.
rx, ry
: ํ์์ ๋ฐ์ง๋ฆ.x-axis-rotation
: X์ถ์ ๋ํ ํ์์ ํ์ .large-arc-flag
: ๋ถ๋ฆฌ์ธ ํ๋๊ทธ(0
๋๋1
).1
์ด๋ฉด ๊ฐ๋ฅํ ๋ ํธ ์ค ๋ ํฐ ํธ๋ฅผ,0
์ด๋ฉด ๋ ์์ ํธ๋ฅผ ์ ํํฉ๋๋ค.sweep-flag
: ๋ถ๋ฆฌ์ธ ํ๋๊ทธ(0
๋๋1
).1
์ด๋ฉด ์์ ๊ฐ๋ ๋ฐฉํฅ(์๊ณ ๋ฐฉํฅ)์ผ๋ก,0
์ด๋ฉด ์์ ๊ฐ๋ ๋ฐฉํฅ(๋ฐ์๊ณ ๋ฐฉํฅ)์ผ๋ก ํธ๋ฅผ ๊ทธ๋ฆฝ๋๋ค.x, y
: ํธ์ ๋์ .- ์:
A 50 50 0 0 1 100 0
(ํ์ฌ ์ง์ ์์ ๋ฐ์ง๋ฆ 50,50, X์ถ ํ์ ์์, ์์ ํธ, ์๊ณ ๋ฐฉํฅ์ผ๋ก, ๋์ 100,0๊น์ง ํธ๋ฅผ ๊ทธ๋ฆผ).
- ๋ฌธ๋ฒ:
Z
๋๋z
(Closepath):- ๋ฌธ๋ฒ:
Z
๋๋z
- ํ์ฌ ์ง์ ์์ ํ์ฌ ํ์ ๊ฒฝ๋ก์ ๋งจ ์ฒ์ ์ง์ ๊น์ง ์ง์ ์ ๊ทธ๋ ค ํจ๊ณผ์ ์ผ๋ก ๋ชจ์์ ๋ซ์ต๋๋ค.
- ์:
Z
(๊ฒฝ๋ก๋ฅผ ๋ซ์).
- ๋ฌธ๋ฒ:
๊ฒฝ๋ก ์ ์ ์์
๊ฑฐ์น ๋ฐ๋ค ์๋ฅผ ๋ ๋ค๋๋ ๋ฐฐ๋ ์ญ๋์ ์ธ ์๋์ง ํ๋๊ณผ ๊ฐ์ ๋ณต์กํ๊ณ ๋ฌผ๊ฒฐ์น๋ ์์ง์์ ์๋ฎฌ๋ ์ด์ ํ๋ ๊ฒฝ๋ก์ ๊ฐ๋ ์ ์์ ๋ฅผ ๋ค์ด๋ณด๊ฒ ์ต๋๋ค:
.wavy-element { offset-path: path('M 0 50 Q 50 0, 100 50 T 200 50 Q 250 100, 300 50 T 400 50'); }
์ด ์์ ์์:
M 0 50
: ๊ฒฝ๋ก๊ฐ ์ขํ (0, 50)์์ ์์๋ฉ๋๋ค.
Q 50 0, 100 50
: (100, 50)๊น์ง 2์ฐจ ๋ฒ ์ง์ ๊ณก์ ์ ๊ทธ๋ฆฌ๋ฉฐ, (50, 0)์ ๋จ์ผ ์ ์ด์ ์ผ๋ก ์ฌ์ฉํ์ฌ ์ด๊ธฐ ์์ชฝ ๊ณก์ ์ ๋ง๋ญ๋๋ค.
T 200 50
: (200, 50)๊น์ง ๋ถ๋๋ฌ์ด 2์ฐจ ๊ณก์ ์ ๊ทธ๋ฆฝ๋๋ค. T
๋ช
๋ น์ด์ด๋ฏ๋ก ์ ์ด์ ์ ์ด์ Q
๋ช
๋ น์ด์ ์ ์ด์ ์์ ํ์๋์ด ์ฐ์์ ์ธ ๋ฌผ๊ฒฐ ํจํด์ ๋ง๋ญ๋๋ค.
Q 250 100, 300 50
: ์ด๋ฒ์๋ ์๋๋ก ๊ตฌ๋ถ๋ฌ์ง๋ ๋ ๋ค๋ฅธ 2์ฐจ ๊ณก์ ์
๋๋ค.
T 400 50
: ๋ฌผ๊ฒฐ์ ํ์ฅํ๋ ๋ ๋ค๋ฅธ ๋ถ๋๋ฌ์ด 2์ฐจ ๊ณก์ ์
๋๋ค. ์ด ๊ฒฝ๋ก๋ ์์๊ฐ ์ํ์ผ๋ก ์ด๋ํ๋ฉด์ ์์ง์ผ๋ก ์ง๋ํ๊ฒ ๋ง๋ญ๋๋ค.
SVG ๊ฒฝ๋ก ์์ฑ์ ์ํ ๋๊ตฌ
๊ฒฝ๋ก ๋ช ๋ น์ด๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํ์ง๋ง, ๋ณต์กํ SVG ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ ๊ฒ์ ํ๋ค๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค. ๋คํํ๋, ์ฌ๋ฌ ๋๊ตฌ๋ค์ด ์ด๋ฅผ ๋์์ค ์ ์์ต๋๋ค:
- ๋ฒกํฐ ๊ทธ๋ํฝ ํธ์ง๊ธฐ: Adobe Illustrator, Affinity Designer ๋๋ ์คํ ์์ค์ธ Inkscape์ ๊ฐ์ ์ ๋ฌธ ๋์์ธ ์ํํธ์จ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์๊ฐ์ ์ผ๋ก ์ด๋ค ๋ชจ์์ด๋ ๊ทธ๋ฆฐ ๋ค์ SVG ํ์ผ๋ก ๋ด๋ณด๋ผ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ํ
์คํธ ํธ์ง๊ธฐ์์ SVG ํ์ผ์ ์ด๊ณ
<path>
์์์d
์์ฑ ๊ฐ์ ๋ณต์ฌํ๋ฉด ๋๋๋ฐ, ์ฌ๊ธฐ์ ๊ฒฝ๋ก ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. - ์จ๋ผ์ธ SVG ๊ฒฝ๋ก ํธ์ง๊ธฐ/์์ฑ๊ธฐ: SVGator๋ ๋ค์ํ ์จ๋ผ์ธ CodePen ์์ ์ ๊ฐ์ ์น์ฌ์ดํธ ๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ์ ๊ทธ๋ฆฌ๊ณ , ๋ฒ ์ง์ ๊ณก์ ์ ์กฐ์ํ๋ฉฐ, ์์ฑ๋ SVG ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ๋ณผ ์ ์๋ ๋ํํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ ๋น ๋ฅธ ํ๋กํ ํ์ดํ๊ณผ ํ์ต์ ํ์ํฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ: ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ฐ์ ๋๊ตฌ์์ SVG ์์๋ฅผ ๊ฒ์ฌํ ๋, ์ข ์ข ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ฅผ ์ง์ ๋ณด๊ณ ๋๋ก๋ ์์ ํ ์๋ ์์ต๋๋ค. ์ด๋ ๋๋ฒ๊น ์ด๋ ์ฌ์ํ ์กฐ์ ์ ์ ์ฉํฉ๋๋ค.
- JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ: GreenSock(GSAP)์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ฐ๋ ฅํ SVG ๋ฐ ๋ชจ์ ๊ฒฝ๋ก ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ข ์ข ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์์ฑํ๊ณ ์กฐ์ํ ์ ์์ต๋๋ค.
CSS Motion Path๋ก ์ ๋๋ฉ์ด์ ํ๊ธฐ
offset-path
๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ ๋ชจ์
๊ฒฝ๋ก๋ฅผ ์ ์ํ๋ค๋ฉด, ๋ค์ ๋จ๊ณ๋ ์์๋ฅผ ๊ทธ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์์ง์ด๊ฒ ํ๋ ๊ฒ์
๋๋ค. ์ด๋ ์ฃผ๋ก CSS @keyframes
๋ transition
์ ์ฌ์ฉํ๊ฑฐ๋, ๋ ๋์ ์ธ ์ ์ด๋ฅผ ์ํด JavaScript๋ฅผ ์ฌ์ฉํ์ฌ offset-distance
์์ฑ์ ์ ๋๋ฉ์ด์
ํจ์ผ๋ก์จ ๋ฌ์ฑ๋ฉ๋๋ค.
@keyframes
๋ก ์ ๋๋ฉ์ด์
ํ๊ธฐ
๋๋ถ๋ถ์ ๋ณต์กํ๊ณ ์ฐ์์ ์ธ ์ ๋๋ฉ์ด์
์๋ @keyframes
๊ฐ ๊ฐ์ฅ ์ ํฉํ ๋ฐฉ๋ฒ์
๋๋ค. ์ด๋ ์ ๋๋ฉ์ด์
์ ์งํ, ์ง์ ์๊ฐ, ํ์ด๋ฐ ๋ฐ ๋ฐ๋ณต์ ์ ๋ฐํ๊ฒ ์ ์ดํ ์ ์๊ฒ ํด์ค๋๋ค.
@keyframes
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์์๋ฅผ ์ ๋๋ฉ์ด์
ํ๋ ค๋ฉด, offset-distance
์์ฑ์ ๋ํด ๋ค์ํ ์ํ(ํคํ๋ ์)๋ฅผ ์ ์ํฉ๋๋ค. ๋ณดํต 0%
(๊ฒฝ๋ก์ ์์)์์ 100%
(๊ฒฝ๋ก์ ๋)๊น์ง์
๋๋ค.
.animated-object { position: relative; /* ๋๋ absolute, fixed. offset-path ์์น ์ง์ ์ ํ์ */ offset-path: path('M 0 0 C 50 100, 150 0, 200 100'); /* ๋ฌผ๊ฒฐ ๋ชจ์ ๊ฒฝ๋ก */ offset-rotate: auto; /* ์์๊ฐ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ํ์ */ animation: travelAlongPath 6s linear infinite alternate; width: 50px; height: 50px; background-color: steelblue; border-radius: 50%; } @keyframes travelAlongPath { 0% { offset-distance: 0%; } 100% { offset-distance: 100%; } }
์ด ์์ ์์:
.animated-object
๋ ์์น๊ฐ ์ง์ ๋์์ต๋๋ค(offset-path
๊ฐ ํจ๊ณผ์ ์ผ๋ก ์ ์ฉ๋๋ ค๋ฉด position: relative
, absolute
, ๋๋ fixed
๊ฐ ํ์). 3์ฐจ ๋ฒ ์ง์ ๊ณก์ ์ผ๋ก ์ ์๋ offset-path
๋ฅผ ๊ฐ์ง๋๋ค.
offset-rotate: auto;
๋ ์ํ ๊ฐ์ฒด๊ฐ ๊ณก์ ์ ๋ฐ๋ผ ์งํ ๋ฐฉํฅ์ ํฅํด ์์ฐ์ค๋ฝ๊ฒ ํ์ ํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
animation
๋จ์ถ ์์ฑ์ travelAlongPath
ํคํ๋ ์ ์ ๋๋ฉ์ด์
์ ์ ์ฉํฉ๋๋ค:
6s
: ์ ๋๋ฉ์ด์ ์ง์ ์๊ฐ์ 6์ด์ ๋๋ค.linear
: ์์๊ฐ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์ผ์ ํ ์๋๋ก ์์ง์ ๋๋ค. ๊ฐ์ ๋ฐ ๊ฐ์์ ์ํดease-in-out
๊ณผ ๊ฐ์ ๋ค๋ฅธ ํ์ด๋ฐ ํจ์๋, ๋ ๋ฏธ๋ฌํ ์๋ ์กฐ์ ์ ์ํด ์ฌ์ฉ์ ์ ์cubic-bezier()
ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.infinite
: ์ ๋๋ฉ์ด์ ์ด ๋ฌดํ ๋ฐ๋ณต๋ฉ๋๋ค.alternate
: ์ ๋๋ฉ์ด์ ์ด ๊ฐ ๋ฐ๋ณต์ ์๋ฃํ ๋๋ง๋ค ๋ฐฉํฅ์ ๋ฐ๊ฟ๋๋ค(์ฆ, 0%์์ 100%๋ก ๊ฐ๋ค๊ฐ 100%์์ ๋ค์ 0%๋ก ๋์์ด), ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ๋ถ๋๋ฌ์ด ์๋ณต ์ด๋์ ๋ง๋ญ๋๋ค.
@keyframes travelAlongPath
๋ธ๋ก์ ์ ๋๋ฉ์ด์
์ 0%
์์ offset-distance
๊ฐ 0%
(๊ฒฝ๋ก ์์)์ด๊ณ , 100%
์์๋ 100%
(๊ฒฝ๋ก ๋)์์ ์ง์ ํฉ๋๋ค.
transition
์ผ๋ก ์ ๋๋ฉ์ด์
ํ๊ธฐ
@keyframes
๊ฐ ์ฐ์์ ์ธ ๋ฃจํ๋ฅผ ์ํ ๊ฒ์ด๋ผ๋ฉด, transition
์ ๋จ๋ฐ์ฑ, ์ํ ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์
์ ์ด์์ ์ด๋ฉฐ, ์ข
์ข
์ฌ์ฉ์ ์ํธ์์ฉ(์: hover, click)์ด๋ ์ปดํฌ๋ํธ ์ํ ๋ณ๊ฒฝ(์: JavaScript๋ก ํด๋์ค ์ถ๊ฐ)์ ์ํด ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.
.interactive-icon { position: relative; offset-path: circle(30px at 0 0); /* ์์ ์ ์ค์ฌ์ผ๋ก ์์ ์ */ offset-distance: 0%; offset-rotate: auto 45deg; /* ์ฝ๊ฐ์ ํ์ ์ผ๋ก ์์ */ transition: offset-distance 0.8s ease-out, offset-rotate 0.8s ease-out; width: 24px; height: 24px; background-color: gold; border-radius: 50%; cursor: pointer; } .interactive-icon:hover { offset-distance: 100%; offset-rotate: auto 225deg; /* hover ์ ๋ ํ์ */ }
์ด ์์ ์์ ์ฌ์ฉ์๊ฐ .interactive-icon
์์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ฆฌ๋ฉด, offset-distance
๊ฐ 0%
์์ 100%
๋ก ์ ํ๋์ด ์์ ์ ์ค์ฌ์ผ๋ก ํ ๋ฐํด ๋๋๋ค. ๋์์ offset-rotate
์์ฑ๋ ์ ํ๋์ด ์์ง์ด๋ฉด์ ์ถ๊ฐ์ ์ธ ํ์ ์ ์ค๋๋ค. ์ด๊ฒ์ ์ ์พํ๊ณ ์์ ์ธํฐ๋ํฐ๋ธ ํจ๊ณผ๋ฅผ ๋ง๋ญ๋๋ค.
๋ค๋ฅธ CSS Transform๊ณผ ๊ฒฐํฉํ๊ธฐ
CSS Motion Path์ ์ฃผ์ ์ฅ์ ์ค ํ๋๋ ํ์ค CSS transform
์์ฑ๊ณผ ๋
๋ฆฝ์ ์ผ๋ก ์๋ํ๋ค๋ ๊ฒ์
๋๋ค. ์ด๋ ๋ณต์กํ ๋ชจ์
๊ฒฝ๋ก ์ ๋๋ฉ์ด์
์ ์์ ์์ฒด์ ์ ์ฉ๋๋ ํฌ๊ธฐ ์กฐ์ , ๊ธฐ์ธ์ด๊ธฐ ๋๋ ์ถ๊ฐ์ ์ธ ํ์ ๊ณผ ๊ฒฐํฉํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
offset-path
๋ ํจ๊ณผ์ ์ผ๋ก ์์ฒด ๋ณํ ํ๋ ฌ์ ๋ง๋ค์ด ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์์๋ฅผ ์์น์ํต๋๋ค. ์์์ ์ ์ฉ๋ ๋ชจ๋ transform
์์ฑ(์: transform: scale()
, rotate()
, translate()
๋ฑ)์ ์ด ๊ฒฝ๋ก ๊ธฐ๋ฐ ์์น ์ง์ *์์* ์ ์ฉ๋ฉ๋๋ค. ์ด ๋ ์ด์ด๋ง์ ์์ฒญ๋ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค:
.product-spinner { position: absolute; offset-path: ellipse(100px 50px at 50% 50%); offset-distance: 0%; offset-rotate: auto; animation: spinPath 10s linear infinite, scalePulse 2s ease-in-out infinite alternate; width: 80px; height: 80px; background-color: rgba(60, 179, 113, 0.7); /* MediumSeaGreen */ border-radius: 10px; } @keyframes spinPath { 0% { offset-distance: 0%; } 100% { offset-distance: 100%; } } @keyframes scalePulse { 0% { transform: scale(1); } 50% { transform: scale(1.2); } 100% { transform: scale(1); } }
์ฌ๊ธฐ์ .product-spinner
๋ spinPath
์ ์ํด ์ ์๋ ํ์ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์์ง์ด๋ ๋์์, scalePulse
์ ์ํด ์ ์๋ ๋งฅ๋ํ๋ ํฌ๊ธฐ ์กฐ์ ํจ๊ณผ๋ฅผ ๊ฒช์ต๋๋ค. ํฌ๊ธฐ ์กฐ์ ์ ๊ฒฝ๋ก ์์ฒด๋ฅผ ์๊ณกํ์ง ์๊ณ , ์คํ๋ ค ๊ฒฝ๋ก์ ์ํด ์์น๊ฐ ์ง์ ๋ *ํ์* ์์๋ฅผ ํ๋/์ถ์ํ์ฌ, ๊ณ์ธต์ ์ด๊ณ ์ ๊ตํ ์ ๋๋ฉ์ด์
ํจ๊ณผ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
์ค์ ์ ์ฉ ์ฌ๋ก ๋ฐ ๊ธ๋ก๋ฒ ํ์ฉ ์ฌ๋ก
CSS Motion Path๋ ๋จ์ง ์ด๋ก ์ ์ธ ๊ฐ๋ ์ด ์๋๋๋ค. ์ ์ธ๊ณ์ ๋ค์ํ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ์ฐ์ ์ ๋ฐ์ ๊ฑธ์ณ ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์๋ ์ค์ฉ์ ์ธ ๋๊ตฌ์ ๋๋ค. ์ ์ฐํ๊ณ ๋น์ ํ์ ์ธ ์์ง์์ ๋ง๋๋ ๋ฅ๋ ฅ์ ๋์ ์ธ ์น ๋์์ธ์ ์๋ก์ด ๊ฐ๋ฅ์ฑ์ ์ด์ด์ฃผ๋ฉฐ, ์ํธ์์ฉ๊ณผ ์๊ฐ์ ์คํ ๋ฆฌํ ๋ง์ ํ ๋จ๊ณ ๋์ด์ฌ๋ฆฝ๋๋ค.
1. ์ธํฐ๋ํฐ๋ธ ๋ฐ์ดํฐ ์๊ฐํ ๋ฐ ์ธํฌ๊ทธ๋ํฝ
- ํธ๋ ๋ ๋ฐ ํ๋ฆ ์ค๋ช : ์ฃผ์ ๊ฐ๊ฒฉ์ด ์์ฅ ๋ณ๋์ฑ์ด๋ ์ฑ์ฅ ํจํด์ ๋ฌ์ฌํ๋ ์ฌ์ฉ์ ์ ์ ๊ณก์ ์ ๋ฐ๋ผ ํ๋ฅด๋ ์ ๋๋ฉ์ด์ ์ ์ผ๋ก ํํ๋๋ ๊ธ์ต ๋์๋ณด๋๋ฅผ ์์ํด ๋ณด์ธ์. ๋๋ ์ํ์ ๋ํ๋ด๋ ์ ๋๋ฉ์ด์ ์ ์ด ๋๋ฅ ๊ฐ ํด์ ์ด์ก ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉฐ ๋ฌผ๋๋์ ๋ฐ๋ผ ์์ด ๋ณํ๋ ๊ธ๋ก๋ฒ ๋ฌด์ญ ์ง๋๋ ๊ฐ๋ฅํฉ๋๋ค.
- ๊ด๋ จ ์ ๋ณด ์ฐ๊ฒฐ: ๋ณต์กํ ๋คํธ์ํฌ ๋ค์ด์ด๊ทธ๋จ์ด๋ ์กฐ์ง๋์์, ๋ชจ์ ๊ฒฝ๋ก๋ ์ฌ์ฉ์์ ์์ ์ ์๊ฐ์ ์ผ๋ก ์๋ดํ์ฌ ๊ด๋ จ ๋ ธ๋ ๊ฐ์ ์ฐ๊ฒฐ์ ์ ๋๋ฉ์ด์ ์ผ๋ก ๋ณด์ฌ์ฃผ๊ฑฐ๋ ์์ค์์ ๋ชฉ์ ์ง๊น์ง์ ๋ฐ์ดํฐ ํ๋ฆ์ ์์ฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์๋ฒ ๋ชจ๋ํฐ๋ง ๋์๋ณด๋์์ ์ค์ ๋คํธ์ํฌ ํ ํด๋ก์ง ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์์ง์ด๋ ๋ฐ์ดํฐ ํจํท์ด ์์ต๋๋ค.
- ์ง๋ฆฌ ๋ฐ์ดํฐ ์ ๋๋ฉ์ด์ : ์ธ๊ณ ์ง๋์์ ํญ๊ณต ๊ฒฝ๋ก, ํ๋ฌผ ํด์๋ก ๋๋ ์ด๋ฒคํธ(๋ ์จ ์ ์ ์ด๋ ํธ๋ ๋ ๋ฑ)์ ํ์ฐ์ ์ ํํ ์ง๋ฆฌ์ ๊ถค์ ์ ๋ฐ๋ผ ์ ๋๋ฉ์ด์ ์ผ๋ก ๋ณด์ฌ์ค์ผ๋ก์จ ๋ณต์กํ ๊ธ๋ก๋ฒ ๋ฐ์ดํฐ๋ฅผ ์ง๊ด์ ์ด๊ณ ๋งค๋ ฅ์ ์ธ ๋ฐฉ์์ผ๋ก ์๊ฐํํ ์ ์์ต๋๋ค.
2. ๋งค๋ ฅ์ ์ธ ์ฌ์ฉ์ ์ธํฐํ์ด์ค(UI) ๋ฐ ์ฌ์ฉ์ ๊ฒฝํ(UX)
- ๋ ํนํ ๋ก๋ ๋ฐ ์คํผ๋: ์ผ๋ฐ์ ์ธ ํ์ ํ๋ ์์ ๋์ด์์ธ์. ์์๊ฐ ๋ธ๋๋ ๋ก๊ณ ๋ชจ์, ๋ณต์กํ ๊ธฐํํ์ ํจํด ๋๋ ์ ๊ธฐ์ ์ธ ๊ถค์ ์ ๋ฐ๋ผ ์ ๋๋ฉ์ด์ ๋๋ ๋ง์ถคํ ๋ก๋ฉ ์ธ๋์ผ์ดํฐ๋ฅผ ๋ง๋ค์ด ์ ์พํ๊ณ ๋ ํนํ ๋๊ธฐ ๊ฒฝํ์ ์ ๊ณตํ์ธ์.
- ๋์ ์ธ ๋ด๋น๊ฒ์ด์ ๋ฉ๋ด: ๋จ์ํ ์ฌ๋ผ์ด๋์ธ/์์ ๋ฉ๋ด ๋์ , ๋ฉ์ธ ๋ฉ๋ด ์์ด์ฝ์ ํด๋ฆญํ๊ฑฐ๋ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ ธ์ ๋ ๋ด๋น๊ฒ์ด์ ํญ๋ชฉ๋ค์ด ๊ณก์ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ๋ถ์ฑ๊ผด์ฒ๋ผ ํผ์ณ์ง๋ ๋์์ธ์ ํ ์ ์์ต๋๋ค. ๊ฐ ํญ๋ชฉ์ ์ฝ๊ฐ ๋ค๋ฅธ ํธ๋ฅผ ๋ฐ๋ฅผ ์ ์์ผ๋ฉฐ, ๋ฉ๋ด๊ฐ ๋ซํ๋ฉด ์๋ ์์น๋ก ๋์๊ฐ๋๋ค.
- ์ ํ ์ผ์ผ์ด์ค ๋ฐ ๊ตฌ์ฑ๊ธฐ: ์ ์์๊ฑฐ๋ ๋๋ ์ ํ ๋๋ฉ ํ์ด์ง์์, ์ ํ์ ๋ค์ํ ๊ธฐ๋ฅ์ด๋ ๊ตฌ์ฑ ์์๋ฅผ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์ ๋๋ฉ์ด์ ํ์ฌ ๊ทธ ๊ธฐ๋ฅ์ด๋ ๋์์ธ์ ๊ฐ์กฐํ์ธ์. ์๋์ฐจ ๊ตฌ์ฑ๊ธฐ์์ ์ก์ธ์๋ฆฌ๊ฐ ๋ฏธ๋ฆฌ ์ ์๋ ๊ณก์ ์ ๋ฐ๋ผ ๋ถ๋๋ฝ๊ฒ ๋ํ๋ ์ฐจ๋์ ๋ถ์ฐฉ๋๋ ๋ชจ์ต์ ์์ํด ๋ณด์ธ์.
- ์จ๋ณด๋ฉ ํ๋ก์ฐ ๋ฐ ํํ ๋ฆฌ์ผ: ์๊ฐ์ ์ผ๋ก ๋จ๊ณ๋ฅผ ์ถ์ ํ๊ฑฐ๋ ์ค์ํ UI ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ์กฐํ๋ ์ ๋๋ฉ์ด์ ์์๋ฅผ ํตํด ์๋ก์ด ์ฌ์ฉ์๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์๋ดํ์ฌ ์จ๋ณด๋ฉ ๊ณผ์ ์ ๋ ๋งค๋ ฅ์ ์ด๊ณ ๋ ๋ถ๋ด์ค๋ฝ๊ฒ ๋ง๋์ธ์.
3. ์คํ ๋ฆฌํ ๋ง ๋ฐ ๋ชฐ์ ํ ์น ๊ฒฝํ
- ์์ฌ ์ค์ฌ์ ์น์ฌ์ดํธ: ๋์งํธ ์คํ ๋ฆฌํ ๋ง์ด๋ ์บ ํ์ธ ์ฌ์ดํธ์์, ์์ฌ์ ํ๋ฆ์ ์๊ฐ์ ์ผ๋ก ๋ฐ๋ผ๊ฐ๋ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์บ๋ฆญํฐ๋ ํ ์คํธ ์์๋ฅผ ์ ๋๋ฉ์ด์ ํ์ธ์. ์บ๋ฆญํฐ๊ฐ ๊ตฌ๋ถ๊ตฌ๋ถํ ๊ธธ์ ๋ฐ๋ผ ๊ฒฝ์น ์ข์ ๋ฐฐ๊ฒฝ์ ๊ฐ๋ก์ง๋ฌ ๊ฑท๊ฑฐ๋, ํต์ฌ ๋ฌธ๊ตฌ๊ฐ ๊ธฐ๋ฐํ ๊ถค์ ์ ๋ฐ๋ผ ํ๋ฉด์ ๊ฐ๋ก์ง๋ฌ ๋ ๋ค๋ ์ ์์ต๋๋ค.
- ๊ต์ก ์ฝํ ์ธ ๋ฐ ์๋ฎฌ๋ ์ด์ : ๋ณต์กํ ๊ณผํ ๊ฐ๋ ์ ์๋ช ์ ๋ถ์ด๋ฃ์ผ์ธ์. ํ์ฑ์ ๊ถค๋, ํ๋ก ๋ด ์ ์์ ํ๋ฆ, ๋๋ ๋ฐ์ฌ์ฒด์ ๊ถค์ ์ ์ ๋ฐํ ๋ชจ์ ๊ฒฝ๋ก ์ ๋๋ฉ์ด์ ์ผ๋ก ์ค๋ช ํ์ธ์. ์ด๋ ์ ์ธ๊ณ ํ์ต์๋ค์ ์ดํด๋ฅผ ํฌ๊ฒ ๋์ธ ์ ์์ต๋๋ค.
- ์ธํฐ๋ํฐ๋ธ ๊ฒ์ ์์: ๊ฐ๋จํ ์ธ๋ธ๋ผ์ฐ์ ๊ฒ์์์, ๋ชจ์ ๊ฒฝ๋ก๋ ์บ๋ฆญํฐ, ๋ฐ์ฌ์ฒด ๋๋ ์์งํ์ ์์ง์์ ์ ์ํ ์ ์์ต๋๋ค. ์บ๋ฆญํฐ๊ฐ ํฌ๋ฌผ์ ํธ๋ฅผ ๋ฐ๋ผ ์ ํํ๊ฑฐ๋, ๋์ ์ด ํน์ ์์ง ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ฅผ ์ ์์ต๋๋ค.
- ๋ธ๋๋ ์คํ ๋ฆฌํ ๋ง ๋ฐ ์์ด๋ดํฐํฐ: ํ์ฌ์ ๊ฐ์น, ์ญ์ฌ ๋๋ ํ์ ์ฌ์ ์ ๋ฐ์ํ๋ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ๋ธ๋๋ ๋ก๊ณ ๋ ํต์ฌ ์๊ฐ ์์๋ฅผ ์ ๋๋ฉ์ด์ ํ์ธ์. ๊ธฐ์ ํ์ฌ์ ๋ก๊ณ ๊ฐ ํ๋ก ๊ธฐํ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ '์ด๋'ํ๋ฉฐ ํ์ ๊ณผ ์ฐ๊ฒฐ์ฑ์ ์์งํ ์ ์์ต๋๋ค.
4. ์์ ์ ๋ฐ ์ฅ์์ ์์
- ๋์ ์ธ ๋ฐฐ๊ฒฝ: ๋ณต์กํ๊ณ ๋ฐ๋ณต๋๋ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์์ง์ด๋ ์ ์, ์ถ์์ ์ธ ๋ชจ์ ๋๋ ์ฅ์์ ์ธ ํจํด์ผ๋ก ๋งคํน์ ์ธ ๋ฐฐ๊ฒฝ ์ ๋๋ฉ์ด์ ์ ๋ง๋ค์ด, ์ฃผ์ ์ฝํ ์ธ ๋ฅผ ๋ฐฉํดํ์ง ์์ผ๋ฉด์ ๊น์ด์ ์๊ฐ์ ํฅ๋ฏธ๋ฅผ ๋ํ์ธ์.
- ๋ง์ดํฌ๋ก์ธํฐ๋์ ๋ฐ ํผ๋๋ฐฑ: ์ฌ์ฉ์ ํ๋์ ๋ํด ๋ฏธ๋ฌํ๊ณ ์ ์พํ ํผ๋๋ฐฑ์ ์ ๊ณตํ์ธ์. ํญ๋ชฉ์ด ์ฅ๋ฐ๊ตฌ๋์ ์ถ๊ฐ๋ ๋ ์์ ์์ด์ฝ์ด ์งง์ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์ฅ๋ฐ๊ตฌ๋ ์์ด์ฝ์ผ๋ก ์ ๋๋ฉ์ด์ ๋ ์ ์์ต๋๋ค. ์์์ด ์ ์ถ๋๋ฉด ํ์ธ ์ฒดํฌ๋งํฌ๊ฐ ๋น ๋ฅด๊ณ ๋ง์กฑ์ค๋ฌ์ด ๊ถค์ ์ ๊ทธ๋ฆด ์ ์์ต๋๋ค.
์ด๋ฌํ ์ฌ์ฉ ์ฌ๋ก์ ๊ธ๋ก๋ฒ ์ ์ฉ ๊ฐ๋ฅ์ฑ์ ์์ฒญ๋ฉ๋๋ค. ๋ฐ๋์ ์ ๊ตํ ๊ธ์ต ๊ธฐ๊ด, ๋์ฟ์ ์ ์์๊ฑฐ๋ ๋๊ธฐ์ , ๋์ด๋ก๋น์ ํ์๋ค์๊ฒ ๋ค๊ฐ๊ฐ๋ ๊ต์ก ํ๋ซํผ, ๋๋ ์ํ์ธ๋ฃจ์ ์ฌ์ฉ์๋ฅผ ์ฆ๊ฒ๊ฒ ํ๋ ์ํฐํ ์ธ๋จผํธ ํฌํธ์ ๋์์ธํ๋ , CSS Motion Path๋ ๊ฐ๋ ฅํ ๋ชจ์ ์ ํตํด ์ธ์ด์ , ๋ฌธํ์ ์ฅ๋ฒฝ์ ์ด์ํ์ฌ ์ํธ์์ฉ์ ๊ฐํํ๊ณ ์ ๋ณด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ ๋ฌํ๋ ๋ณดํธ์ ์ผ๋ก ์ดํด๋๋ ์๊ฐ ์ธ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ๊ณ ๊ธ ๊ธฐ๋ฒ ๋ฐ ๊ณ ๋ ค ์ฌํญ
CSS Motion Path์ ๊ธฐ๋ณธ ๊ตฌํ์ ๊ฐ๋จํ์ง๋ง, ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํด ๊ฒฌ๊ณ ํ๊ณ , ๊ณ ์ฑ๋ฅ์ด๋ฉฐ, ์ ๊ทผ์ฑ ์๋ ์ ๋๋ฉ์ด์ ์ ๊ตฌ์ถํ๋ ค๋ฉด ๋ช ๊ฐ์ง ๊ณ ๊ธ ๊ณ ๋ ค ์ฌํญ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํฉ๋๋ค. ์ด๋ฌํ ์์๋ค์ ๊ธฐ๊ธฐ, ๋ธ๋ผ์ฐ์ ๋๋ ์ฌ์ฉ์ ์ ํธ๋์ ๊ด๊ณ์์ด ์ ๋๋ฉ์ด์ ์ด ์ผ๊ด๋๊ณ , ์ฆ๊ฑฐ์ฐ๋ฉฐ, ํฌ์ฉ์ ์ธ ๊ฒฝํ์ ์ ๊ณตํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
1. ๋ฐ์์ฑ ๋ฐ ํ์ฅ์ฑ
์น ๋์์ธ์ ์ํ ๋ชจ๋ฐ์ผ ํฐ๋ถํฐ ๊ด๋ํ ๋ฐ์คํฌํฑ ๋ชจ๋ํฐ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ฌด์ํ ํ๋ฉด ํฌ๊ธฐ์ ์ํํ๊ฒ ์ ์ํด์ผ ํฉ๋๋ค. ์ด์์ ์ผ๋ก, ๋ชจ์ ๊ฒฝ๋ก๋ ๊ทธ์ ๋ฐ๋ผ ํฌ๊ธฐ๊ฐ ์กฐ์ ๋๊ณ ์ ์ํด์ผ ํฉ๋๋ค.
offset-path
์ขํ์ ์๋ ๋จ์ ์ฌ์ฉ:path()
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฝ๋ก๋ฅผ ์ ์ํ ๋, ์ขํ๋ ์ผ๋ฐ์ ์ผ๋ก ๋จ์๊ฐ ์์ผ๋ฉฐ ์์์ ํฌํจ ๋ธ๋ก ๊ฒฝ๊ณ ์์ ๋ด์ ํฝ์ ๋ก ํด์๋ฉ๋๋ค. ๋ฐ์ํ ๊ฒฝ๋ก๋ฅผ ์ํด์๋ SVG๊ฐ ํฌ๊ธฐ ์กฐ์ ๋๋๋ก ์ค๊ณ๋์๋์ง ํ์ธํด์ผ ํฉ๋๋ค.url()
์ ํตํด SVG๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ, ํด๋น SVG ์์ฒด๊ฐ ๋ฐ์ํ์ด์ด์ผ ํฉ๋๋ค.viewBox
์์ฑ๊ณผwidth="100%"
๋๋height="100%"
๋ฅผ ๊ฐ์ง SVG๋ ๋ด๋ถ ์ขํ๊ณ๋ฅผ ์ปจํ ์ด๋์ ๋ง๊ฒ ์กฐ์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ชจ์ ๊ฒฝ๋ก๋ ์์ฐ์ค๋ฝ๊ฒ ์ด ํฌ๊ธฐ ์กฐ์ ์ ๋ฐ๋ฆ ๋๋ค.offset-distance
์ ํผ์ผํธ ์ฌ์ฉ:offset-distance
์๋ ํญ์ ํผ์ผํธ(%
)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํ์ธ์(์:0%
์์100%
). ํผ์ผํธ๋ ๋ณธ์ง์ ์ผ๋ก ๋ฐ์ํ์ด๋ฉฐ, ์ ์ฒด ๊ฒฝ๋ก ๊ธธ์ด์ ๋ํ ๋น์จ์ ๋ํ๋ ๋๋ค. ๊ฒฝ๋ก๊ฐ ํฌ๊ธฐ ์กฐ์ ๋๋ฉด ํผ์ผํธ ๊ธฐ๋ฐ ๊ฑฐ๋ฆฌ๊ฐ ์๋์ผ๋ก ์กฐ์ ๋์ด ์๋ก์ด ๊ฒฝ๋ก ๊ธธ์ด์ ๋ํ ์ ๋๋ฉ์ด์ ์ ํ์ด๋ฐ๊ณผ ์งํ์ ์ ์งํฉ๋๋ค.- ๋์ ๊ฒฝ๋ก๋ฅผ ์ํ JavaScript: ๋งค์ฐ ๋ณต์กํ๊ฑฐ๋ ์ง์ ์ผ๋ก ๋์ ์ธ ๋ฐ์์ฑ(์: ํน์ ๋ทฐํฌํธ ์ค๋จ์ ์ด๋ ์ฌ์ฉ์ ์ํธ์์ฉ์ ๋ฐ๋ผ ๊ฒฝ๋ก๊ฐ ์์ ํ ๋ค์ ๊ทธ๋ ค์ง๋ ๊ฒฝ์ฐ)์ ์ํด์๋ JavaScript๊ฐ ํ์ํ ์ ์์ต๋๋ค. JavaScript๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฉด ํฌ๊ธฐ ๋ณ๊ฒฝ์ ๊ฐ์งํ ๋ค์
offset-path
๊ฐ์ ๋์ ์ผ๋ก ์ ๋ฐ์ดํธํ๊ฑฐ๋ SVG ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ ํ ๋ค์ ์์ฑํ ์ ์์ต๋๋ค. D3.js์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฐ์ดํฐ๋ ๋ทฐํฌํธ ํฌ๊ธฐ์ ๊ธฐ๋ฐํ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ SVG ๊ฒฝ๋ก ์์ฑ์๋ ๊ฐ๋ ฅํ ์ ์์ต๋๋ค.
2. ์ฑ๋ฅ ์ต์ ํ
๋ถ๋๋ฌ์ด ์ ๋๋ฉ์ด์ ์ ๊ธ์ ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ฒ๋ฒ ๊ฑฐ๋ฆฌ๊ฑฐ๋ ๋๊ธฐ๋ ์ ๋๋ฉ์ด์ ์ ์ฌ์ฉ์๋ฅผ ์ข์ ์ํค๊ณ ์ฌ์ง์ด ์ดํ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. CSS Motion Path ์ ๋๋ฉ์ด์ ์ ์ผ๋ฐ์ ์ผ๋ก ํ๋์จ์ด ๊ฐ์๋๋ฏ๋ก ์ข์ ์ถ๋ฐ์ ์ด์ง๋ง, ์ต์ ํ๋ ์ฌ์ ํ ํต์ฌ์ ๋๋ค.
- ๊ฒฝ๋ก ๋ณต์ก์ฑ:
path()
๋ ๋งค์ฐ ๋ณต์กํ ๋์์ธ์ ํ์ฉํ์ง๋ง, ๋๋ฌด ๋ง์ ์ ์ด๋ ๋ช ๋ น์ด๊ฐ ์๋ ๊ณผ๋ํ๊ฒ ๋ณต์กํ ๊ฒฝ๋ก๋ ๋ ๋๋ง ์ค ๊ณ์ฐ ๋ถํ๋ฅผ ์ฆ๊ฐ์ํฌ ์ ์์ต๋๋ค. ์ํ๋ ์๊ฐ์ ํจ๊ณผ๋ฅผ ๋ฌ์ฑํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ๊ฒฝ๋ก๋ฅผ ๋ชฉํ๋ก ํ์ธ์. ์ง์ ์ผ๋ก ์ถฉ๋ถํ ๊ณณ์ ๊ณก์ ์ ๋จ์ํํ๊ณ ๋ถํ์ํ ์ ์ ์ ์ค์ด์ธ์. will-change
์์ฑ:will-change
CSS ์์ฑ์ ๋ธ๋ผ์ฐ์ ์ ์ด๋ค ์์ฑ์ด ๋ณ๊ฒฝ๋ ๊ฒ์ผ๋ก ์์๋๋์ง ํํธ๋ฅผ ์ค ์ ์์ต๋๋ค. ์ ๋๋ฉ์ด์ ์์์will-change: offset-path, offset-distance, transform;
์ ์ ์ฉํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฏธ๋ฆฌ ๋ ๋๋ง์ ์ต์ ํํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ์คํ๊ฒ ์ฌ์ฉํด์ผ ํฉ๋๋ค.will-change
๋ฅผ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด ๋๋ก๋ ์์์ ๋ ๋ง์ด ์๋ชจํ ์ ์์ต๋๋ค.- ์ ๋๋ฉ์ด์ ์์ ์ ์ ํ: ๋ง์ ์์ ์์๋ฅผ ๋์์, ํนํ ๋ณต์กํ ๊ฒฝ๋ก๋ก ์ ๋๋ฉ์ด์ ํ๋ ๊ฒ์ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค. ๋ง์ ์์๊ฐ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์์ง์ฌ์ผ ํ๋ ๊ฒฝ์ฐ, ์ ๋๋ฉ์ด์ ์ ์ผ๊ด ์ฒ๋ฆฌํ๊ฑฐ๋ ๊ฐ์ํ์ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
- ์ ๋๋ฉ์ด์
ํ์ด๋ฐ ํจ์: ์ ์ ํ ํ์ด๋ฐ ํจ์๋ฅผ ์ฌ์ฉํ์ธ์.
linear
๋ ์ผ์ ํ ์๋์ ์ข ์ข ์ข์ต๋๋ค. ์ ๋์ ์ผ๋ก ํ์ํ์ง ์์ ํ, ์ง๋์น๊ฒ ๋ณต์กํ ์ฌ์ฉ์ ์ ์cubic-bezier()
ํจ์๋ ํผํ์ธ์. ๋๋ก๋ ๋ด์ฅ ํจ์๋ณด๋ค CPU ์ง์ฝ์ ์ผ ์ ์์ต๋๋ค.
3. ๋ธ๋ผ์ฐ์ ํธํ์ฑ ๋ฐ ํด๋ฐฑ
์ต์ ๋ธ๋ผ์ฐ์ (Chrome, Firefox, Edge, Safari, Opera)๋ CSS Motion Path๋ฅผ ํ๋ฅญํ๊ฒ ์ง์ํ์ง๋ง, ๊ตฌํ ๋ธ๋ผ์ฐ์ ๋ ์์ฃผ ์ ๋ฐ์ดํธ๋์ง ์๋ ํ๊ฒฝ(์ผ๋ถ ๊ธ๋ก๋ฒ ์ง์ญ์์ ํํจ)์ ๊ทธ๋ ์ง ์์ ์ ์์ต๋๋ค. ์ ์ง์ ์ ํ(graceful fallbacks)๋ฅผ ์ ๊ณตํ๋ฉด ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ์ผ๊ด๋ ๊ฒฝํ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
@supports
๊ท์น:@supports
CSS at-rule์ ์ ์ง์ ํฅ์(progressive enhancement)์ ์ํ ์ต๊ณ ์ ์น๊ตฌ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ํน์ CSS ๊ธฐ๋ฅ์ ์ง์ํ๋ ๊ฒฝ์ฐ์๋ง ์คํ์ผ์ ์ ์ฉํ ์ ์๊ฒ ํด์ค๋๋ค..element-to-animate { /* offset-path๋ฅผ ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํ ํด๋ฐฑ ์คํ์ผ */ position: absolute; left: 0; top: 0; transition: left 2s ease-in-out, top 2s ease-in-out; /* ๊ธฐ๋ณธ์ ์ธ ์ ํ ์ด๋ ํด๋ฐฑ */ } @supports (offset-path: path('M 0 0 L 1 1')) { .element-to-animate { /* ์ง์ํ๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํ Motion Path ์คํ์ผ */ offset-path: path('M 0 0 C 50 100, 150 0, 200 100'); offset-distance: 0%; offset-rotate: auto; animation: motionPathAnim 6s linear infinite alternate; /* ํด๋ฐฑ transition/position ์ฌ์ ์ ๋๋ ์ ๊ฑฐ */ left: unset; /* ํด๋ฐฑ 'left'๊ฐ ๊ฐ์ญํ์ง ์๋๋ก ๋ณด์ฅ */ top: unset; /* ํด๋ฐฑ 'top'์ด ๊ฐ์ญํ์ง ์๋๋ก ๋ณด์ฅ */ transform: none; /* ๊ธฐ๋ณธ transform์ด ์๋ค๋ฉด ์ ๊ฑฐ */ } } @keyframes motionPathAnim { 0% { offset-distance: 0%; } 100% { offset-distance: 100%; } }
์ด ์ค๋ํซ์ Motion Path๋ฅผ ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ๋ ๊ธฐ๋ณธ์ ์ธ ์ ๋๋ฉ์ด์ ์ ๊ฒฝํํ๊ฒ ํ๊ณ , ์ต์ ๋ธ๋ผ์ฐ์ ๋ ์์ ํ๊ณ ๋ณต์กํ ๊ถค์ ์ ์ฆ๊ธธ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ํด๋ฆฌํ(Polyfills): ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๋ฒ์ ์ ๊ฑธ์ณ ๋ ๋์ ์ง์์ ์๊ตฌํ๋ ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ, ํด๋ฆฌํ ์ฌ์ฉ์ ๊ณ ๋ คํ์ธ์. ๊ทธ๋ฌ๋ ํด๋ฆฌํ์ ์ฑ๋ฅ ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํ ์ ์์ผ๋ฉฐ ๋ค์ดํฐ๋ธ ๋์์ ์๋ฒฝํ๊ฒ ๋ณต์ ํ์ง ๋ชปํ ์๋ ์๋ค๋ ์ ์ ์ธ์งํด์ผ ํฉ๋๋ค. ์ ์คํ๊ฒ ์ ํํ๊ณ ์ฒ ์ ํ๊ฒ ํ ์คํธํด์ผ ํฉ๋๋ค.
- ์ฒ ์ ํ ํ ์คํธ: ๋์ ๊ธ๋ก๋ฒ ์ฌ์ฉ์์ธต์์ ํํ ์ฌ์ฉ๋๋ ๊ด๋ฒ์ํ ๋ธ๋ผ์ฐ์ , ๊ธฐ๊ธฐ ๋ฐ ์ธํฐ๋ท ์ฐ๊ฒฐ ์๋์์ ์ ๋๋ฉ์ด์ ์ ํญ์ ํ ์คํธํ์ธ์. BrowserStack์ด๋ Sauce Labs์ ๊ฐ์ ๋๊ตฌ๊ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
4. ์ ๊ทผ์ฑ(A11y)
๋ชจ์ ์ ๊ฐ๋ ฅํ ์ปค๋ฎค๋์ผ์ด์ ๋๊ตฌ์ผ ์ ์์ง๋ง, ์ ์ ์ฅ์ ๋ ์ธ์ง ์ฅ์ ์ ๊ฐ์ ํน์ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์์๊ฒ๋ ์ฅ๋ฒฝ์ด ๋ ์๋ ์์ต๋๋ค. ์ ๊ทผ์ฑ์ ๋ณด์ฅํ๋ค๋ ๊ฒ์ ์ต์ ๊ณผ ๋์์ ์ ๊ณตํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
prefers-reduced-motion
๋ฏธ๋์ด ์ฟผ๋ฆฌ: ์ด ์ค์ํ ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์๊ฐ ์ด์ ์ฒด์ ์ค์ ์์ ์์ง์ ๊ฐ์๋ฅผ ์ ํธํ๋์ง ๊ฐ์งํ ์ ์์ต๋๋ค. ํญ์ ์ด ์ ํธ๋๋ฅผ ์กด์คํ์ฌ ์ ์ ์ด๊ฑฐ๋ ํฌ๊ฒ ๋จ์ํ๋ ์ ๋๋ฉ์ด์ ๋์์ ์ ๊ณตํ์ธ์.@media (prefers-reduced-motion: reduce) { .element-to-animate { animation: none !important; /* ๋ชจ๋ ์ ๋๋ฉ์ด์ ๋นํ์ฑํ */ transition: none !important; /* ๋ชจ๋ ํธ๋์ง์ ๋นํ์ฑํ */ /* ์์๋ฅผ ์ต์ข ๋๋ ์ํ๋ ์ ์ ์ํ๋ก ์ค์ */ offset-distance: 100%; /* ๋๋ ๋ค๋ฅธ ์ ์ ํ ์ ์ ์์น */ offset-rotate: 0deg; /* ํ์ ์ด๊ธฐํ */ transform: none; /* ๋ค๋ฅธ ๋ชจ๋ transform ์ด๊ธฐํ */ } /* ์ ์ฌ์ ์ผ๋ก ๋์ฒด ์ ์ ์ด๋ฏธ์ง๋ ํ ์คํธ ์ค๋ช ํ์ */ }
์ด๋ ๋ชจ์ ์ ๋ฏผ๊ฐํ ์ฌ์ฉ์๊ฐ ์๋๋๊ฑฐ๋ ๋ฐฉํฅ ๊ฐ๊ฐ์ ์์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ์ ์ ๊ธฐ๊ด ์ ๋ฐ ์์ธ ํผํ๊ธฐ: ๋ถ๋๋ฝ๊ณ ์์ธก ๊ฐ๋ฅํ๋ฉฐ, ๋น ๋ฅด๊ณ ์์ธก ๋ถ๊ฐ๋ฅํ ์์ง์, ๊ณผ๋ํ ๊น๋ฐ์ ๋๋ ํ๋ฉด์ ๋์ ๋ถ๋ถ์ ๋น ๋ฅด๊ฒ ๊ฐ๋ก์ง๋ฅด๋ ์์๋ฅผ ํผํ๋ ์ ๋๋ฉ์ด์ ์ ๋์์ธํ์ธ์. ์ด๋ ๋ฏผ๊ฐํ ๊ฐ์ธ์๊ฒ ๋ฉ๋ฏธ, ํ๊ธฐ์ฆ ๋๋ ๋ฐ์์ ์ ๋ฐํ ์ ์์ต๋๋ค.
- ์ค์ ์ ๋ณด์ ๋ํ ๋์ ์ ๊ณต: ์ ๋๋ฉ์ด์ ์ด ํ์ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ ๊ฒฝ์ฐ, ํด๋น ์ ๋ณด๊ฐ ์ ์ ํ ์คํธ, ์ด๋ฏธ์ง ๋๋ ๋ค๋ฅธ ๋น-๋ชจ์ ์์กด์ ์ํธ์์ฉ์ ํตํด์๋ ์ ๊ณต๋๋๋ก ํ์ธ์. ๋ชจ๋ ์ฌ์ฉ์๊ฐ ๋ณต์กํ ๋ชจ์ ์ ํตํด์๋ง ์ ๋ฌ๋๋ ์ ๋ณด๋ฅผ ์ธ์งํ๊ฑฐ๋ ์ฒ๋ฆฌํ์ง๋ ์์ต๋๋ค.
- ํค๋ณด๋ ๋ด๋น๊ฒ์ด์ ๋ฐ ์คํฌ๋ฆฐ ๋ฆฌ๋: ์ ๋๋ฉ์ด์ ์ด ํ์ค ํค๋ณด๋ ๋ด๋น๊ฒ์ด์ ์ด๋ ์คํฌ๋ฆฐ ๋ฆฌ๋์ ๊ธฐ๋ฅ์ ๋ฐฉํดํ์ง ์๋๋ก ํ์ธ์. ์ธํฐ๋ํฐ๋ธ ์์๋ ์ ๋๋ฉ์ด์ ์ด ์ฌ์ ์ค์ผ ๋๋ ํฌ์ปค์ค๋ฅผ ๋ฐ์ ์ ์๊ณ ์กฐ์ ๊ฐ๋ฅํด์ผ ํฉ๋๋ค.
5. ๊ตญ์ ํ(i18n) ๊ณ ๋ ค ์ฌํญ
CSS Motion Path ์์ฒด๋ ์ธ์ด์ ๊ตฌ์ ๋ฐ์ง ์์ง๋ง, ์ฌ์ฉ๋๋ ๋งฅ๋ฝ์ ๊ทธ๋ ์ง ์์ ์ ์์ต๋๋ค. ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํด ๋์์ธํ ๋, ๋ฌธํ์ ๊ด๋ จ์ฑ๊ณผ ์ฝ๊ธฐ ๋ฐฉํฅ์ ๊ณ ๋ คํ์ธ์.
- ์ฝํ ์ธ ํ์งํ: ์ ๋๋ฉ์ด์ ์์์ ํ ์คํธ๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ(์: ์ ๋๋ฉ์ด์ ๋ ์ด๋ธ, ์บก์ ), ํด๋น ํ ์คํธ๊ฐ ๋ค๋ฅธ ์ธ์ด ๋ฐ ์คํฌ๋ฆฝํธ์ ๋ง๊ฒ ์ ์ ํ ํ์งํ๋์๋์ง ํ์ธํ์ธ์.
- ๋ฐฉํฅ์ฑ (RTL/LTR): ๋๋ถ๋ถ์ SVG ๊ฒฝ๋ก์ CSS ์ขํ๊ณ๋ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ(LTR) ์ฝ๊ธฐ ๋ฐฉํฅ(์์ X๋ ์ค๋ฅธ์ชฝ)์ ๊ฐ์ ํฉ๋๋ค. ๋์์ธ์ด ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ(RTL) ์ธ์ด(์๋์ด ๋๋ ํ๋ธ๋ฆฌ์ด ๋ฑ)์ ์ ์ํด์ผ ํ๋ ๊ฒฝ์ฐ, ๋ค์์ด ํ์ํ ์ ์์ต๋๋ค:
- RTL ๋ ์ด์์์ ์ํด ์ข์ฐ ๋ฐ์ ๋ ๋์ฒด
offset-path
์ ์๋ฅผ ์ ๊ณตํฉ๋๋ค. - RTL ์ปจํ
์คํธ์์ ๋ถ๋ชจ ์์๋ SVG ์ปจํ
์ด๋์ CSS
transform: scaleX(-1);
์ ์ ์ฉํ์ฌ ๊ฒฝ๋ก๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ฐ์ ์ํต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ์์์ ๋ด์ฉ๋ ๋ฐ์ ์ํฌ ์ ์์ผ๋ฏ๋ก ์์น ์๋ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์์ต๋๋ค.
์์ด๋ ๋ฌผ๊ฒฐ๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ, ๋นํ ์คํธ ๋ชจ์ ์ ๊ฒฝ์ฐ ๋ฐฉํฅ์ฑ์ ๋ ์ค์ํ์ง๋ง, ์์ฌ์ ํ๋ฆ์ด๋ ํ ์คํธ ๋ฐฉํฅ๊ณผ ๊ด๋ จ๋ ๊ฒฝ๋ก์ ๊ฒฝ์ฐ ์ค์ํด์ง๋๋ค.
- RTL ๋ ์ด์์์ ์ํด ์ข์ฐ ๋ฐ์ ๋ ๋์ฒด
- ๋ชจ์ ์ ๋ฌธํ์ ๋งฅ๋ฝ: ํน์ ์์ง์์ด๋ ์๊ฐ์ ์ ํธ๊ฐ ๋ค์ํ ๋ฌธํ์์ ๋ค๋ฅธ ํด์์ ๊ฐ์ง ์ ์์์ ์ ๋ ํ์ธ์. ๋ณต์กํ ๊ฒฝ๋ก ์ ๋๋ฉ์ด์ ์ ๋ํ ๋ณดํธ์ ์ผ๋ก ๊ธ์ ์ ์ด๊ฑฐ๋ ๋ถ์ ์ ์ธ ํด์์ ๋๋ฌผ์ง๋ง, ์ ๋๋ฉ์ด์ ์ด ์์ ํ ์ฅ์์ ์ธ ๊ฒฝ์ฐ๋ผ๋ฉด ๋ฌธํ์ ์ผ๋ก ํน์ ํ ์ด๋ฏธ์ง๋ ์์ ๋ ํผํ์ธ์.
ํจ๊ณผ์ ์ธ CSS Motion Path ๊ตฌํ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
CSS Motion Path์ ํ์ ์ง์ ์ผ๋ก ํ์ฉํ๊ณ ์ ์ธ๊ณ์ ์ผ๋ก ๋ฐ์ด๋ ๊ฒฝํ์ ์ ๊ณตํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ค์ํ์ธ์:
-
๊ถค์ ์ ๋จผ์ ์๊ฐ์ ์ผ๋ก ๊ณํํ์ธ์: CSS ํ ์ค์ ์์ฑํ๊ธฐ ์ ์, ์ํ๋ ๋ชจ์ ๊ฒฝ๋ก๋ฅผ ์ข ์ด์ ์ค์ผ์นํ๊ฑฐ๋ ์ด์์ ์ผ๋ก๋ SVG ํธ์ง๊ธฐ๋ฅผ ์ฌ์ฉํ์ธ์. ๊ฒฝ๋ก๋ฅผ ์๊ฐํํ๋ ๊ฒ์ ์ ๋ฐํ๊ณ , ๋ฏธํ์ ์ผ๋ก ๋ง์กฑ์ค๋ฌ์ฐ๋ฉฐ, ๋ชฉ์ ์๋ ์์ง์์ ๋ง๋๋ ๋ฐ ํฐ ๋์์ด ๋ฉ๋๋ค. Adobe Illustrator, Inkscape ๋๋ ์จ๋ผ์ธ SVG ๊ฒฝ๋ก ์์ฑ๊ธฐ์ ๊ฐ์ ๋๊ตฌ๋ ์ด ์ฌ์ ๊ณ์ฐ์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
-
๊ฐ๋จํ๊ฒ ์์ํ๊ณ , ๊ทธ ๋ค์ ์ ๊ตํ๊ฒ ๋ง๋์ธ์: ๋งค์ฐ ๋ณต์กํ ๋ฒ ์ง์ ๊ณก์ ์ ์๋ํ๊ธฐ ์ ์ ์์ด๋ ๊ฐ๋จํ ์ ๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ๋ํ์ผ๋ก ์์ํ์ธ์. ๊ธฐ๋ณธ ์์ฑ๊ณผ
offset-distance
๊ฐ ์ ๋๋ฉ์ด์ ์ ๊ตฌ๋ํ๋ ๋ฐฉ์์ ๋ง์คํฐํ์ธ์. ๊ฐ ๋จ๊ณ๋ฅผ ํ ์คํธํ์ฌ ์ํ๋ ํจ๊ณผ๋ฅผ ๋ณด์ฅํ๋ฉด์ ์ ์ง์ ์ผ๋ก ๋ณต์ก์ฑ์ ๋์ ํ์ธ์. -
์ฑ๋ฅ์ ์ํด ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ฅผ ์ต์ ํํ์ธ์:
path()
๋ฅผ ์ฌ์ฉํ ๋, ๊ณก์ ์ ๋ถ๋๋ฝ๊ฒ ์ ์ํ๋ ๋ฐ ํ์ํ ์ต์ํ์ ์ ๊ณผ ๋ช ๋ น์ด ์๋ฅผ ๋ชฉํ๋ก ํ์ธ์. ์ ์ด ์ ์์๋ก CSS์ ํ์ผ ํฌ๊ธฐ๊ฐ ์์์ง๊ณ ๋ธ๋ผ์ฐ์ ์ ๊ณ์ฐ๋์ด ์ค์ด๋ญ๋๋ค. SVG ์ต์ ํ ๋๊ตฌ๋ ๋ณต์กํ ๊ฒฝ๋ก๋ฅผ ๋จ์ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. -
offset-rotate
๋ฅผ ํ๋ช ํ๊ฒ ํ์ฉํ์ธ์: ์ฐจ๋, ํ์ดํ ๋๋ ์บ๋ฆญํฐ์ ๊ฐ์ด ์์ฐ์ค๋ฝ๊ฒ ๊ฒฝ๋ก์ ๋ฐฉํฅ์ ๋ฐ๋ผ์ผ ํ๋ ์์์ ๊ฒฝ์ฐ, ํญ์offset-rotate: auto;
๋ฅผ ์ฌ์ฉํ์ธ์. ์์์ ๊ณ ์ ํ ๋ฐฉํฅ์ด ๊ฒฝ๋ก์ ์ ์ ์ ๋ํด ์กฐ์ ์ด ํ์ํ ๊ฒฝ์ฐ ์ถ๊ฐ ๊ฐ๋(์:auto 90deg
)์ ๊ฒฐํฉํ์ธ์. -
์ฌ์ฉ์ ๊ฒฝํ๊ณผ ๋ชฉ์ ์ ์ฐ์ ์ํ์ธ์: ๋ชจ๋ ์ ๋๋ฉ์ด์ ์ ๋ชฉ์ ์ด ์์ด์ผ ํฉ๋๋ค. ์ฌ์ฉ์์ ์์ ์ ์ ๋ํ๋๊ฐ? ์ ๋ณด๋ฅผ ์ ๋ฌํ๋๊ฐ? ์ํธ์์ฉ์ ํฅ์์ํค๋๊ฐ? ์๋๋ฉด ๋จ์ํ ์ฆ๊ฑฐ์์ ๋ํ๋๊ฐ? ํนํ ์ ํฅ ์์ฅ์ ๋์ญํญ์ด ์ ํ๋๊ฑฐ๋ ๊ตฌํ ๊ธฐ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์์๊ฒ ๋ฐฉํด๊ฐ ๋๊ฑฐ๋, ์ง์ฆ์ ์ ๋ฐํ๊ฑฐ๋, ์ฌ์ฉ์ฑ์ ์ ํดํ๋ ๋ถํ์ํ ์ ๋๋ฉ์ด์ ์ ํผํ์ธ์.
-
๊ต์ฐจ ๋ธ๋ผ์ฐ์ ํธํ์ฑ ๋ฐ ํด๋ฐฑ์ ๋ณด์ฅํ์ธ์: CSS Motion Path๋ฅผ ์์ ํ ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํด ํญ์
@supports
๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ง์ ์ ํ๋ฅผ ์ ๊ณตํ์ธ์. ๋์ ๊ธ๋ก๋ฒ ์ง์ญ์์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ค์ํ ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๊ธฐ์์ ์ ๋๋ฉ์ด์ ์ ๊ด๋ฒ์ํ๊ฒ ํ ์คํธํ์ฌ ์ผ๊ด๋ ๊ฒฝํ์ ๋ณด์ฅํ์ธ์. -
๋ฐ์ํ์ผ๋ก ๋์์ธํ์ธ์:
offset-distance
์๋ ํผ์ผํธ๋ฅผ ์ฌ์ฉํ๊ณ , SVG ๊ฒฝ๋ก(url()
๊ณผ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒฝ์ฐ)๊ฐviewBox
๋ฅผ ์ฌ์ฉํ์ฌ ๋ณธ์ง์ ์ผ๋ก ๋ฐ์ํ์ธ์ง ํ์ธํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ์ ๋๋ฉ์ด์ ์ด ๋ค์ํ ๋ทฐํฌํธ ํฌ๊ธฐ์ ๋ฐ๋ผ ์๋์ผ๋ก ํ์ฅ๋ฉ๋๋ค. -
์ฒ์๋ถํฐ ์ ๊ทผ์ฑ์ ๊ณ ๋ คํ์ธ์:
prefers-reduced-motion
๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ๊ตฌํํ์ธ์. ์ ์ ๊ธฐ๊ด ๋ฌธ์ ๋ฅผ ์ ๋ฐํ ์ ์๋ ๊ณผ๋ํ๊ฑฐ๋ ๋น ๋ฅธ ์์ง์์ ํผํ์ธ์. ํต์ฌ ๋ฉ์์ง๋ ์ํธ์์ฉ์ด ์ดํด๋ฅผ ์ํด ์ ๋๋ฉ์ด์ ์๋ง ์์กดํ์ง ์๋๋ก ํ์ธ์. ํฌ์ฉ์ ์ธ ๋์์ธ์ ๋ ๋์ ๊ธ๋ก๋ฒ ์ฌ์ฉ์์๊ฒ ๋ค๊ฐ๊ฐ๋๋ค. -
๋ณต์กํ ๊ฒฝ๋ก๋ฅผ ๋ฌธ์ํํ์ธ์: ๋งค์ฐ ๋ณต์กํ
path()
์ ์์ ๊ฒฝ์ฐ, CSS์ ์ฃผ์์ ์ถ๊ฐํ๊ฑฐ๋(๋น๋ ํ๋ก์ธ์ค ๋ด์์ ๊ฐ๋ฅํ๋ค๋ฉด) ๊ฒฝ๋ก์ ์ถ์ฒ, ๋ชฉ์ ๋๋ ์ด๋ค ๋๊ตฌ๋ก ์์ฑ๋์๋์ง ์ค๋ช ํ๋ ์ธ๋ถ ๋ฌธ์๋ฅผ ๊ณ ๋ คํ์ธ์. ์ด๋ ํฅํ ์ ์ง๋ณด์์ ํ์ ์ ๋์์ด ๋ฉ๋๋ค.
๊ฒฐ๋ก : ์น ์ ๋๋ฉ์ด์ ์ ์๋ก์ด ํญ๋ก๋ฅผ ๊ทธ๋ฆฌ๋ค
CSS Motion Path๋ ์น ์ ๋๋ฉ์ด์ ์์ญ์์ ์ค์ํ ์งํ์ ๋จ๊ณ๋ฅผ ๋ํ๋ ๋๋ค. ์ด๋ ์ ํต์ ์ธ ์ ํ ๋ฐ ํธ ๊ธฐ๋ฐ ์์ง์์ ํ๊ณ๋ฅผ ์ด์ํ์ฌ, ๊ฐ๋ฐ์๊ฐ ์ ๋ก ์๋ ์์ค์ ์ ๋ฐ๋์ ์ ์ฐ์ฑ์ผ๋ก ์์ ๊ถค์ ์ ์ ์ํ๊ณ ์ ์ดํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉ์ ์ฃผ์๋ฅผ ์ ๋ํ๋ ๋ฏธ๋ฌํ UI ํฅ์๋ถํฐ ๊ด๊ฐ์ ๋ชฐ์ ์ํค๊ณ ์ฌ๋ก์ก๋ ์ ๊ตํ ์์ฌ ์ํ์ค์ ์ด๋ฅด๊ธฐ๊น์ง ๋ฐฉ๋ํ ์ฐฝ์์ ๊ฐ๋ฅ์ฑ์ ์ด์ด์ค๋๋ค.
๊ธฐ๋ณธ ์์ฑ์ธ offset-path
, offset-distance
, offset-rotate
, offset-anchor
๋ฅผ ๋ง์คํฐํ๊ณ SVG ๊ฒฝ๋ก ๋ฐ์ดํฐ์ ํํ๋ ฅ์ ๊น์ด ํ๊ณ ๋ฆ์ผ๋ก์จ, ์ฌ๋ฌ๋ถ์ ์ญ๋์ ์ด๊ณ ๋งค๋ ฅ์ ์ธ ์น ๊ฒฝํ์ ๋ง๋๋ ์ง์ ์ผ๋ก ๋ค์ฌ๋ค๋ฅํ ๋๊ตฌ๋ฅผ ์ป๊ฒ ๋ฉ๋๋ค. ๊ธ๋ก๋ฒ ๊ธ์ต ์์ฅ์ ์ํ ์ธํฐ๋ํฐ๋ธ ๋ฐ์ดํฐ ์๊ฐํ๋ฅผ ๊ตฌ์ถํ๋ , ์ ์ธ๊ณ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ์ํ ์ง๊ด์ ์ธ ์จ๋ณด๋ฉ ํ๋ก์ฐ๋ฅผ ๋์์ธํ๋ , ๋ฌธํ์ ๊ฒฝ๊ณ๋ฅผ ์ด์ํ๋ ๋งค๋ ฅ์ ์ธ ์คํ ๋ฆฌํ
๋ง ํ๋ซํผ์ ๋ง๋ค๋ , CSS Motion Path๋ ์ฌ๋ฌ๋ถ์ด ํ์๋ก ํ๋ ์ ๊ตํ ๋ชจ์
์ ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
์คํ์ ๋ฐ์๋ค์ด๊ณ , ์ฑ๋ฅ๊ณผ ์ ๊ทผ์ฑ์ ์ฐ์ ์ํ๋ฉฐ, ํญ์ ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ผ๋์ ๋๊ณ ๋์์ธํ์ธ์. ์ฌ์ฉ์ ์ ์ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ๊ฐ๋ ์์์ ์ฌ์ ์ ๋จ์ํ ์๊ฐ์ ํจ๊ณผ ์ด์์ ๋๋ค. ์ด๋ ์ธ๊ณ ๊ฐ์ง์ ๊ด๊ฐ๊ณผ ๊ณต๊ฐํ๋ ๋ ์ญ๋์ ์ด๊ณ , ์ง๊ด์ ์ด๋ฉฐ, ์์ ์ ์๋ ์ํธ์์ฉ์ ๋ง๋ค ๊ธฐํ์ ๋๋ค. ๋ค์ ํ๋ก์ ํธ์ ์ด๋ฌํ ๊ธฐ์ ์ ํตํฉํ๊ธฐ ์์ํ๊ณ , ๋จ์ํ ์ง์ ์ ๊ฒฐ์ฝ ์ ํ๋์ง ์๋, ์ง์ ์ผ๋ก ์ด์ผ๊ธฐ๋ฅผ ์ ๋ฌํ๋ ๋ชจ์ ์ผ๋ก ์ฌ๋ฌ๋ถ์ ๋์์ธ์ด ์ด์๋๋ ๊ฒ์ ์ง์ผ๋ณด์ธ์.
์ฌ๋ฌ๋ถ์ ์ฐฝ์์ ์ธ ๊ถค์ ์ ๊ณต์ ํด์ฃผ์ธ์!
CSS Motion Path๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ค ๋ณต์กํ ์ ๋๋ฉ์ด์ ์ ๊ตฌํํด ๋ณด์ จ๋์? ์๋ ๋๊ธ์ ์ฌ๋ฌ๋ถ์ ํต์ฐฐ, ๋์ ๊ณผ์ , ๊ทธ๋ฆฌ๊ณ ๋ฉ์ง ํ๋ก์ ํธ๋ฅผ ๊ณต์ ํด์ฃผ์ธ์! ์ฌ๋ฌ๋ถ์ด ์ด ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ์น ๊ฒฝํ์ ํฅ์์ํค๋ ํ์ ์ ์ธ ๋ฐฉ๋ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค. ํน์ ๊ฒฝ๋ก ๋ช ๋ น์ด์ ๋ํ ์ง๋ฌธ์ด๋ ๊ณ ๊ธ ์ฑ๋ฅ ๋ฌธ์ ์ ๋ํ ์ง๋ฌธ์ด ์์ผ์ ๊ฐ์? ํจ๊ป ํ ๋ก ํ๊ณ ๋ฐฐ์๋ด ์๋ค!