๐ŸŽจ CSS์˜ Nesting์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ

๊น€๋ฏผ์ค€ยท2024๋…„ 8์›” 29์ผ

CSS

๋ชฉ๋ก ๋ณด๊ธฐ
1/4

ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋ฒ„ํŠผ ๋น„ํ™œ์„ฑํ™” ์‹œ css๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•˜๋ ค๊ณ  ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ์กด์˜ ๋ฐฉ์‹์œผ๋กœ ์ ์šฉํ•˜๋‹ˆ๊นŒ ์ œ๋Œ€๋กœ ์ž‘๋™์ด ์•ˆํ–ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด css์„ ํƒ์ž์™€ ๊ฒฐํ•ฉ์ž์˜ ์ดํ•ด๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ๊ธ€์„ ์ •๋ฆฌํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

๐Ÿ‘‰ ์ด์ •๋ฆฌ

// ๊ธฐ๋ณธ 
๐ŸŽˆ Type Selector  ํƒœ๊ทธ ์ž์ฒด๋ฅผ ์„ ํƒ
	p { }

๐ŸŽˆ Class Selector : ์ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ์„ ํƒ
	.title { }

๐ŸŽˆ ID Selector : #์œผ๋กœ ์„ ํƒ
	#title { }

๐ŸŽˆ Attribute Selector : ์†์„ฑ์„ ๊ฐ€์ง„ ๋ชจ๋“  ํƒœ๊ทธ๋ฅผ ์„ ํƒ
	a[taeget]  { }
	input[type="text"] { }

๐ŸŽˆ Pseudo Class : ํŠน์ • ์ƒํƒœ์— ์ ์šฉ
	a:hover { }
	li:nth-child(odd) { }

๐ŸŽˆ Child Combinator : ์ง์†์ž์‹์„ > ๋กœ ์„ ํƒ
	parent > child { }

๐ŸŽˆ Descendant Combinator : ํ›„์†์„ ์„ ํƒ
	ancestor descendant { }

๐ŸŽˆ  CSS Nesting 
  	nav
	&. light     - ๊ฐ™์€ ํ˜•์ œ ์„ ํƒ
	> li          - ์ž์‹ ์„ ํƒ
 	&:	  - ๊ฐ™์€ ํ˜•์ œ + Pseudo

๐Ÿ‘‰ CSS ๊ธฐ๋ณธ ์„ ํƒ์ž

๐ŸŽˆ Type Selector

ํƒœ๊ทธ ์ž์ฒด๋ฅผ ์„ ํƒํ•ด์„œ HTML๋ฌธ์„œ ๋‚ด ๋ชจ๋“  ๊ฐ™์€ ํƒœ๊ทธ์— ์ ์šฉ์‹œํ‚ค๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

p {
	color : red
}

strong {
	font-weight: 500
}

๐ŸŽˆ Class Selector

์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ ํ‘œ๊ธฐ๋กœ ๋Œ€์ƒ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

.error {
  color: red;
}

๐ŸŽˆ ID Selector

Dom์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค

#title {
  color: red;
}

๐Ÿ‘‰ CSS ์‹ฌํ™” ์„ ํƒ์ž

๐ŸŽˆ Attribute Selector

(= ์†์„ฑ ์„ ํƒ์ž)

ํƒœ๊ทธ ๋’ค์— [ ] ์•ˆ์—๋‹ค๊ฐ€ ์†์„ฑ ๊ฐ’์„ ์ž…๋ ฅํ•ด์„œ ์„ฌ์„ธํ•œ ์Šคํƒ€์ผ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[] ์•ˆ์— ์†์„ฑ๋ช…๋งŒ ์ž…๋ ฅ ์‹œ, ํ•ด๋‹น ์†์„ฑ์ด ์žˆ๋Š” ๋ชจ๋“  ์š”์†Œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

a[target] {
  color : red
}

[] ์•ˆ์— ์†์„ฑ๊ฐ’๋„ ์ž…๋ ฅ ์‹œ, ์†์„ฑ๋ช…๊ณผ ์†์„ฑ๊ฐ’์ด ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ์š”์†Œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค
ํƒ€์ž…์ด ๋ฆฌ์…‹์ธ ๋ชจ๋“  ๋ฒ„ํŠผ์„ ์„ ํƒํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค

input[type="text"] {
  background-color: yellow;
}

๐ŸŽˆ Pseudo Class

<a>ํƒœ๊ทธ์˜ ๊ฒฝ์šฐ ๋‹ค์–‘ํ•œ ์ƒํƒœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ๊ฐ์˜ ์ƒํƒœ์— css๋ฅผ ์ ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, Pseudo Class(๊ฐ€์ƒ ํด๋ž˜์Šค)๋ฅผ ์ ์šฉํ•˜๋Š”๊ฒŒ ๋ฐ”๋žŒ์งํ•ฉ๋‹ˆ๋‹ค.
์ƒํƒœ๋กœ๋Š” hover visited focus ๋“ฑ ์ด ์žˆ์Šต๋‹ˆ๋‹ค

// ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค
a:hover {
    color: red;
}

// ์ž…๋ ฅํ•„๋“œ์— ํฌ์ปค์Šค๊ฐ€ ๊ฐ€๋ฉด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
input:focus {
    border-color: blue;
}

์ž์‹์š”์†Œ๋ฅผ ์„ ํƒํ•ด์„œ ์‚ฌ์šฉ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค

// ํ™€์ˆ˜ ๋ฒˆ์งธ li์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค
li:nth-child(odd) {
    background-color: lightgray;
}

// ์ฒซ๋ฒˆ์งธ ์ž์‹(๋ชจ๋“ p)์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค
p:first-child {
    font-weight: bold;
}

// ๋งˆ์ง€๋ง‰ ์ž์‹(๋ชจ๋“ p)์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค
p:last-child {
    font-style: italic;
}

๋ฒ„ํŠผ์—์„œ ์—„์ฒญ ๋งŽ์ด ์“ฐ์ด๋Š” disabled ๋„ ์ˆ˜๋„ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
์•„๋ž˜ ์˜ˆ์‹œ๋Š” ๋น„ํ™œ์„ฑํ™”๋œ ๋ชจ๋“  ๋ฒ„ํŠผ์˜ ์ƒ‰์ƒ์„ ๋ณ€๊ฒฝํ•˜๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค

button:disabled {
    color: gray;
}

์‹ ๊ธฐํ•œ css๋„ ์žˆ๋„ค์š”

// ๋ชจ๋“  pํƒœ๊ทธ ์•ž์— "Note: "๋ฅผ ๋ถ™์ž…๋‹ˆ๋‹ค.
p::before {
    content: "Note: ";
    font-weight: bold;
}

๐ŸŽˆ Universal Selector

์ „์ฒด ์›นํŽ˜์ด์ง€๋ฅผ ์„ ํƒํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋ณดํ†ต reset css ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

* {
  box-sizing: border-box;
}

๐Ÿ‘‰ CSS ๊ฒฐํ•ฉ์ž

์„ ํƒ์ž๋ฅผ ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜ ๊ณจ๋ผ์„œ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•

๐ŸŽˆ Child Combinator

(์ž์‹ ๊ฒฐํ•ฉ์ž)
์ฒซ๋ฒˆ์งธํƒœ๊ทธ ํ•˜์œ„์˜ ์ง์†์ž์‹ ํƒœ๊ทธ๋ฅผ ์„ ํƒํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ๋ถ€๋ชจํƒœ๊ทธ ๋ฐ”๋กœ ๋ฐ‘์˜ ์ž์‹ํƒœ๊ทธ๋งŒ ์„ ํƒํ•˜๊ณ  ๋” ๊นŠ์€ ํ›„์†๋“ค์€ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

parent > child {
/ ์Šคํƒ€์ผ ๊ทœ์น™ /
}

์•„๋ž˜ ์ฝ”๋“œ๋Š”, div ์š”์†Œ์˜ ์ง์† ์ž์‹์ธ ๋ชจ๋“ p ์š”์†Œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

div > p {
    color: green;
}

//์—ฌ๋Ÿฌ๋ฒˆ ๋“ค์–ด๊ฐ€์„œ ๊ตฌ์ฒด์  ์„ ํƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค
.container > section > h2 {
    font-size: 24px;
}

๐ŸŽˆ Descendant Combinator

(์ž์† ๊ฒฐํ•ฉ์ž)
์ฒซ๋ฒˆ์งธ ํƒœ๊ทธ ํ•˜์œ„์˜ ํ›„์† ํƒœ๊ทธ๋ฅผ ์„ ํƒํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ๋ถ€๋ชจํƒœ๊ทธ์˜ ๋ชจ๋“  ๊นŠ์€ ํ›„์†์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

ancestor descendant {
/ ์Šคํƒ€์ผ ๊ทœ์น™ /
}

์•„๋ž˜ ์ฝ”๋“œ๋Š”, divํƒœ๊ทธ ํ›„์†์ธ ๋ชจ๋“  pํƒœ๊ทธ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค (์ž์‹, ํ›„์† ๋ชจ๋‘). ์ฆ‰ div์•„๋ž˜ pํƒœ๊ทธ๊ฐ€ ์žˆ๋‹ค๋ฉด DOMํŠธ๋ฆฌ ์–ด๋””์— ์œ„์น˜ํ•˜๋“  ์Šคํƒ€์ผ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

div p {
    color: blue;
}

๐ŸŽˆ Next-sibling Combinator

(์ธ์ ‘ ํ˜•์ œ ๊ฒฐํ•ฉ์ž)
ํ•ด๋‹น ๊ฒฐํ•ฉ์ž๋Š” ์ฒซ๋ฒˆ์งธ ํƒœ๊ทธ ๋ฐ”๋กœ ์•„๋ž˜ ๋‘๋ฒˆ์งธ ํƒœ๊ทธ๊ฐ€ ์žˆ๋‹ค๋ฉด ์„ ํƒํ•˜๋Š” ๊ฒฐํ•ฉ์ž์ž…๋‹ˆ๋‹ค

์•„๋ž˜ ์ฝ”๋“œ๋Š” <h3> ์š”์†Œ ๋ฐ”๋กœ ๋’ค์— ๋ถ™์–ด์žˆ๋Š” ์š”์†Œ๊ฐ€ <p> ์š”์†Œ๋ผ๋ฉด ์Šคํƒ€์ผ์„ ์ ์šฉํ•ด์ค๋‹ˆ๋‹ค.

  h3 + p {
  text-indent: 1em;
}

์•„๋ž˜ ๊ฐ™์€ HTML์ธ ๊ฒฝ์šฐ์—๋งŒ CSS๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

<h3>์ œ๋ชฉ</h3>
<p>์—ฌ๊ธฐ์—๋Š” ๋‚ด์šฉ์ด ์˜ต๋‹ˆ๋‹ค.</p>
<p><a href="#">์—ฌ๊ธฐ</a>๋ฅผ ํด๋ฆญํ•˜์„ธ์š”.</p>

๐Ÿ‘‰ CSS Nesting

์–ด๋–ค ์„ ํƒ์ž ๋‚ด๋ถ€์— ๋‹ค๋ฅธ ์„ ํƒ์ž๋ฅผ ๋„ฃ์–ด์„œ ๊ณ„์ธต์ ์ธ ์Šคํƒ€์ผ์ด ๊ฐ€๋Šฅ์ผ€ํ•˜๋Š” ๋ฌธ๋ฒ•

CSS Nesting์„ ์ง€์›ํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋Š”, ์œ„์—์„œ ๋ณธ ์—ฐ์‚ฐ์ž๋ฅผ ๋‚˜์—ดํ•˜์—ฌ ํ•˜๋‚˜์”ฉ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค

nav {
  /* ๋„ค๋น„๊ฒŒ์ด์…˜ ์Šคํƒ€์ผ */
}

nav.light {
  /* ๋ผ์ดํŠธ ๋ชจ๋“œ ๋„ค๋น„๊ฒŒ์ด์…˜ ์Šคํƒ€์ผ */
}

nav.dark {
  /* ๋‹คํฌ ๋ชจ๋“œ ๋„ค๋น„๊ฒŒ์ด์…˜ ์Šคํƒ€์ผ */
}

nav > li {
  /* ๋„ค๋น„๊ฒŒ์ด์…˜ ์•ˆ์— ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ ์Šคํƒ€์ผ */
}

nav > li > ul {
  /* ๋„ค๋น„๊ฒŒ์ด์…˜ ์•ˆ์— ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ ์•ˆ์— ์žˆ๋Š” ์ผ๋ฐ˜ ์•„์ดํ…œ ์Šคํƒ€์ผ */
}

nav > li > ul.new {
  /* ๋„ค๋น„๊ฒŒ์ด์…˜ ์•ˆ์— ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ ์•ˆ์— ์žˆ๋Š” ์ƒˆ๋กœ์šด ์•„์ดํ…œ ์Šคํƒ€์ผ */
}

nav a {
  /* ๋„ค๋น„๊ฒŒ์ด์…˜ ์•ˆ์— ์žˆ๋Š” ๋งํฌ ์Šคํƒ€์ผ */
}

nav a:visited {
  /* ๋„ค๋น„๊ฒŒ์ด์…˜ ์•ˆ์— ์žˆ๋Š” ๋งํฌ์˜ ๋ฐฉ๋ฌธ ์ƒํƒœ ์Šคํƒ€์ผ */
}

nav a:focus,
nav a:hover {
  /* ๋„ค๋น„๊ฒŒ์ด์…˜ ์•ˆ์— ์žˆ๋Š” ๋งํฌ์˜ ํฌ์ปค์Šค, ํ˜ธ๋ฒ„ ์ƒํƒœ ์Šคํƒ€์ผ */
}

์œ„ ๋ฐฉ์‹์€ ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„์ด ๋งŽ์Šต๋‹ˆ๋‹ค.
nav > li > ul.new ์ด๋ ‡๊ฒŒ ํŒŒ๊ณ  ๋“ค์–ด ๊ฐˆ ์ˆ˜๋ก ์ค‘๋ณต๋˜๋Š” ์•ž ๋ถ€๋ถ„์„ ๊ณ„์† ์จ์ค˜์•ผํ•˜๋Š” ๊ท€์ฐฎ์Œ์ด ์ƒ๊ธฐ์ฃ .
CSS Nesting ์ง€์› ์ดํ›„ ๋ถ€ํ„ฐ๋Š” ์ด๋Ÿฐ ๋ฐฉ์‹์ด ์•„๋‹Œ
ํ•œ๋ฐฉ์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค

// ๐ŸŽˆ Nesting ๋ณ€๊ฒฝ
nav {
  /* ๋„ค๋น„๊ฒŒ์ด์…˜ ์Šคํƒ€์ผ */

  &.light {
    /* ๋ผ์ดํŠธ ๋ชจ๋“œ ๋„ค๋น„๊ฒŒ์ด์…˜ ์Šคํƒ€์ผ */
  }

  &.dark {
    /* ๋‹คํฌ ๋ชจ๋“œ ๋„ค๋น„๊ฒŒ์ด์…˜ ์Šคํƒ€์ผ */
  }

  > li {
    /* ๋„ค๋น„๊ฒŒ์ด์…˜ ์•ˆ์— ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ ์Šคํƒ€์ผ */

    > ul {
      /* ๋„ค๋น„๊ฒŒ์ด์…˜ ์•ˆ์— ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ ์•ˆ์— ์žˆ๋Š” ์ผ๋ฐ˜ ์•„์ดํ…œ ์Šคํƒ€์ผ */

      &.new {
        /* ๋„ค๋น„๊ฒŒ์ด์…˜ ์•ˆ์— ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ ์•ˆ์— ์žˆ๋Š” ์ƒˆ๋กœ์šด ์•„์ดํ…œ ์Šคํƒ€์ผ */
      }
    }
  }

  a {
    /* ๋„ค๋น„๊ฒŒ์ด์…˜ ์•ˆ์— ์žˆ๋Š” ๋งํฌ ์Šคํƒ€์ผ */

    &:visited {
      /* ๋„ค๋น„๊ฒŒ์ด์…˜ ์•ˆ์— ์žˆ๋Š” ๋งํฌ์˜ ๋ฐฉ๋ฌธ ์ƒํƒœ ์Šคํƒ€์ผ */
    }

    &:focus,
    &:hover {
      /* ๋„ค๋น„๊ฒŒ์ด์…˜ ์•ˆ์— ์žˆ๋Š” ๋งํฌ์˜ ํฌ์ปค์Šค, ํ˜ธ๋ฒ„ ์ƒํƒœ ์Šคํƒ€์ผ */
    }
  }
}

์œ„ ์ฝ”๋“œ ์ฒ˜๋Ÿผ Nesting์„ ํ™œ์šฉํ•˜๋ฉด ์ค‘๋ณต๋„ ์‚ฌ๋ผ์ง€๊ณ  ๊ณ„์ธต ๊ตฌ์กฐ๋„ ํ•œ๋ˆˆ์— ํŒŒ์•…์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

๐ŸŽˆ Nestingd์˜ ์žฅ์ 

  • ๋™์ผํ•œ ์„ ํƒ์ž๋ฅผ ๋ฐ˜๋ณตํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง‘๋‹ˆ๋‹ค.
  • ๊ด€๋ จ์žˆ๋Š” ์Šคํƒ€์ผ์ด ๊ฐ€๊นŒ์šด ๊ณณ์— ๋ฌถ์–ด ์ง‘๋‹ˆ๋‹ค.
  • CSS ์Šคํƒ€์ผ๊ณผ HTML ๋งˆํฌ์—…์ด ๋น„์Šทํ•œ ๊ณ„์ธต์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์Šคํƒ€์ผ์„ ์ฐพ๊ฑฐ๋‚˜ ํŽธ์ง‘, ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ์ˆ˜์›”ํ•ด ์ง‘๋‹ˆ๋‹ค.
  • ๋ถˆํ•„์š”ํ•œ ํด๋ž˜์Šค ์‚ฌ์šฉ์„ ์ค„์ด๋Š”๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ ํด๋ž˜์Šค์„ ํƒ์ž๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ณผ๋„ํ•˜๊ฒŒ classname์„ ๋ถ€์—ฌํ•˜๋˜ ๊ด€ํ–‰์„ ์—†์•จ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์ฃ 


<article class="question">
  <header class="question__header">
    <h3 class="question__header__heading">์งˆ๋ฌธ</h3>
  </header>
  <p class="question__body">CSS Nesting์„ ์จ๋ณด์…จ๋‚˜์š”?</p>
  <footer class="question__footer">
    <button class="btn secondary">์•„๋‹ˆ์˜ค</button>
    <button class="btn primary">๋„ค</button>
  </footer>
</article>
// ๊ธฐ์กด ํด๋ž˜์Šค ์„ ํƒ์ž ์Šคํƒ€์ผ
.question__header__heading {
  /* ์–ด๋–ค ์Šคํƒ€์ผ */
}

.question__footer .btn.secondary {
  /* ์–ด๋–ค ์Šคํƒ€์ผ */
}
// ๋„ค์ŠคํŒ… ์ ์šฉ
article {
  > header {
    h3 {
      /* ์–ด๋–ค ์Šคํƒ€์ผ */
    }
  }
  > footer {
    button.btn.secondary {
      /* ์–ด๋–ค ์Šคํƒ€์ผ */
    }
  }
      @media (min-width: 768px) {
      flex-direction: row;
      margin-bottom: 0;
    }
}

0๊ฐœ์˜ ๋Œ“๊ธ€