CSS ์คํฌ๋กค ํ์๋ผ์ธ ์ด๋ฆ ํ์ธ(Name Resolution)์ ๋ํ ์ฌ์ธต ๋ถ์. ํ์๋ผ์ธ ์ฐธ์กฐ ํ์ธ(Reference Resolution)์ ์ค์์ฑ๊ณผ ๋ค์ํ ์์ ๋ฅผ ํตํ ๊ตฌํ ๋ฐฉ๋ฒ์ ๋ค๋ฃน๋๋ค.
CSS ์คํฌ๋กค ํ์๋ผ์ธ ์ด๋ฆ ํ์ธ: ํ์๋ผ์ธ ์ฐธ์กฐ ํ์ธ ์ค๋ช
CSS ์คํฌ๋กค ํ์๋ผ์ธ์ ์คํฌ๋กค ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์ ์ ๋ง๋๋ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๊ณ ์น ํ์ด์ง์ ๋์ ์ธ ํจ๊ณผ๋ฅผ ๋ํฉ๋๋ค. ์ด ๊ธฐ์ ์ ์ค์ํ ์ธก๋ฉด์ ํ์๋ผ์ธ ์ฐธ์กฐ ํ์ธ(Timeline Reference Resolution)์ผ๋ก, ์ด๋ ์ ๋๋ฉ์ด์ ์ด ํน์ ์คํฌ๋กค ํ์๋ผ์ธ๊ณผ ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋๋์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์ด ๊ธ์์๋ ํ์๋ผ์ธ ์ฐธ์กฐ ํ์ธ์ ํจ๊ณผ์ ์ผ๋ก ์ดํดํ๊ณ ๊ตฌํํ๊ธฐ ์ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
CSS ์คํฌ๋กค ํ์๋ผ์ธ ์ดํดํ๊ธฐ
ํ์๋ผ์ธ ์ฐธ์กฐ ํ์ธ์ ๋ํด ์์๋ณด๊ธฐ ์ ์ CSS ์คํฌ๋กค ํ์๋ผ์ธ์ ๋ํด ๊ฐ๋จํ ๋ณต์ตํด ๋ณด๊ฒ ์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ ๋๋ฉ์ด์ ์ด ๊ณ ์ ๋ ์ง์ ์๊ฐ์ด ์๋ ์คํฌ๋กค ์ปจํ ์ด๋์ ์คํฌ๋กค ์์น์ ์ํด ์ ์ด๋๋๋ก ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์ ์คํฌ๋กค์ ์ง์ ๋ฐ์ํ๋ ๋ ์์ฐ์ค๋ฝ๊ณ ์ํธ์์ฉ์ ์ธ ์ ๋๋ฉ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค.
์ฃผ์ ๊ด๋ จ ์์ฑ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
scroll-timeline-name: ์คํฌ๋กค ํ์๋ผ์ธ์ ์ด๋ฆ์ ํ ๋นํฉ๋๋ค.scroll-timeline-axis: ์คํฌ๋กค ์ถ(block๋๋inline, ์ด์ ์๋vertical๋๋horizontal)์ ์ง์ ํฉ๋๋ค.animation-timeline: ์ ๋๋ฉ์ด์ ์ ์ด๋ฆ์ด ์ง์ ๋ ์คํฌ๋กค ํ์๋ผ์ธ์ ์ฐ๊ฒฐํฉ๋๋ค.
์ด๋ฌํ ์์ฑ๋ค์ ํคํ๋ ์๊ณผ ๊ฒฐํฉํ์ฌ ๊ฐ๋ฐ์๊ฐ ๋ณต์กํ๊ณ ๋งค๋ ฅ์ ์ธ ์คํฌ๋กค ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์ ์ ๋ง๋ค ์ ์๊ฒ ํฉ๋๋ค.
ํ์๋ผ์ธ ์ฐธ์กฐ ํ์ธ์ด๋ ๋ฌด์์ธ๊ฐ?
ํ์๋ผ์ธ ์ฐธ์กฐ ํ์ธ์ ์ฌ๋ฌ ํ์๋ผ์ธ์ด ์กด์ฌํ ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ ๋๋ฉ์ด์ ์ ์ด๋ค ์คํฌ๋กค ํ์๋ผ์ธ์ ์ฌ์ฉํด์ผ ํ ์ง ๊ฒฐ์ ํ๋ ๊ณผ์ ์ ๋๋ค. "์ฌ๋ฌ ์คํฌ๋กค ์ปจํ ์ด๋์ ํ์๋ผ์ธ์ด ์ ์๋์ด ์๋ค๋ฉด, ๋ด ์ ๋๋ฉ์ด์ ์ ์ด๋ค ๊ฒ์ ์ฐ๊ฒฐ๋๋๊ฐ?"๋ผ๋ ์ง๋ฌธ์ ๋ตํฉ๋๋ค. ์ด ํ์ธ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ ํ ํ์๋ผ์ธ์ ์ ํํ๊ธฐ ์ํ ๋ช ํํ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ ์ํ์ฌ, ์ฌ๋ฌ ๋ธ๋ผ์ฐ์ ์ ์ฅ์น์์ ์์ธก ๊ฐ๋ฅํ๊ณ ์ผ๊ด๋ ๋์์ ๋ณด์ฅํฉ๋๋ค.
ํ์๋ผ์ธ ์ฐธ์กฐ ํ์ธ์ ์ค์์ฑ
์ ์ ์๋ ํ์ธ ๊ณผ์ ์ด ์๋ค๋ฉด, ์ ๋๋ฉ์ด์ ์ด ์คํฌ๋กค ํ์๋ผ์ธ์ ๋ฐ์ธ๋ฉ๋์ด์ผ ํ ๋ ๋ชจํธํจ์ด ๋ฐ์ํ ๊ฒ์ ๋๋ค. ์ด๋ ์ผ๊ด๋์ง ์์ ๋์์ผ๋ก ์ด์ด์ ธ ๊ฐ๋ฐ์๊ฐ ์ ๋ขฐํ ์ ์๋ ์คํฌ๋กค ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์ ์ ๋ง๋๋ ๊ฒ์ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ํ์๋ผ์ธ ์ฐธ์กฐ ํ์ธ์ ์ฌ๋ฐ๋ฅธ ํ์๋ผ์ธ์ ์ ํํ๊ธฐ ์ํ ๊ฒฐ์ ๋ก ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ์ด๋ฌํ ๋ชจํธํจ์ ์ ๊ฑฐํฉ๋๋ค.
ํ์๋ผ์ธ ์ฐธ์กฐ ํ์ธ ์๊ณ ๋ฆฌ์ฆ
ํ์๋ผ์ธ ์ฐธ์กฐ ํ์ธ ์๊ณ ๋ฆฌ์ฆ์ ์ ๋๋ฉ์ด์ ์ ์ ํฉํ ์คํฌ๋กค ํ์๋ผ์ธ์ ๊ฒฐ์ ํ๊ธฐ ์ํด ํน์ ๊ท์น ์งํฉ์ ๋ฐ๋ฆ ๋๋ค. ์ด ๊ท์น๋ค์ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
- ๋ช
์์ ์ธ `animation-timeline` ๊ฐ: ๋ช
์์ ์ผ๋ก ์ ์๋
animation-timeline์์ฑ์ ๊ฐ์ฅ ๋์ ์ฐ์ ์์๊ฐ ๋ถ์ฌ๋ฉ๋๋ค. ์์์animation-timeline: my-timeline๊ณผ ๊ฐ์ ์ ๋๋ฉ์ด์ ์ด ์๋ ๊ฒฝ์ฐ, ๋ธ๋ผ์ฐ์ ๋ ๋จผ์ ์์์ ํฌํจ ๋ธ๋ก ์ฒด์ธ(containing block chain)์์scroll-timeline-name: my-timeline์ ๊ฐ์ง ์คํฌ๋กค ์ปจํ ์ด๋๋ฅผ ์ฐพ์ผ๋ ค๊ณ ์๋ํฉ๋๋ค. - ํฌํจ ๋ธ๋ก ์ฒด์ธ ์ํ: ๋ธ๋ผ์ฐ์ ๋ ์ผ์นํ๋
scroll-timeline-name์ ๊ฐ์ง ์คํฌ๋กค ์ปจํ ์ด๋๋ฅผ ์ฐพ๊ธฐ ์ํด ํฌํจ ๋ธ๋ก ์ฒด์ธ์ ์๋ก ์ํํฉ๋๋ค. ํฌํจ ๋ธ๋ก ์ฒด์ธ์ ์์๊ฐ ์ค์ฒฉ๋ ํฌํจ ๋ธ๋ก๋ค์ ์ฐ์์ ๋๋ค. ์ด ๊ฒ์์ ๋ฌธ์์ ๋ฃจํธ์ ๋๋ฌํ ๋๊น์ง ๊ณ์๋ฉ๋๋ค. - ์ฒซ ๋ฒ์งธ ์ผ์น ํญ๋ชฉ ์ฐ์ : ํฌํจ ๋ธ๋ก ์ฒด์ธ์์ ๋์ผํ
scroll-timeline-name์ ๊ฐ์ง ์ฌ๋ฌ ์คํฌ๋กค ์ปจํ ์ด๋๊ฐ ๋ฐ๊ฒฌ๋๋ฉด, ์ํ ์ค์ ๊ฐ์ฅ ๋จผ์ ๋ง์ฃผ์น๋ ๊ฒ์ด ์ ํ๋ฉ๋๋ค. ์ด๋ ์ผ์นํ๋ ํ์๋ผ์ธ ์ด๋ฆ์ ๊ฐ์ง ๊ฐ์ฅ ๊ฐ๊น์ด ์กฐ์์ด ์ฐ์ ๊ถ์ ๊ฐ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. - `none` ๊ฐ: ๋ง์ฝ
animation-timeline์ดnone์ผ๋ก ์ค์ ๋๊ฑฐ๋, ํฌํจ ๋ธ๋ก ์ฒด์ธ์์ ์ผ์นํ๋ ์คํฌ๋กค ์ปจํ ์ด๋๋ฅผ ์ฐพ์ง ๋ชปํ๋ฉด, ์ ๋๋ฉ์ด์ ์ ์ด๋ค ์คํฌ๋กค ํ์๋ผ์ธ๊ณผ๋ ์ฐ๊ฒฐ๋์ง ์๊ณ ๊ธฐ์กด์ ์๊ฐ ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์ ์ฒ๋ผ ๋์ํฉ๋๋ค. - ์์์ ํ์๋ผ์ธ: ๋ช
์์ ์ธ
animation-timeline์ด ์ค์ ๋์ง ์๊ณscroll-driven์ถ์ฝํ์ด ์ฌ์ฉ๋๊ฑฐ๋ ๋ค๋ฅธ ์์์ ์ธ ๋ฐฉ๋ฒ์ด ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ, ๋ธ๋ผ์ฐ์ ๋ ์์์ ๊ฐ์ฅ ๊ฐ๊น์ด ์คํฌ๋กค ์กฐ์๊ณผ ์ฐ๊ฒฐ๋ ์ต๋ช ํ์๋ผ์ธ์ ์์ฑํ ์ ์์ต๋๋ค.
์๊ฐ์ ๋น์
๊ฐ๊ณ๋๋ฅผ ์์ํด ๋ณด์ธ์. ๊ฐ ์กฐ์์ ํฌํจ ๋ธ๋ก์ ๋ํ๋
๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ์ ๋๋ฉ์ด์
์ด ํ์ํ ์์์์ ์์ํ์ฌ ์กฐ์๋ค์ ํตํด ์์ชฝ์ผ๋ก ๊ฒ์ํฉ๋๋ค. ์ผ์นํ๋ scroll-timeline-name์ ๊ฐ์ง ์ฒซ ๋ฒ์งธ ์กฐ์์ ์ฐพ์ผ๋ฉด ํด๋น ํ์๋ผ์ธ์ด ์ ํ๋ฉ๋๋ค.
ํ์๋ผ์ธ ์ฐธ์กฐ ํ์ธ์ ์ค์ ์์
ํ์๋ผ์ธ ์ฐธ์กฐ ํ์ธ์ด ๋ค์ํ ์๋๋ฆฌ์ค์์ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ค๋ช ํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ์ค์ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ค์ฒฉ๋ ์คํฌ๋กค ์ปจํ ์ด๋, ์ฌ๋ฌ ํ์๋ผ์ธ, ๋ช ์์ /์์์ ํ์๋ผ์ธ ํ ๋น์ด ์๋ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์์ 1: ๊ธฐ๋ณธ ํ์๋ผ์ธ ํ์ธ
์ด ์์ ์์๋ my-timeline์ด๋ผ๋ ์ด๋ฆ์ ํ์๋ผ์ธ์ ๊ฐ์ง ๊ฐ๋จํ ์คํฌ๋กค ์ปจํ
์ด๋์, ๊ทธ ์์์ ์ด ํ์๋ผ์ธ์ ์ ๋๋ฉ์ด์
์ ์ฌ์ฉํ๋ ์์๊ฐ ์์ต๋๋ค.
.scroll-container {
width: 300px;
height: 200px;
overflow: auto;
scroll-timeline-name: my-timeline;
scroll-timeline-axis: block;
}
.animated-element {
width: 100px;
height: 100px;
background-color: red;
animation-name: slide;
animation-duration: auto;
animation-timeline: my-timeline;
}
@keyframes slide {
from {
transform: translateX(0);
}
to {
transform: translateX(200px);
}
}
์ด ๊ฒฝ์ฐ, animated-element๋ ์ผ์นํ๋ ํ์๋ผ์ธ ์ด๋ฆ์ ๊ฐ์ง ๊ฐ์ฅ ๊ฐ๊น์ด ์กฐ์์ด๋ฏ๋ก .scroll-container์ ์ ์๋ my-timeline์ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
์์ 2: ์ค์ฒฉ๋ ์คํฌ๋กค ์ปจํ ์ด๋
์ฌ๊ธฐ์๋ ๊ฐ๊ฐ ์์ฒด ํ์๋ผ์ธ์ ๊ฐ์ง ์ค์ฒฉ๋ ์คํฌ๋กค ์ปจํ ์ด๋๊ฐ ์์ต๋๋ค. ์ด ์์ ๋ ํฌํจ ๋ธ๋ก ์ฒด์ธ ์ํ๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ณด์ฌ์ค๋๋ค.
.outer-container {
width: 400px;
height: 300px;
overflow: auto;
scroll-timeline-name: outer-timeline;
scroll-timeline-axis: block;
}
.inner-container {
width: 200px;
height: 150px;
overflow: auto;
scroll-timeline-name: inner-timeline;
scroll-timeline-axis: block;
}
.animated-element {
width: 50px;
height: 50px;
background-color: blue;
animation-name: fade;
animation-duration: auto;
animation-timeline: inner-timeline;
}
@keyframes fade {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
<div class="outer-container"> <div class="inner-container"> <div class="animated-element"></div> </div> </div>
animated-element๋ ์ผ์นํ๋ ํ์๋ผ์ธ ์ด๋ฆ์ ๊ฐ์ง ๊ฐ์ฅ ๊ฐ๊น์ด ์กฐ์์ธ .inner-container์ ์ ์๋ inner-timeline์ ์ฌ์ฉํฉ๋๋ค. ๋ง์ฝ animation-timeline์ outer-timeline์ผ๋ก ๋ณ๊ฒฝํ๋ฉด, outer-timeline์ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
์์ 3: ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ์ฌ๋ฌ ํ์๋ผ์ธ
์ด ์์ ๋ ๋์ผํ ํฌํจ ๋ธ๋ก ์ฒด์ธ์ ์๋ ์ฌ๋ฌ ์คํฌ๋กค ์ปจํ ์ด๋๊ฐ ๋์ผํ ํ์๋ผ์ธ ์ด๋ฆ์ ๊ฐ์ง ๋ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ๋ณด์ฌ์ค๋๋ค.
.container1 {
width: 300px;
height: 200px;
overflow: auto;
scroll-timeline-name: shared-timeline;
scroll-timeline-axis: block;
}
.container2 {
width: 300px;
height: 200px;
overflow: auto;
scroll-timeline-name: shared-timeline;
scroll-timeline-axis: block;
}
.animated-element {
width: 100px;
height: 100px;
background-color: green;
animation-name: rotate;
animation-duration: auto;
animation-timeline: shared-timeline;
}
@keyframes rotate {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
<div class="container1"> </div> <div class="container2"> <div class="animated-element"></div> </div>
.animated-element๊ฐ .container2 ๋ด์ ์ค์ฒฉ๋์ด ์๊ณ , .container2๊ฐ DOM์์ ๋์ค์ ๋์ค๋ฏ๋ก(๋ฐ๋ผ์ ์ด ํน์ ์์์๋ ํฌํจ ๋ธ๋ก ์ฒด์ธ์์ "๋ ๊ฐ๊น๊ธฐ" ๋๋ฌธ์), rotate ์ ๋๋ฉ์ด์
์ .container2์ ์ ์๋ shared-timeline์ ์ฌ์ฉํฉ๋๋ค. ๋ง์ฝ ์์๊ฐ `container1` ์์ผ๋ก ์ฎ๊ฒจ์ง๋ค๋ฉด `container1`์ ํ์๋ผ์ธ์ ์ฌ์ฉํ๊ฒ ๋ ๊ฒ์
๋๋ค.
์์ 4: `animation-timeline: none`
์ด ์์ ๋ animation-timeline: none์ผ๋ก ์ค์ ํ์ฌ ์ ๋๋ฉ์ด์
์ด ์ด๋ค ์คํฌ๋กค ํ์๋ผ์ธ๊ณผ๋ ์ฐ๊ฒฐ๋์ง ์๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
.scroll-container {
width: 300px;
height: 200px;
overflow: auto;
scroll-timeline-name: my-timeline;
scroll-timeline-axis: block;
}
.animated-element {
width: 100px;
height: 100px;
background-color: purple;
animation-name: slide;
animation-duration: 2s; /* Use a duration */
animation-timeline: none;
}
@keyframes slide {
from {
transform: translateX(0);
}
to {
transform: translateX(200px);
}
}
์ด ๊ฒฝ์ฐ, slide ์ ๋๋ฉ์ด์
์ .scroll-container์ ์ ์๋ my-timeline์ ๋ฌด์ํ๊ณ ์ผ๋ฐ์ ์ธ ์๊ฐ ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์
์ผ๋ก ์คํ๋ฉ๋๋ค.
์์ 5: `scroll-driven`์ ์ฌ์ฉํ ์์์ ํ์๋ผ์ธ
scroll-driven ์ถ์ฝํ์ ์์์ ์ธ ํ์๋ผ์ธ ์์ฑ์ ํ์ฉํฉ๋๋ค. ์ฌ๊ธฐ์๋ ํ์๋ผ์ธ์ ๋ช
์์ ์ผ๋ก ๋ช
๋ช
ํ์ง ์๊ณ ๊ฐ์ฅ ๊ฐ๊น์ด ์คํฌ๋กค ์กฐ์์ ์ํด ์ ๋๋ฉ์ด์
์ด ๊ตฌ๋๋ฉ๋๋ค.
.scroll-container {
width: 300px;
height: 200px;
overflow: auto;
}
.animated-element {
width: 100px;
height: 100px;
background-color: orange;
animation-name: slide;
animation-duration: auto;
animation-timeline: scroll-driven(block);
}
@keyframes slide {
from {
transform: translateX(0);
}
to {
transform: translateX(200px);
}
}
animated-element์ slide ์ ๋๋ฉ์ด์
์ scroll-container์ block ์ถ์ ๋ฐ๋ฅธ ์คํฌ๋กค ์์น์ ์ํด ๊ตฌ๋๋ฉ๋๋ค. ๋ช
์์ ์ธ ํ์๋ผ์ธ ์ด๋ฆ์ ํ์ ์์ง๋ง, ๋ธ๋ผ์ฐ์ ๋ ์คํฌ๋กค ์ปจํ
์ด๋์ ์ฐ๊ฒฐ๋ ํ์๋ผ์ธ์ ์์์ ์ผ๋ก ์์ฑํฉ๋๋ค.
ํ์๋ผ์ธ ์ฐธ์กฐ ํ์ธ ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
ํ์๋ผ์ธ ์ฐธ์กฐ ํ์ธ์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๊ณ ๊ฒฌ๊ณ ํ ์คํฌ๋กค ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์ ์ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค:
- ๋ช
์์ ์ธ `animation-timeline` ๊ฐ ์ฌ์ฉ: ๋ชจํธํจ์ ํผํ๊ณ ์ ๋๋ฉ์ด์
์ด ์ฌ๋ฐ๋ฅธ ํ์๋ผ์ธ์ ์ฐ๊ฒฐ๋๋๋ก ํญ์
animation-timeline์์ฑ์ ๋ช ์์ ์ผ๋ก ์ง์ ํ์ญ์์ค. - ์ค๋ช
์ ์ธ ํ์๋ผ์ธ ์ด๋ฆ ์ ํ: ์ฝ๋ ๊ฐ๋
์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํค๊ธฐ ์ํด ์คํฌ๋กค ํ์๋ผ์ธ์ ๋ช
ํํ๊ณ ์ค๋ช
์ ์ธ ์ด๋ฆ(์:
timeline1๋์header-scroll-timeline)์ ์ฌ์ฉํ์ญ์์ค. - ์ถฉ๋ํ๋ ํ์๋ผ์ธ ์ด๋ฆ ํผํ๊ธฐ: ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์์ ๋์ผํ ํ์๋ผ์ธ ์ด๋ฆ์ ์ฌ์ฉํ ๋ ์ฃผ์ํ์ญ์์ค. ๋์ผํ ์ด๋ฆ์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ, ์๊ธฐ์น ์์ ๋์์ ๋ฐฉ์งํ๊ธฐ ์ํด ์คํฌ๋กค ์ปจํ ์ด๋๊ฐ ๋์ผํ ํฌํจ ๋ธ๋ก ์ฒด์ธ์ ์์ง ์๋๋ก ํ์ญ์์ค.
- ์ฑ๋ฅ ๊ณ ๋ ค: ์คํฌ๋กค ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์
์ ์ฑ๋ฅ์ ๋ง์ด ์๋ชจํ ์ ์์ต๋๋ค. ํ๋์จ์ด ๊ฐ์(์:
transform: translateZ(0))์ ์ฌ์ฉํ๊ณ ํคํ๋ ์์ ๋ณต์ก์ฑ์ ์ต์ํํ์ฌ ์ ๋๋ฉ์ด์ ์ ์ต์ ํํ์ญ์์ค. - ์ฌ๋ฌ ๋ธ๋ผ์ฐ์ ๋ฐ ์ฅ์น์์ ํ ์คํธ: ์คํฌ๋กค ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์ ์ด ์ฌ๋ฌ ๋ธ๋ผ์ฐ์ ์ ์ฅ์น์์ ์ผ๊ด๋๊ฒ ์๋ํ๋์ง ํ์ธํ์ญ์์ค. ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น ํ๊ณ ์ฑ๋ฅ์ ์ต์ ํํ์ญ์์ค.
- ์ ๊ทผ์ฑ: ์์ง์์ ๋ฏผ๊ฐํ ์ ์๋ ์ฌ์ฉ์๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ์คํฌ๋กค ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์ ์ ๊ฐ๋๋ฅผ ๋นํ์ฑํํ๊ฑฐ๋ ์ค์ผ ์ ์๋ ์ต์ ์ ์ ๊ณตํ์ญ์์ค.
๊ณ ๊ธ ๊ธฐ์ ๋ฐ ๊ณ ๋ ค ์ฌํญ
CSS ๋ณ์์ ์คํฌ๋กค ํ์๋ผ์ธ ๊ฒฐํฉ
CSS ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์คํฌ๋กค ํ์๋ผ์ธ ๋ฐ ์ ๋๋ฉ์ด์ ์ ์์ฑ์ ๋์ ์ผ๋ก ์ ์ดํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ ์ ์ฐํ๊ณ ๋ฐ์ํ์ธ ์คํฌ๋กค ๊ธฐ๋ฐ ํจ๊ณผ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
:root {
--timeline-name: my-timeline;
}
.scroll-container {
width: 300px;
height: 200px;
overflow: auto;
scroll-timeline-name: var(--timeline-name);
scroll-timeline-axis: block;
}
.animated-element {
width: 100px;
height: 100px;
background-color: red;
animation-name: slide;
animation-duration: auto;
animation-timeline: var(--timeline-name);
}
--timeline-name ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝํ์ฌ ์ ๋๋ฉ์ด์
์์ ์ฌ์ฉํ๋ ์คํฌ๋กค ํ์๋ผ์ธ์ ๋์ ์ผ๋ก ์ ํํ ์ ์์ต๋๋ค.
๋ณต์กํ ํ์๋ผ์ธ ๊ด๋ฆฌ๋ฅผ ์ํ JavaScript ์ฌ์ฉ
๋ ๋ณต์กํ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ JavaScript๋ฅผ ์ฌ์ฉํ์ฌ ์คํฌ๋กค ํ์๋ผ์ธ๊ณผ ์ ๋๋ฉ์ด์ ์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์ ์ ์ ํ์๋ผ์ธ ํ์ธ ๋ก์ง์ ๋ง๋ค๊ณ ์ฌ์ฉ์ ์ํธ ์์ฉ์ด๋ ๋ค๋ฅธ ์์ธ์ ๋ฐ๋ผ ์ ๋๋ฉ์ด์ ์์ฑ์ ๋์ ์ผ๋ก ์กฐ์ ํ ์ ์์ต๋๋ค.
const scrollContainer = document.querySelector('.scroll-container');
const animatedElement = document.querySelector('.animated-element');
scrollContainer.addEventListener('scroll', () => {
const scrollPosition = scrollContainer.scrollTop;
// Update animation properties based on scroll position
animatedElement.style.transform = `translateX(${scrollPosition}px)`;
});
์ด ์์ ๋ CSS ์คํฌ๋กค ํ์๋ผ์ธ์ ์ง์ ์ฌ์ฉํ์ง๋ ์์ง๋ง, ์คํฌ๋กค ์์น์ ๋ฐ๋ผ ์ ๋๋ฉ์ด์ ์ ์ ์ดํ๋ ๋ฐ JavaScript๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ ์๋์ง ๋ณด์ฌ์ฃผ๋ฉฐ, ๋ ๋ณต์กํ ์๋๋ฆฌ์ค๋ฅผ ์ํ ๋์ฒด ์ ๊ทผ๋ฒ์ด๋ ํด๋ฐฑ(fallback)์ ์ ๊ณตํฉ๋๋ค.
CSS ์คํฌ๋กค ํ์๋ผ์ธ์ ๋ฏธ๋ ๋ํฅ
CSS ์คํฌ๋กค ํ์๋ผ์ธ ๋ถ์ผ๋ ๋์์์ด ๋ฐ์ ํ๊ณ ์์ต๋๋ค. ์ฃผ๋ชฉํด์ผ ํ ๋ช ๊ฐ์ง ์ ์ฌ์ ์ธ ๋ฏธ๋ ๋ํฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํฅ์๋ ๋ธ๋ผ์ฐ์ ์ง์: CSS ์คํฌ๋กค ํ์๋ผ์ธ์ด ๋ ๋๋ฆฌ ์ฑํ๋จ์ ๋ฐ๋ผ ๋ธ๋ผ์ฐ์ ์ง์์ด ๊ณ์ ๊ฐ์ ๋์ด ์ฌ๋ฌ ํ๋ซํผ์์ ์ผ๊ด๋ ์คํฌ๋กค ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์ ์ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
- ๋ ์ง๋ณด๋ ํ์๋ผ์ธ ์ต์ : ์ฌ๋ฌ ์คํฌ๋กค ์ถ ์ง์, ์ฌ์ฉ์ ์ ์ ์ด์ง ํจ์, ๋ ์ ๊ตํ ํ์๋ผ์ธ ํ์ธ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๊ฐ์ ๋ ์ง๋ณด๋ ํ์๋ผ์ธ ์ต์ ์ด ๋์ ๋ ์ ์์ต๋๋ค.
- ์น ์ปดํฌ๋ํธ์์ ํตํฉ: CSS ์คํฌ๋กค ํ์๋ผ์ธ์ด ์น ์ปดํฌ๋ํธ์ ํตํฉ๋์ด ๊ฐ๋ฐ์๊ฐ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ ์บก์ํ๋ ์คํฌ๋กค ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์ ๋ชจ๋์ ๋ง๋ค ์ ์๊ฒ ๋ ์ ์์ต๋๋ค.
- ํฅ์๋ ์ฑ๋ฅ ์ต์ ํ: ํฅํ ๋ฒ์ ์ CSS ์คํฌ๋กค ํ์๋ผ์ธ์๋ ๋ด์ฅ๋ ์ฑ๋ฅ ์ต์ ํ ๊ธฐ์ ์ด ํฌํจ๋์ด ๋ถ๋๋ฝ๊ณ ํจ์จ์ ์ธ ์คํฌ๋กค ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์ ์ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์์ ๊ฒ์ ๋๋ค.
๊ฒฐ๋ก
CSS ์คํฌ๋กค ํ์๋ผ์ธ ์ด๋ฆ ํ์ธ, ํนํ ํ์๋ผ์ธ ์ฐธ์กฐ ํ์ธ์ ์์ธก ๊ฐ๋ฅํ๊ณ ํจ๊ณผ์ ์ธ ์คํฌ๋กค ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์ ์ ๋ง๋๋ ๋ฐ ์ค์ํ ๊ฐ๋ ์ ๋๋ค. ํ์ธ ์๊ณ ๋ฆฌ์ฆ์ ์ดํดํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด ๊ฐ๋ฐ์๋ ์คํฌ๋กค ํ์๋ผ์ธ์ ํ์ ํ์ฉํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๊ณ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์ ์ธ ํจ๊ณผ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๊ธฐ์ ์ด ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ ์น์์ ์คํฌ๋กค ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์ ์ ํจ์ฌ ๋ ํฅ๋ฏธ๋ก์ด ๊ฐ๋ฅ์ฑ์ ๊ธฐ๋ํ ์ ์์ต๋๋ค. ๊ฐ๋จํ ํจ๋ด๋์ค ํจ๊ณผ๋ฅผ ๊ตฌ์ถํ๋ ๋ณต์กํ ์ธํฐ๋ํฐ๋ธ ๊ฒฝํ์ ๋ง๋ค๋ , ํ์๋ผ์ธ ์ฐธ์กฐ ํ์ธ์ ๋ง์คํฐํ๋ ๊ฒ์ ๊ฒฌ๊ณ ํ๊ณ ๋งค๋ ฅ์ ์ธ ์คํฌ๋กค ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์ ์ ๋ง๋๋ ๋ฐ ํ์์ ์ ๋๋ค.