๋ณต์กํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ชจ๋ํ๋๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๋ฉฐ ์์ธก ๊ฐ๋ฅํ ์คํ์ผ์ํธ๋ฅผ ๋ง๋ค๊ธฐ ์ํ CSS @scope์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์์๋ณด์ธ์. ํน์ ์์๋ฅผ ์ฝ๊ฒ ํ๊ฒํ ํ๊ณ CSS ์ถฉ๋์ ํผํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋๋ค.
CSS @scope: ๋ฒ์ ์ง์ ์คํ์ผ๋ง ์ฌ์ธต ๋ถ์
์น ์ ํ๋ฆฌ์ผ์ด์
์ด ์ ์ ๋ ๋ณต์กํด์ง์ ๋ฐ๋ผ CSS ์คํ์ผ์ํธ ๊ด๋ฆฌ๋ ์๋นํ ์ด๋ ค์์ด ๋ ์ ์์ต๋๋ค. ์ ์ญ ์คํ์ผ์ํธ๋ ์ด๊ธฐ์ ๊ตฌํํ๊ธฐ๋ ๊ฐ๋จํ์ง๋ง, ์ข
์ข
์๋ํ์ง ์์ ์คํ์ผ ์ถฉ๋๊ณผ ์ ์ง๋ณด์ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํฉ๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด CSS ๋ชจ๋์ด๋ BEM(Block, Element, Modifier)๊ณผ ๊ฐ์ ๊ธฐ๋ฒ์ด ๋ฑ์ฅํ์ง๋ง, ์ด์ CSS๋ ๋ค์ดํฐ๋ธ ์๋ฃจ์
์ธ @scope
@๊ท์น์ ์ ๊ณตํฉ๋๋ค. ์ด ๋ธ๋ก๊ทธ ํฌ์คํธ์์๋ @scope
์ ๋ชฉ์ , ๊ตฌ๋ฌธ, ์ด์ ๋ฐ ๋ค์ํ ์์ ๋ฅผ ํตํ ์ค์ ์ฌ์ฉ๋ฒ์ ์ข
ํฉ์ ์ผ๋ก ์ดํด๋ด
๋๋ค.
CSS @scope๋ ๋ฌด์์ธ๊ฐ?
@scope
@๊ท์น์ ์ฌ์ฉํ๋ฉด ๋ฌธ์์ ํน์ ์์ญ ๋ด์์๋ง ์ ์ฉ๋๋ ์คํ์ผ๋ง ๊ท์น์ ์ ์ํ ์ ์์ต๋๋ค. ์ด๋ ์คํ์ผ์ ์บก์ํํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ค๋ฅธ ๋ถ๋ถ์ ์๋์น ์๊ฒ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ํนํ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค:
- ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ: ๊ฐ๋ณ ์ปดํฌ๋ํธ์ ์คํ์ผ์ ๋ถ๋ฆฌํ์ฌ ์ฃผ๋ณ ์ปจํ ์คํธ์ ๊ด๊ณ์์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๋ง๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ์์ ฏ: ๊ธฐ์กด CSS์์ ์คํ์ผ ์ถฉ๋ ์ํ ์์ด ์ธ๋ถ ์ปดํฌ๋ํธ๋ฅผ ์๋ฒ ๋ํฉ๋๋ค.
- ๋๊ท๋ชจ์ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ : ์คํ์ผ ๊ท์น์ ๋ฒ์๋ฅผ ์ค์ฌ CSS ์ฝ๋๋ฒ ์ด์ค์ ์ ์ง๋ณด์์ฑ๊ณผ ์์ธก ๊ฐ๋ฅ์ฑ์ ํฅ์์ํต๋๋ค.
๋ณธ์ง์ ์ผ๋ก @scope
๋ ๊ฒฝ๊ณ๋ฅผ ์์ฑํ์ฌ CSS ๊ท์น์ ๋๋ฌ ๋ฒ์๋ฅผ ์ ํํ๊ณ , ๋ณด๋ค ๋ชจ๋ํ๋๊ณ ์ฒด๊ณ์ ์ธ ์คํ์ผ๋ง ์ ๊ทผ ๋ฐฉ์์ ์ด์งํฉ๋๋ค.
@scope์ ๊ตฌ๋ฌธ
@scope
@๊ท์น์ ๊ธฐ๋ณธ ๊ตฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
@scope (<scope-start>) to (<scope-end>) {
/* CSS ๊ท์น */
}
์ด ๊ตฌ๋ฌธ์ ๊ฐ ๋ถ๋ถ์ ๋ถ์ํด ๋ณด๊ฒ ์ต๋๋ค:
@scope
: ๋ฒ์ ์ง์ ์ ์์ํ๋ @๊ท์น์ ๋๋ค.<scope-start>
: ๋ฒ์์ ์์์ ์ ์ ์ํ๋ ์ ํ์์ ๋๋ค.@scope
๋ธ๋ก ๋ด์ ์คํ์ผ์ ์ด ์์์ ๊ทธ ํ์ ์์์ ์ ์ฉ๋ฉ๋๋ค. ์๋ตํ๋ฉด ๋ฌธ์ ์ ์ฒด๊ฐ scope-start๊ฐ ๋ฉ๋๋ค.to
(์ ํ ์ฌํญ): scope-start์ scope-end๋ฅผ ๊ตฌ๋ถํ๋ ํค์๋์ ๋๋ค.<scope-end>
(์ ํ ์ฌํญ): ๋ฒ์์ ๋์ ์ ์ ์ํ๋ ์ ํ์์ ๋๋ค. ์คํ์ผ์ ์ด ์์๋ ๊ทธ ํ์ ์์์๋ ์ ์ฉ๋์ง *์์ต๋๋ค*. ์๋ตํ๋ฉด scope-start ๋ด์์ ๋ฌธ์ ๋๊น์ง ํ์ฅ๋ฉ๋๋ค.{ /* CSS ๊ท์น */ }
: ์ ์๋ ๋ฒ์ ๋ด์์ ์ ์ฉ๋ CSS ๊ท์น์ ํฌํจํ๋ ๋ธ๋ก์ ๋๋ค.
๊ตฌ๋ฌธ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ค๋ช ํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
์์ 1: ๊ธฐ๋ณธ ๋ฒ์ ์ง์
์ด ์์ ๋ ID๊ฐ "my-component"์ธ ํน์ <div>
์์๋ก ์คํ์ผ ๋ฒ์๋ฅผ ์ง์ ํฉ๋๋ค:
@scope (#my-component) {
h2 {
color: blue;
}
p {
font-size: 16px;
}
}
์ด ๊ฒฝ์ฐ <div id="my-component">
๋ด์ h2
์ p
์์๋ ๊ฐ๊ฐ ํ๋์ ํ
์คํธ์ 16px์ ๊ธ๊ผด ํฌ๊ธฐ๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ์คํ์ผ์ ์ด <div>
์ธ๋ถ์ h2
๋ p
์์์๋ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
์์ 2: 'to' ํค์๋ ์ฌ์ฉํ๊ธฐ
์ด ์์ ๋ ํด๋์ค๊ฐ "scoped-section"์ธ <section>
๋ถํฐ <footer>
*์ ๊น์ง* ์คํ์ผ ๋ฒ์๋ฅผ ์ง์ ํ์ง๋ง, <footer>
๋ *ํฌํจํ์ง ์์ต๋๋ค*:
@scope (.scoped-section) to (footer) {
p {
line-height: 1.5;
}
}
์ฌ๊ธฐ์ .scoped-section
๋ด์ ๋ชจ๋ <p>
์์๋ 1.5์ ์ค ๊ฐ๊ฒฉ์ ๊ฐ๊ฒ ๋ฉ๋๋ค. *๋จ*, .scoped-section
์ ํ์ ์์์ธ <footer>
๋ด์ ์๋ ๊ฒฝ์ฐ๋ ์์ธ์
๋๋ค. ๋ง์ฝ footer๊ฐ ์กด์ฌํ๋ค๋ฉด, ๊ทธ footer ์์ `
` ์์๋ค์ ์ด scope์ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค.
์์ 3: scope-start ์๋ตํ๊ธฐ
scope-start ์ ํ์๋ฅผ ์๋ตํ๋ฉด ๋ฒ์๋ ๋ฌธ์์ ๋ฃจํธ์์ ์์๋ฉ๋๋ค.
@scope to (footer) {
body {
background-color: #f0f0f0;
}
}
์ด๋ `body` ์์์ `footer` ์์ *์ ๊น์ง*, ํ์ง๋ง `footer`๋ฅผ *ํฌํจํ์ง ์๋* ๋ฒ์๊น์ง ์ฐํ ํ์ ๋ฐฐ๊ฒฝ์ ์ ์ฉํฉ๋๋ค. footer ๋ด๋ถ์ ์ด๋ค ๊ฒ๋ ์ฐํ ํ์ ๋ฐฐ๊ฒฝ์์ ๊ฐ์ง ์์ต๋๋ค.
@scope ์ฌ์ฉ์ ์ด์
@scope
@๊ท์น์ ์น ๊ฐ๋ฐ์ ์ฌ๋ฌ ๊ฐ์ง ์ค์ํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ํฅ์๋ CSS ๋ช
์๋ ์ ์ด:
@scope
๋ ์ถฉ๋ํ๋ ์คํ์ผ์ ๋ฎ์ด์ฐ๊ธฐ ์ํด ๊ณผ๋ํ๊ฒ ๊ตฌ์ฒด์ ์ธ ์ ํ์(์:!important
์ฌ์ฉ)์ ํ์์ฑ์ ์ค์ฌ์ค๋๋ค. ๊ท์น์ ๋ฒ์๋ฅผ ์ ํํจ์ผ๋ก์จ ๋ ์์ธก ๊ฐ๋ฅํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์คํ์ผ ์บ์ค์ผ์ด๋๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. - ํฅ์๋ ์ปดํฌ๋ํธํ: ์ง์ ํ ์ปดํฌ๋ํธ ์์ค์ ์คํ์ผ๋ง์ ๊ฐ๋ฅํ๊ฒ ํ์ฌ, ์ปดํฌ๋ํธ๊ฐ CSS ์ถฉ๋ ๊ฑฑ์ ์์ด ๊ฐ๋ฐ๋๊ณ ์ฌ์ฌ์ฉ๋ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ ์ด์งํ๊ณ ๋ณ๊ฒฝ ์ ๋ฒ๊ทธ ๋ฐ์ ์ํ์ ์ค์ ๋๋ค.
- CSS ์ฉ๋ ๊ฐ์: ์คํ์ผ์ด ์๋ํ์ง ์์ ์์ญ์ผ๋ก ๋ฒ์ง๋ ๊ฒ์ ๋ฐฉ์งํจ์ผ๋ก์จ
@scope
๋ ์ ์ฒด CSS ํ์ผ ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ์ด๋ ๋ ๋น ๋ฅธ ํ์ด์ง ๋ก๋ ์๊ฐ๊ณผ ํฅ์๋ ์ฑ๋ฅ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. - ๋จ์ํ๋ ์ ์ง๋ณด์: ์คํ์ผ ๋ณ๊ฒฝ์ ์ํฅ์ด ์ ์๋ ๋ฒ์๋ก ์ ํ๋๋ฏ๋ก CSS ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ดํดํ๊ณ ์์ ํ ์ ์์ต๋๋ค. ์ด๋ ์๋ํ์ง ์์ ๋ถ์์ฉ์ ๊ฐ๋ฅ์ฑ์ ์ค์ด๊ณ ๋๋ฒ๊น ์ ๋ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
- ํ์ : ๊ฐ ๊ฐ๋ฐ์๊ฐ ๋ค๋ฅธ ์ฌ๋์ ์คํ์ผ์ ๋ฐฉํดํ ๊ฑฑ์ ์์ด ์์ ์ ์ปดํฌ๋ํธ ์์ ์ ํ ์ ์์ผ๋ฏ๋ก ๊ฐ๋ฐ์ ๊ฐ์ ๋ ๋์ ํ์ ์ ์ด์งํฉ๋๋ค. ์ด๋ ๋ณต์กํ ํ๋ก์ ํธ์์ ๋๊ท๋ชจ ํ์ผ๋ก ์์ ํ ๋ ํนํ ์ค์ํฉ๋๋ค.
@scope ์ค์ ํ์ฉ ์์
์ค์ ์๋๋ฆฌ์ค์์ @scope
๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ ์๋์ง ๋ช ๊ฐ์ง ์ค์ฉ์ ์ธ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์์ 1: ๋ด๋น๊ฒ์ด์ ๋ฉ๋ด ์คํ์ผ๋ง
ํ์ด์ง์ ๋ค๋ฅธ ์์์ ๋
๋ฆฝ์ ์ผ๋ก ์คํ์ผ์ ์ง์ ํ๊ณ ์ถ์ ๋ด๋น๊ฒ์ด์
๋ฉ๋ด๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. @scope
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ด์ ์คํ์ผ์ ์บก์ํํ ์ ์์ต๋๋ค:
HTML:
<nav id="main-nav">
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Services</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
CSS:
@scope (#main-nav) {
ul {
list-style: none;
padding: 0;
margin: 0;
display: flex;
}
li {
margin-right: 20px;
}
a {
text-decoration: none;
color: #333;
font-weight: bold;
}
a:hover {
color: #007bff;
}
}
์ด ์์ ์์ ๋ด๋น๊ฒ์ด์
๋ฉ๋ด์ ์คํ์ผ์ <nav id="main-nav">
์์๋ก ๋ฒ์๊ฐ ์ง์ ๋ฉ๋๋ค. ์ด๋ ๋ฉ๋ด ์คํ์ผ๋ง์ด ํ์ด์ง์ ๋ค๋ฅธ <ul>
, <li>
๋๋ <a>
์์์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
์์ 2: ๋ชจ๋ฌ ๋ํ์์ ์คํ์ผ๋ง
๋ชจ๋ฌ์ ์น ์ ํ๋ฆฌ์ผ์ด์
์์ ์ ๋ณด๋ฅผ ํ์ํ๊ฑฐ๋ ์ฌ์ฉ์ ์
๋ ฅ์ ์์งํ๋ ๋ฐ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค. @scope
๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ๋ณธ ํ์ด์ง์ ์คํ์ผ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ๋ชจ๋ฌ์ ์คํ์ผ์ ์ง์ ํ ์ ์์ต๋๋ค:
HTML: <div id="my-modal" class="modal"> <div class="modal-content"> <span class="close">×</span> <h2>Modal Title</h2> <p>This is the content of the modal.</p> </div> </div>
CSS:
@scope (#my-modal) {
.modal {
display: block; /* ๋๋ ์ค์ ์ ๋ ฌ์ ์ํด 'flex' */
position: fixed;
z-index: 1;
left: 0;
top: 0;
width: 100%;
height: 100%;
overflow: auto;
background-color: rgba(0, 0, 0, 0.4);
}
.modal-content {
background-color: #fefefe;
margin: 15% auto;
padding: 20px;
border: 1px solid #888;
width: 80%;
}
.close {
color: #aaa;
float: right;
font-size: 28px;
font-weight: bold;
}
.close:hover,
.close:focus {
color: black;
text-decoration: none;
cursor: pointer;
}
}
์ฌ๊ธฐ์ ๋ชจ๋ฌ์ ์คํ์ผ์ <div id="my-modal">
์์๋ก ๋ฒ์๊ฐ ์ง์ ๋ฉ๋๋ค. ์ด๋ ๋ชจ๋ฌ์ ์คํ์ผ๋ง์ด ํ์ด์ง์ ๋ค๋ฅธ ์์ ์คํ์ผ๋ง๊ณผ ์๋ก ๊ฐ์ญํ์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
์์ 3: ์๋ํํฐ ์์ ฏ ์คํ์ผ๋ง
์๋ํํฐ ์์ ฏ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์๋ฒ ๋ํ ๋, ์ข
์ข
์์ฒด CSS์์ ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด ํด๋น ์คํ์ผ์ ๋ถ๋ฆฌํ๊ณ ์ถ์ ๊ฒ์
๋๋ค. @scope
๋ ์ด๋ฅผ ์ฝ๊ฒ ๋ง๋ญ๋๋ค:
<div id="calendar-widget">
๋ด์ ๋ ๋๋ง๋๋ ์บ๋ฆฐ๋ ์์ ฏ์ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค. ์์ ฏ์ ์คํ์ผ ๋ฒ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ง์ ํ ์ ์์ต๋๋ค:
@scope (#calendar-widget) {
/* ์บ๋ฆฐ๋ ์์ ฏ์๋ง ํด๋นํ๋ ์คํ์ผ */
.calendar {
width: 300px;
border: 1px solid #ccc;
}
.calendar-header {
background-color: #eee;
padding: 10px;
text-align: center;
}
.calendar-day {
padding: 5px;
text-align: center;
}
}
์ด๋ @scope
๋ธ๋ก ๋ด์ ์ ์๋ ์คํ์ผ์ด <div id="calendar-widget">
๋ด์ ์์์๋ง ์ํฅ์ ๋ฏธ์น๋๋ก ํ์ฌ, ์ ํ๋ฆฌ์ผ์ด์
์ ๋๋จธ์ง ๋ถ๋ถ์ ์๋ํ์ง ์์ ๋ถ์์ฉ์ด ๋ฐ์ํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
@scope์ ๋ค๋ฅธ CSS ์บก์ํ ๊ธฐ๋ฒ ๋น๊ต
@scope
๊ฐ ๋ฒ์ ์ง์ ์คํ์ผ๋ง์ ์ํ ๋ค์ดํฐ๋ธ CSS ์๋ฃจ์
์ ์ ๊ณตํ๋ ๋ฐ๋ฉด, CSS ๋ชจ๋ ๋ฐ Shadow DOM๊ณผ ๊ฐ์ ๋ค๋ฅธ ๊ธฐ์ ๋ค๋ ๋น์ทํ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด ์ฌ์ฉ๋์ด ์์ต๋๋ค. ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์๋ค์ ๋น๊ตํด ๋ณด๊ฒ ์ต๋๋ค:
CSS ๋ชจ๋
CSS ๋ชจ๋์ ๋ชจ๋ํ CSS์ ๋ํ ์ธ๊ธฐ ์๋ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. ๋น๋ ๊ณผ์ ์์ CSS ํด๋์ค ์ด๋ฆ์ ๊ณ ์ ํ ๋ก์ปฌ ๋ฒ์์ ์ด๋ฆ์ผ๋ก ๋ณํํ์ฌ ์๋ํฉ๋๋ค. ์ด๋ ํด๋์ค ์ด๋ฆ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ ์คํ์ผ์ด ๊ฐ๋ณ ์ปดํฌ๋ํธ ๋ด์ ์บก์ํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
์ฅ์ :
- ๋น๋ ๋๊ตฌ ๋ฐ ํ๋ ์์ํฌ์์ ๋๋ฆฌ ์ง์๋ฉ๋๋ค.
- ๊ธฐ์กด ํ๋ก์ ํธ์ ์ฌ์ฉํ๊ณ ํตํฉํ๊ธฐ ๊ฐ๋จํฉ๋๋ค.
๋จ์ :
- ๋น๋ ๊ณผ์ ์ด ํ์ํฉ๋๋ค.
- ๋ฒ์ ์ง์ ์ ๊ฐ์ ํ๊ธฐ ์ํด ๋ช ๋ช ๊ท์น๊ณผ ๋๊ตฌ์ ์์กดํฉ๋๋ค.
Shadow DOM
Shadow DOM์ ์คํ์ผ์ ํฌํจํ์ฌ ๋ฌธ์ ํธ๋ฆฌ์ ์ผ๋ถ๋ฅผ ์บก์ํํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ์๋์ฐ ํธ๋ฆฌ์ ์ฃผ ๋ฌธ์ ์ฌ์ด์ ๊ฒฝ๊ณ๋ฅผ ๋ง๋ค์ด ์คํ์ผ์ด ์ํ์ผ๋ก ์์ด ๋๊ฐ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
์ฅ์ :
- ๊ฐ๋ ฅํ ์คํ์ผ ๊ฒฉ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ฌ์ฉ์ ์ ์ ์์ ๋ฐ ์น ์ปดํฌ๋ํธ๋ฅผ ์ง์ํฉ๋๋ค.
๋จ์ :
- ์ฌ์ฉํ๊ธฐ ๋ณต์กํ ์ ์์ต๋๋ค.
- ๊ธฐ์กด ์ฝ๋๋ฅผ ์๋นํ ๋ณ๊ฒฝํด์ผ ํ ์ ์์ต๋๋ค.
- CSS ๋ชจ๋๋งํผ ๋๋ฆฌ ์ง์๋์ง ์์ต๋๋ค.
@scope
@scope
๋ CSS ๋ชจ๋๊ณผ Shadow DOM ์ฌ์ด์ ์ค๊ฐ ์ง์ ์ ์ ๊ณตํฉ๋๋ค. ๋น๋ ๊ณผ์ ์ด๋ ๋ณต์กํ DOM ์กฐ์ ์์ด ๋ฒ์ ์ง์ ์คํ์ผ๋ง์ ์ํ ๋ค์ดํฐ๋ธ CSS ์๋ฃจ์
์ ์ ๊ณตํฉ๋๋ค.
์ฅ์ :
- ๋ค์ดํฐ๋ธ CSS ์๋ฃจ์ ์ ๋๋ค.
- ๋น๋ ๊ณผ์ ์ด ํ์ ์์ต๋๋ค.
- ๋น๊ต์ ์ฌ์ฉํ๊ธฐ ๊ฐ๋จํฉ๋๋ค.
๋จ์ :
- ๋ธ๋ผ์ฐ์ ์ง์์ด ์์ง ๋ฐ์ ์ค์ ๋๋ค.
- Shadow DOM๋งํผ ๊ฐ๋ ฅํ ๊ฒฉ๋ฆฌ๋ฅผ ์ ๊ณตํ์ง ์์ ์ ์์ต๋๋ค.
์ด๋ค ๊ธฐ์ ์ ์ฌ์ฉํ ์ง๋ ํน์ ์๊ตฌ ์ฌํญ๊ณผ ํ๋ก์ ํธ ์๊ฑด์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. ๊ฐ๋ ฅํ ์คํ์ผ ๊ฒฉ๋ฆฌ๊ฐ ํ์ํ๊ณ ์น ์ปดํฌ๋ํธ๋ก ์์
ํ๋ ๊ฒฝ์ฐ Shadow DOM์ด ์ต์ ์ ์ ํ์ผ ์ ์์ต๋๋ค. ๊ฐ๋จํ๊ณ ๋๋ฆฌ ์ง์๋๋ ์๋ฃจ์
์ด ํ์ํ๋ค๋ฉด CSS ๋ชจ๋์ด ๋ ๋์ ์ต์
์ผ ์ ์์ต๋๋ค. ๋น๋ ๊ณผ์ ์ด ํ์ ์๋ ๋ค์ดํฐ๋ธ CSS ์๋ฃจ์
์ ์ ํธํ๋ค๋ฉด @scope
๋ฅผ ๊ณ ๋ คํด ๋ณผ ๊ฐ์น๊ฐ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ์ง์ ๋ฐ ํด๋ฆฌํ
2024๋
ํ๋ฐ ๊ธฐ์ค์ผ๋ก @scope
์ ๋ํ ๋ธ๋ผ์ฐ์ ์ง์์ ์ฆ๊ฐํ๊ณ ์์ง๋ง, ์์ง ๋ณดํธ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ์ง๋ ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ํธํ์ฑ์ ๋ํ ์ต์ ์ ๋ณด๋ Can I use์์ ํ์ธํ์ธ์.
์ด์ ๋ฒ์ ์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ง์ํด์ผ ํ๋ ๊ฒฝ์ฐ, ํด๋ฆฌํ์ ์ฌ์ฉํ์ฌ @scope
๊ธฐ๋ฅ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ฌ๋ฌ ํด๋ฆฌํ์ด ์์ผ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ๋น๋ ๊ณผ์ ์์ @scope
๊ท์น์ ๋๋ฑํ CSS ์ ํ์๋ก ๋ณํํ์ฌ ์๋ํฉ๋๋ค.
@scope ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
@scope
๋ฅผ ์ต๋ํ ํ์ฉํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ธ์:
- ์๋ฏธ ์๋ ์ ํ์ ์ฌ์ฉ: ์คํ์ผ์ ๋ฒ์๋ฅผ ์ ํํ๊ฒ ๋ํ๋ด๋ ์ ํ์๋ฅผ ์ ํํ์ธ์. ์๋ํ์ง ์์ ๋ถ์์ฉ์ ์ ๋ฐํ ์ ์๋ ์ง๋์น๊ฒ ์ผ๋ฐ์ ์ธ ์ ํ์๋ ํผํ์ธ์.
- ๋ฒ์๋ฅผ ์๊ฒ ์ ์ง: ์คํ์ผ์ ๋ฒ์๋ฅผ ๊ฐ๋ฅํ ๊ฐ์ฅ ์์ ์์ญ์ผ๋ก ์ ํํ์ธ์. ์ด๋ CSS์ ์ ์ง๋ณด์์ฑ๊ณผ ์์ธก ๊ฐ๋ฅ์ฑ์ ํฅ์์ํฌ ๊ฒ์ ๋๋ค.
- ๊ณผ๋ํ ๋ฒ์ ์ค์ฒฉ ํผํ๊ธฐ: ๋ฒ์ ์ค์ฒฉ์ด ๊ฐ๋ฅํ์ง๋ง, CSS๋ฅผ ๋ ๋ณต์กํ๊ณ ์ดํดํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ค์ฒฉ์ ๋๋ฌผ๊ฒ ๊ทธ๋ฆฌ๊ณ ํ์ํ ๋๋ง ์ฌ์ฉํ์ธ์.
- ๋ฒ์ ๋ฌธ์ํ: ๊ฐ
@scope
๋ธ๋ก์ ๋ชฉ์ ๊ณผ ๋ฒ์๋ฅผ ์ค๋ช ํ๋ ์ฃผ์์ CSS์ ์ถ๊ฐํ์ธ์. ์ด๋ ๋ค๋ฅธ ๊ฐ๋ฐ์(๊ทธ๋ฆฌ๊ณ ๋ฏธ๋์ ๋น์ )๊ฐ ์ฝ๋๋ฅผ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค. - ์ฒ ์ ํ ํ ์คํธ: ๋ค์ํ ๋ธ๋ผ์ฐ์ ์ ์ฅ์น์์ CSS๋ฅผ ํ ์คํธํ์ฌ ์คํ์ผ์ด ์์๋๋ก ์๋ํ๋์ง ํ์ธํ์ธ์.
CSS ๋ฒ์ ์ง์ ์ ๋ฏธ๋
@scope
์ ๋์
์ CSS ์งํ์ ์ค์ํ ์ง์ ์ ์๋ฏธํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์ง์์ด ๊ณ์ํด์ ํฅ์๋จ์ ๋ฐ๋ผ @scope
๋ ์น ๊ฐ๋ฐ์์ CSS ๋ณต์ก์ฑ์ ๊ด๋ฆฌํ๊ณ ๋ชจ๋์ฑ์ ์ด์งํ๋ ํ์ค ๋๊ตฌ๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. CSS ์ํน ๊ทธ๋ฃน์ด ์น์ ์คํ์ผ๋ง ๊ธฐ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํ ์๋ก์ด ๋ฐฉ๋ฒ์ ๊ณ์ ํ์ํจ์ ๋ฐ๋ผ, ์์ผ๋ก @scope
@๊ท์น์ ๋ํ ์ถ๊ฐ์ ์ธ ๊ฐ์ ๊ณผ ํ์ฅ์ ๊ธฐ๋ํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
@scope
@๊ท์น์ CSS์์ ๋ฒ์ ์ง์ ์คํ์ผ๋ง์ ์ ์ํ๋ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋ฌธ์์ ํน์ ์์ญ ๋ด์ ์คํ์ผ์ ์บก์ํํจ์ผ๋ก์จ CSS ์ฝ๋์ ์ ์ง๋ณด์์ฑ, ์์ธก ๊ฐ๋ฅ์ฑ ๋ฐ ์ฌ์ฌ์ฉ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ์ง์์ด ์์ง ๋ฐ์ ์ค์ด์ง๋ง, @scope
๋ ํ๋ ์น ๊ฐ๋ฐ, ํนํ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ํคํ
์ฒ์ ํฌ๊ณ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ด ๊ณ ๋ คํด ๋ณผ ๋งํ ๊ท์คํ ๋๊ตฌ์
๋๋ค. @scope
์ ํ์ ๋ฐ์๋ค์ด๊ณ CSS ์คํ์ผ์ํธ์ ๋ํ ์๋ก์ด ์ฐจ์์ ์ ์ด๋ ฅ์ ๋ฐํํด ๋ณด์ธ์.
์ด CSS @scope
ํ๊ตฌ๋ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ด ํ๋ก์ ํธ์์ ์ด ๊ธฐ๋ฅ์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ ์ ์๋๋ก ํฌ๊ด์ ์ธ ์ดํด๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ๊ตฌ๋ฌธ, ์ด์ ๋ฐ ์ค์ ์์ ๋ฅผ ์ดํดํจ์ผ๋ก์จ ๋ค์ํ ๋ฐฐ๊ฒฝ์ ๊ฐ๋ฐ์๋ค์ ์์ ์ CSS ์ํคํ
์ฒ๋ฅผ ๊ฐ์ ํ๊ณ ๋ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๋ฉฐ ํ์ฅ ๊ฐ๋ฅํ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค ์ ์์ต๋๋ค.