Using CSS nesting
CSS ì¤ì²© 모ëì ì¤íì¼ìí¸ì ê°ë ì±ì ëì´ê³ 모ëííë©° ê·¸ë¦¬ê³ ì ì§ ë³´ìí기 ì©ì´íê² ë§ëëë¤. ì íì를 ë°ë³µíì¬ ìì±íì§ ììë ëê³ , ì´ë¡ ì¸í´ íì¼ í¬ê¸°ë ì¤ì´ë¤ ì ììµëë¤.
CSS ì¤ì²©ì Sass ì ê°ì CSS ì ì²ë¦¬ê¸°ìë ë¤ë¦
ëë¤. CSS ì ì²ë¦¬ê¸°ë ì¬ì ì ì»´íì¼ëì§ë§, CSS ì¤ì²©ì ë¸ë¼ì°ì ì ìí´ íì±ë©ëë¤. ëí CSS ì¤ì²©ììë, & ì¤ì²© ì íìì ëª
ìëë :is() í¨ìì ì ì¬íë©°, ê´ë ¨ ì íì 목ë¡ê³¼ ì°ê´ìì ê°ì¥ ëì ëª
ìë를 ì´ì©íì¬ ê³ì°í©ëë¤.
ì´ ìë´ìë CSS ìì ì¤ì²©ì ì¬ì©íë ê°ê¸° ë¤ë¥¸ ë°©ë²ì ëí´ ì¤ëª í©ëë¤.
ìì ì íì
CSS ì¤ì²©ì ì¬ì©íë©´ ë¶ëª¨ì ìì ì íì를 ìì±í ì ìëë°, ì´ê²ì ì´ì©íì¬ í¹ì ë¶ëª¨ì ìì ìì를 íê²í
í ì ììµëë¤. ì´ë & ì¤ì²© ì íì 를 ì¬ì©íë ê²½ì°ì ì¬ì©íì§ ìë ê²½ì°ìë ê°ë¥í©ëë¤.
& ì¤ì²© ì íì ì¬ì©ì´ íìì ì´ê±°ë ëìì´ ëë í¹ìí ì¸ì¤í´ì¤ë¤ì´ ììµëë¤.
- ê²°í© ì íìë¤ í¹ì ê°ìì í´ëì¤ ì ê°ì´ ì íìë¤ì í¨ê» ì¬ì©í ë.
- ìí¸íì±ì ê³ ë ¤í ë.
- ê°ë
ì±ì ìí ìê°ì íìë¡ì¨,
&ì¤ì²© ì íì를 ë³´ë ê²ì²ë¼ CSS ì¤ì²©ì´ ì¬ì©ëê³ ììì ííí ë.
/* ì¤ì²© ì íì를 ì¬ì©íë ê²½ì° */
parent {
/* ë¶ëª¨ ì¤íì¼ */
child {
/* ë¶ëª¨ì ìì ì¤íì¼ */
}
}
/* ì¤ì²© ì íì를 ì¬ì©íì§ ìë ê²½ì° */
parent {
/* ë¶ëª¨ ì¤íì¼ */
& child {
/* ë¶ëª¨ì ìì ì¤íì¼ */
}
}
/* ë¸ë¼ì°ì ë ì ë ë°©ë²ì ê°ê° ìë ììì²ë¼ íì±í©ëë¤. */
parent {
/* ë¶ëª¨ ì¤íì¼ */
}
parent child {
/* ë¶ëª¨ì ìì ì¤íì¼ */
}
ìì
ìë ìì ë¤ììë, & ì¤ì²© ì íì를 ì¬ì©íë ê²½ì° íë, ê·¸ë¦¬ê³ ë¤ë¥¸ íëë ì¬ì©íì§ ìë ê²½ì°ë¡ì¨, <label> ê³¼ <input> ì´ íì ììì¼ ëì <label> ë´ë¶ì <input> ì´ ìë ê²½ì°ê° ì´ë»ê² ë¤ë¥´ê² ì¤íì¼ëëì§ íì¸í ì ììµëë¤. ì´ë & ì¤ì²© ì íì를 ìëµíì ëì ìí¥ì ë³´ì¬ì¤ëë¤.
ì°¸ê³ :
ì´ ìì ë 본ëì ëª
ì¸ì를 구íí ë¸ë¼ì°ì ì íì¬ì ì¤ì²© ëª
ì¸ë¥¼ 구íí ë¸ë¼ì°ì ììì ë¤ë¥¸ 결과를 ë³´ì¬ì¤ëë¤. 2023ë
8ì ì´ì ì í¬ë¡¬ í¹ì ì¬í리ìì 구íë ëª
ì¸ììë & ì¤ì²© ì íì를 íìë¡ íìµëë¤. íì¬ì ëª
ì¸ë¥¼ ì§ìíë ë¸ë¼ì°ì ë¼ë©´ ë ê°ì§ ìì 모ëìì ëë²ì§¸ ìì ì ëì¼í 결과를 ë³´ì¬ì¤ëë¤.
ì¤ì²© ì íì를 ì¬ì©íì§ ìë ê²½ì°
HTML
<form>
<label for="name">Name:
<input type="text" id="name" />
</label>
<label for="email">email:</label>
<input type="text" id="email" />
</form>
CSS
input {
/* label ì¸ë¶ì ìë input ì ìí ì¤íì¼ */
border: tomato 2px solid;
}
label {
/* label ì ìí ì¤íì¼ */
font-family: system-ui;
font-size: 1.25rem;
input {
/* label ë´ë¶ì ìë input ì ìí ì¤íì¼ */
border: blue 2px dashed;
}
}
ê²°ê³¼
ì¤ì²© ì íì를 ì¬ì©íë ê²½ì°
HTML
<form>
<label for="name">Name:
<input type="text" id="name" />
</label>
<label for="email">email:</label>
<input type="text" id="email" />
</form>
CSS
input {
/* label ì¸ë¶ì ìë input ì ìí ì¤íì¼ */
border: tomato 2px solid;
}
label {
/* label ì ìí ì¤íì¼ */
font-family: system-ui;
font-size: 1.25rem;
& input {
/* label ë´ë¶ì ìë input ì ìí ì¤íì¼ */
border: blue 2px dashed;
}
}
ê²°ê³¼
ê²°í©ì
CSS ê²°í©ì ìì & ì¤ì²© ì íìê° ì¬ì©ëê±°ë ì¬ì©ëì§ ìì ì ììµëë¤.
ìì
íì ê²°í©ìì ì¤ì²©
ì´ ìì ììë, ê° <h2> ë¤ ì²«ë²ì§¸ ë¨ë½ì´ CSS ì¤ì²©ì ì¸ì íì ê²°í©ì (+) ë¡ íê²í
ë©ëë¤.
HTML
<h2>Heading</h2>
<p>첫ë²ì§¸ ë¨ë½ì
ëë¤.</p>
<p>ëë²ì§¸ ë¨ë½ì
ëë¤.</p>
CSS
h2 {
color: tomato;
+ p {
color: white;
background-color: black;
}
}
/* ì´ ì½ëë & ì¤ì²© ì íì를 ì´ì©íì¬ ìì±í ìë ììµëë¤. */
/*
h2 {
color: tomato;
& + p {
color: white;
background-color: black;
}
}
*/
ê²°ê³¼
ê²°í© ì íì
ì¤ì²© CSS ì ê²°í© ì íì 를 ì¬ì©í ëìë & ì¤ì²© ì íì를 ë°ëì ì¬ì©í´ì¼ í©ëë¤. ì´ë ë¸ë¼ì°ì ê° & ì¤ì²© ì íì를 ì¬ì©íì§ ìë ê²½ì°ì ìëì¼ë¡ ì íìë¤ ì¬ì´ì 공백ì ì½ì
í기 ë문ì
ëë¤.
class="a b" 를 ê°ì§ ìì를 íê²í기 ìí´ìë & ì¤ì²© ì íìê° íìíë°, ì´ë¥¼ ì¬ì©íì§ ìì¼ë©´ ê³µë°±ì´ ê²°í© ì íì를 ëì´ë²ë¦½ëë¤.
.a {
/* class="a" 를 ê°ì§ ìì를 ìí ì¤íì¼ */
.b {
/* class="a"ì ììì¸ class="b" ììì ëí ì¤íì¼ */
}
&.b {
/* class="a b" 를 ê°ì§ ìì를 ìí ì¤íì¼ */
}
}
/* ë¸ë¼ì°ì ë ë¤ìê³¼ ê°ì´ íì±í©ëë¤. */
.a {
/* class="a" 를 ê°ì§ ìì를 ìí ì¤íì¼ */
}
.a .b {
/* class="a"ì ììì¸ class="b" ììì ëí ì¤íì¼ */
}
.a.b {
/* class="a b" 를 ê°ì§ ìì를 ìí ì¤íì¼ */
}
ìì
ì¤ì²©ê³¼ ê²°í© ì íìë¤
ì´ ìì ìì & ì¤ì²© ì íìë ë¤ì¤ í´ëì¤ë¥¼ ê°ì§ ìì를 ì¤íì¼íë ê²°í© ì íì를 ìì±í기 ìí´ ì¬ì©ëììµëë¤.
HTML
<div class="notices">
<div class="notice">
<h2 class="notice-heading">Notice</h2>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit.</p>
</div>
<div class="notice warning">
<h2 class="warning-heading">Warning</h2>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit.</p>
</div>
<div class="notice success">
<h2 class="success-heading">Success</h2>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit.</p>
</div>
</div>
CSS
flexbox layout 를 íì©íì¬ íì ìì±í기 ìí´ .notices ì ì¤íì¼ì ì ì©í©ëë¤.
.notices {
display: flex;
flex-direction: column;
gap: 0.5rem;
width: 90%;
margin: auto;
}
ìë CSS ì½ëììë, ì¤ì²©ì & 를 ì¬ì©íê±°ë ì¬ì©íì§ ìë ê²½ì° ëª¨ëì ê²°í© ì íì를 ìì±í기 ìí´ ì¬ì©ëììµëë¤. ìµìì ë 벨ì ì íìë class="notice" 를 ê°ì§ ììì 기본ì ì¸ ì¤íì¼ì ì ìí©ëë¤. & ì¤ì²© ì íìë class="notice warning" 를 ê°ì§ ìì í¹ì class="notice success" 를 ê°ì§ ììë¤ì ê²°í© ì íì를 ìì±í기 ìí´ ì¬ì©ëììµëë¤. ì¶ê°ì ì¼ë¡, & 를 ëª
ìì ì¼ë¡ ì¬ì©íì§ ìê³ ì¤ì²©ì ì´ì©í ê²°í© ì íì를 ìì±íë .notice .notice-heading::before ì íìë íì¸í ì ììµëë¤.
.notice {
width: 90%;
justify-content: center;
border-radius: 1rem;
border: black solid 2px;
background-color: #ffc107;
color: black;
padding: 1rem;
.notice-heading::before {
/* `.notice .notice-heading::before` ì ëì¼í©ëë¤. */
content: "â¹ï¸ ";
}
&.warning {
/* equivalent to `.notice.warning` */
background-color: #d81b60;
border-color: #d81b60;
color: white;
.warning-heading::before {
/* `.notice.warning .warning-heading::before` ì ëì¼í©ëë¤. */
content: "! ";
}
}
&.success {
/* `.notice.success` ì ëì¼í©ëë¤. */
background-color: #004d40;
border-color: #004d40;
color: white;
.success-heading::before {
/* `.notice.success .success-heading::before` ì ëì¼í©ëë¤. */
content: "â ";
}
}
}
ê²°ê³¼
ì¶ê°ë ì¤ì²© ì íì
& ì¤ì²© ì íìë ì¤ì²©ë ì íìì ì¶ê°ë ì ìì¼ë©°, ì´ë ë§¥ë½ì ë°ëë¡ íë í¨ê³¼ë¥¼ ë¶ì¬í©ëë¤.
ì´ë ë¶ëª¨ ììì ë¤ë¥¸ í´ëì¤ê° ë¶ì¬ë ë ìì ììì ì¤íì¼ì´ ë³ê²½ëë ê²½ì°ì ì ì©íê² ì¬ì©í ì ììµëë¤.
<div>
<span class="foo">text</span>
</div>
ìì ëì¡°íì¬,
<div class="bar">
<span class="foo">text</span>
</div>
.foo {
/* .foo ì¤íì¼ */
.bar & {
/* .bar .foo ì¤íì¼ */
}
}
ê²°ê³¼
ì¤ì²© ì íì ì¶ê°í기
ì´ ìì ììë 3ê°ì ì¹´ëê° ìê³ , ê·¸ ì¤ íëë í¹ìì´ ìë ì¹´ëì
ëë¤. ì´ ì¹´ëë¤ì 모ë ìë²½í ëì¼íì§ë§, í¹ì ì¹´ëì ì 목ì ë¤ë¥¸ ììì ê°ì§ê³ ììµëë¤. & ì¤ì²© ì íì를 ì¶ê°í¨ì¼ë¡ì¨ h2 ì ì¤íì¼ ë´ë¶ìì .featured .h2 를 ì¬ì©íì¬ ì¤íì¼ì ì¤ì²©í ì ììµëë¤.
HTML
<div class="wrapper">
<article class="card">
<h2>Card 1</h2>
<p>Lorem ipsum dolor, sit amet consectetur adipisicing elit.</p>
</article>
<article class="card featured">
<h2>Card 2</h2>
<p>Lorem ipsum dolor, sit amet consectetur adipisicing elit.</p>
</article>
<article class="card">
<h2>Card 3</h2>
<p>Lorem ipsum dolor, sit amet consectetur adipisicing elit.</p>
</article>
</div>
CSS
.wrapper {
display: flex;
flex-direction: row;
gap: 0.25rem;
font-family: system-ui;
}
ìë CSS ììë, .card ì .card h2 ì ëí ì¤íì¼ì ìì±íììµëë¤. ê·¸ë¦¬ê³ h2 ì¤íì¼ ë¸ë¡ ë´ììë & ì¤ì²© ì íìê° ì¶ê°ë .featured í´ëì¤ë¥¼ ì¤ì²©íì¬ .card :is(.featured h2) ì ëí ì¤íì¼ì ìì±íëë°, ì´ë :is(.card h2):is(.featured h2) ì ëì¼í©ëë¤.
.card {
padding: 0.5rem;
border: 1px solid black;
border-radius: 0.5rem;
& h2 {
/* `.card h2` ì ëì¼í©ëë¤. */
color: slateblue;
.featured & {
/* `:is(.card h2):is(.featured h2)` ì ëì¼í©ëë¤. */
color: tomato;
}
}
}
ê²°ê³¼
ì°ì (ë¶ê°ë¥)
Sass ì ê°ì CSS ì ì²ë¦¬ê¸°ììë ì¤ì²©ì íì©í´ 문ìì´ë¼ë¦¬ ì°ê²°íì¬ ìë¡ì´ í´ëì¤ë¤ì ë§ëë ê²ì´ ê°ë¥í©ëë¤. ì´ë BEM ì ê°ì CSS ë°©ë²ë¡ ìì íí ì¼ì ëë¤.
.component {
&__child-element {
}
}
/* In Sass this becomes */
.component__child-element {
}
ê²½ê³ ì´ê²ì CSS ì¤ì²©ììë ë¶ê°ë¥í ì¼ì ëë¤. ê²°í©ìê° ì¬ì©ëì§ ìëë¤ë©´ ì¤ì²© ì íìë íì ì íì ì²ë¼ ì·¨ê¸ë©ëë¤. 문ìì´ ì°ì를 íì©íë©´ ì´ë ëê¸°ê² ë©ëë¤.
ê±¸í© ì íì ììë, íì
ì íìê° ê°ì¥ ì²ìì¼ë¡ ìì¹í´ì¼ í©ëë¤. (íì
ì íìì¸) &Element 를 ì¬ì©íë ê²ì CSS ì íì ë¿ë§ ìëë¼, ì ì²´ ì íì ë¸ë¡ì 무í¨ë¡ ë§ëëë¤. íì
ì íìê° ê°ì¥ 먼ì ìì¹í¨ì ë°ë¼ ê²°í© ì íìë Element& ë¡ ìì±ëì´ì¼ë§ í©ëë¤.
.my-class {
element& {
}
}
/* ë¸ë¼ì°ì ë ì´ê²ì ê²°í© ì íìê° ëëë¡ íì±í©ëë¤. */
.my-class {
}
element.my-class {
}
무í¨í ì¤ì²© ì¤íì¼ ê·ì¹
ì¤ì²©ë CSS ê·ì¹ì´ 무í¨í ê²½ì°, í´ë¹ ê·ì¹ì í¬í¨ëì´ ìë 모ë ì¤íì¼ë¤ì´ 무ìë©ëë¤. ì´ë ë¶ëª¨ë ì´ì ê·ì¹ë¤ìë ìí¥ì 미ì¹ì§ ììµëë¤.
ë¤ì ìì ììë, ì í¨íì§ ìì ì íì (% ë ì íìë¡ ì¬ì©ë기ì ì í¨íì§ ìì 문ì) ê° ììµëë¤. ì´ ì íì를 í¬í¨íë ê·ì¹ì 무ìëì§ë§, ì´í ì í¨í ê·ì¹ë¤ì 무ìëì§ ììµëë¤.
.parent {
/* .parent ì¤íì¼ì ì í¨í©ëë¤. */
& %invalid {
/* 무í¨í %invalid ì¤íì¼ë¤ì 무ìë©ëë¤. */
}
& .valid {
/* .parent .valid ì¤íì¼ì ì í¨í©ëë¤. */
}
}