TL

toothlessdev

๐Ÿ“– ์Šคํƒ€์ผ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•, ๋ฌด์—‡์ด ๋ฌธ์ œ์ผ๊นŒ ?

CSS ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ์ข…์ข… ์Šคํƒ€์ผ์ด ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ๋ฎ์–ด์”Œ์›Œ์ง€๋Š” ๋ฌธ์ œ๋ฅผ ๊ฒช์Šต๋‹ˆ๋‹ค.
ํŠนํžˆ, ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž์™€ ํ•จ๊ป˜ ํ˜‘์—…ํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์Šคํƒ€์ผ ์ถฉ๋Œ์ด ๋”์šฑ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์Šคํƒ€์ผ ์ถฉ๋Œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด BEM(Block-Element-Modifier) ๋‚˜ CSS Modules, CSS-in-JS ์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, CSS ์Šคํƒ€์ผ์˜ ์ ์šฉ๋ฐฉ์‹ (์šฐ์„ ์ˆœ์œ„) ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •๋˜๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋ฉด, ๊ทผ๋ณธ์ ์ธ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค


๐ŸŽจ CSS Cascade Algorithm ์ด๋ž€?

CSS ๋Š” Cascading Style Sheets ์˜ ์•ฝ์ž๋กœ, ์Šคํƒ€์ผ ์šฐ์„ ์ˆœ์œ„ ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ์‹์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

Cascade : ํญํฌ ๋˜๋Š” ์œ„์—์„œ ์•„๋ž˜๋กœ ๋–จ์–ด์ง€๋Š”, ํ๋ฅด๋Š”

CSS๋Š” ์š”์†Œ์— ์—ฌ๋Ÿฌ ์Šคํƒ€์ผ์ด ์ ์šฉ๋˜์—ˆ์„ ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์šฐ์„ ์ˆœ์œ„ ๊ทœ์น™์— ๋”ฐ๋ผ ์ตœ์ข… ์Šคํƒ€์ผ์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

์šฐ์„ ์ˆœ์œ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค

  1. ์ค‘์š”๋„ (!important)
  2. ์Šคํƒ€์ผ์˜ ์œ ๋ž˜ (origin)
  3. Cascade Layer (sub-origin)
  4. Selector ์˜ ๊ตฌ์ฒด์„ฑ (specificity)
  5. ์„ ์–ธ ์ˆœ์„œ (order)
  6. ์ƒ์† (inheritance)

1. ์ค‘์š”๋„ (!important)

CSS ์—์„œ !important ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ์Šคํƒ€์ผ์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์•„์ง‘๋‹ˆ๋‹ค.

div {
    color: red !important;
}

ํ•˜์ง€๋งŒ, !important ๋ฅผ ๋‚จ๋ฐœํ•˜๋ฉด ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง€๊ณ , ์Šคํƒ€์ผ ์ถฉ๋Œ ๋ฌธ์ œ๊ฐ€ ๋”์šฑ ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, !important ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ง€์–‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. ์Šคํƒ€์ผ์˜ ์œ ๋ž˜ (origin)

CSS ๋Š” ๋‹ค์–‘ํ•œ origin ์—์„œ ์„ ์–ธ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์–ด๋–ค ์Šคํƒ€์ผ์ด ์šฐ์„ ์ ์œผ๋กœ ์ ์šฉ๋˜๋Š”์ง€๋Š” origin ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

Origin์„ค๋ช…์šฐ์„ ์ˆœ์œ„
User Agent๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋ณธ ์Šคํƒ€์ผ0
User์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ์Šคํƒ€์ผ1
Author๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์Šคํƒ€์ผ2
CSS AnimationCSS ์• ๋‹ˆ๋ฉ”์ด์…˜ ์Šคํƒ€์ผ3
InlineHTML ์š”์†Œ์— ์ง์ ‘ ์ž‘์„ฑํ•œ ์Šคํƒ€์ผ4
User && !important์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •ํ•œ !important5
Author && !important๊ฐœ๋ฐœ์ž๊ฐ€ ์„ค์ •ํ•œ !important6

โ€ผ๏ธ Author vs User
Author : ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์Šคํƒ€์ผ
User : ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ณด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •ํ•œ ์Šคํƒ€์ผ๋กœ ์ฃผ๋กœ ์ ‘๊ทผ์„ฑ์„ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์Šคํƒ€์ผ
์˜ˆ) ์›นํŽ˜์ด์ง€ ํฐํŠธ ํฌ๊ธฐ ๊ฐ•์ œ๋กœ ํ‚ค์šฐ๊ธฐ, ๊ณ ๋Œ€๋น„ ๋ชจ๋“œ ๋“ฑ..

๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐœ๋ฐœ์ž๋Š” origin ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์—†๊ณ , !important ๋ฅผ ๋‚จ๋ฐœํ•  ์ˆ˜๋„ ์—†์œผ๋‹ˆ, ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

3. Cascade Layer (sub-origin) โญ๏ธ

๊ฐœ๋ฐœ์ž๋Š” ๊ทธ๋Ÿผ ์ •๋ง๋กœ origin ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์„๊นŒ์š”?

Cascade Layer๋Š” CSS์˜ origin ๋‚ด์—์„œ ์Šคํƒ€์ผ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์„ธ๋ถ€์ ์œผ๋กœ ์ œ์–ดํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ฐ™์€ origin์—์„œ ๋™์ผํ•œ specificity๋ฅผ ๊ฐ€์ง„ ์Šคํƒ€์ผ ๊ฐ„์— Layer ์ˆœ์„œ๊ฐ€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
์ตœ๊ทผ ๋ธŒ๋ผ์šฐ์ €(Chrome99+, Firefox97+, Safari TP ๋ฐ iOS Safari)๋Š” @layer ํ‚ค์›Œ๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ origin ๋ ˆ๋ฒจ์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ๊ฐœ์˜ cascade layer ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ณ ,
๊ฐ ๋ ˆ๋ฒจ์˜ cascade layer ๋Š” ๋งŒ๋“ค์–ด์ง„ ์ˆœ์„œ์— ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ Layer ์˜ ์šฐ์„ ์ˆœ์œ„๋Š” ์„ ์–ธ ์ˆœ์„œ๋กœ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

@layer a, b, c;

@layer a {
}
@layer b {
}
@layer c {
}

Layer c ๊ฐ€ ๊ฐ€์žฅ ๋‚˜์ค‘์— ์„ ์–ธ๋˜์—ˆ์œผ๋ฏ€๋กœ c ์— ์žˆ๋Š” ์Šคํƒ€์ผ์ด ์šฐ์„ ์ ์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

3.1 @layer ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

์บ์Šค์ผ€์ด๋“œ ๋ ˆ์ด์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

@layer layer-name {
}

@layer ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ ˆ์ด์–ด๋ฅผ ์„ ์–ธํ•œ ํ›„, ํ•ด๋‹น ๋ ˆ์ด์–ด์— ์Šคํƒ€์ผ์„ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋˜, @import ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€ CSS ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋„ ๋ ˆ์ด์–ด๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@import url("style.css") layer-name;

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด style.css ํŒŒ์ผ ์ „์ฒด๊ฐ€ layer-name ๋ ˆ์ด์–ด์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

3.2 ์ค‘์ฒฉ ๋ ˆ์ด์–ด๋Š”

์ค‘์ฒฉ ๋ ˆ์ด์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ ˆ์ด์–ด์˜ ์ด๋ฆ„ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ๊ณ„์ธต์ ์œผ๋กœ ๋ ˆ์ด์–ด๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด @layer ๋ฅผ ์ค‘์ฒฉํ•ด์„œ ๊ตฌ์„ฑํ•˜๊ฑฐ๋‚˜,

@layer a {
    @layer b {
        @layer c {
        }
    }
}

@import ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@import url("style.css") layer(layerA.layerB);

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด layerA ๋‚ด๋ถ€์— layerB ๋ ˆ์ด์–ด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , style.css ์— ์„ ์–ธ๋œ ๋ ˆ์ด์–ด๋Š” layerA.layerB ๋ ˆ์ด์–ด์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

3.3 Layer ๋Š” origin ๋‚ด๋ถ€์˜ ์šฐ์„ ์ˆœ์œ„ ์„œ๋ธŒ ์‹œ์Šคํ…œ์ด๋‹ค

์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜๊ฒƒ ์ฒ˜๋Ÿผ, CSS์˜ origin์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

  1. User Agent
  2. User
  3. Author
  4. Inline Style
  5. Author !important
  6. User !important

์—ฌ๊ธฐ์„œ Cascade Layer๋Š” Author, Author !important ๋ฒ”์œ„ ๋‚ด์—์„œ๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

@layer base {
    .btn {
        color: red;
    }
}
@layer theme {
    .btn {
        color: blue;
    }
}

์—ฌ๊ธฐ์„œ,

๋‘ ์Šคํƒ€์ผ ๋ชจ๋‘ Author origin์— ์†ํ•˜๋ฏ€๋กœ,

์ด ๊ฒฝ์šฐ ์šฐ์„ ์ˆœ์œ„๋Š” **Cascade Layer ์ˆœ์„œ(base โ†’ theme)**๋ฅผ ๋”ฐ๋ฅด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ theme๊ฐ€ ๋‚˜์ค‘์— ์„ ์–ธ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— .btn { color: blue }๊ฐ€ ์ตœ์ข… ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, ๊ฐ™์€ origin์—์„œ ๋™์ผํ•œ specificity๋ฅผ ๊ฐ€์ง„ ์Šคํƒ€์ผ ๊ฐ„์—, layer ์ˆœ์„œ๊ฐ€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

4. Selector ์˜ ๊ตฌ์ฒด์„ฑ

์…€๋ ‰ํ„ฐ๋Š” ๋” ๊ตฌ์ฒด์ ์ผ์ˆ˜๋ก ๋” ์šฐ์„ ์ ์œผ๋กœ ๊ณ ๋ ค๋˜์–ด ์Šคํƒ€์ผ์ด ์ ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์—,
์…€๋ ‰ํ„ฐ๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์ž‘์„ฑํ•˜์—ฌ ์Šคํƒ€์ผ์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


CSS ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค

์ธ๋ผ์ธ ์Šคํƒ€์ผ (inline style) > id ์…€๋ ‰ํ„ฐ > class ๋ฐ ๊ฐ€์ƒ ์…€๋ ‰ํ„ฐ > ํƒœ๊ทธ ์…€๋ ‰ํ„ฐ > ์ „์ฒด ์…€๋ ‰ํ„ฐ > ์ƒ์œ„ ์š”์†Œ์— ์˜ํ•ด ์ƒ์†๋œ ์†์„ฑ

์ด๋•Œ, ๋™์ผํ•œ ์šฐ์„ ์ˆœ์œ„์˜ ์…€๋ ‰ํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด, ์…€๋ ‰ํ„ฐ์˜ ์ˆซ์ž๊ฐ€ ๋” ๋งŽ์€ ์„ ์–ธ์ด ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์•„์ง‘๋‹ˆ๋‹ค

5. ์„ ์–ธ ์ˆœ์„œ

CSS ์—์„œ ๋™์ผํ•œ ์šฐ์„ ์ˆœ์œ„์˜ ์Šคํƒ€์ผ์ด ์—ฌ๋Ÿฌ ๊ฐœ ์„ ์–ธ๋œ ๊ฒฝ์šฐ, ์„ ์–ธ๋œ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋งˆ์ง€๋ง‰์— ์„ ์–ธ๋œ ์Šคํƒ€์ผ์ด ์šฐ์„ ์ ์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

div {
    color: red;
}
div {
    color: blue;
}

์œ„์˜ ์˜ˆ์‹œ์—์„œ div ์š”์†Œ๋Š” blue ์ƒ‰์ƒ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋˜, link ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด css ํŒŒ์ผ์„ ๋กœ๋“œํ•  ๋•Œ๋„ ๋‚˜์ค‘์— ์“ฐ์ธ link ํƒœ๊ทธ์˜ ์Šคํƒ€์ผ์ด ์šฐ์„ ์ ์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

<link rel="stylesheet" href="style1.css" />
<link rel="stylesheet" href="style2.css" />
<link rel="stylesheet" href="style3.css" />

์œ„์˜ ์˜ˆ์‹œ์—์„œ style3.css ์˜ ์Šคํƒ€์ผ์ด style1.css, style2.css ์˜ ์Šคํƒ€์ผ๋ณด๋‹ค ์šฐ์„ ์ ์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.


6. ์ƒ์†

CSS ์—์„œ๋Š” ๋ถ€๋ชจ ์š”์†Œ์˜ ์Šคํƒ€์ผ์ด ์ž์‹ ์š”์†Œ์— ์ƒ์†๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
color font-* text-* visibility white-space list-style border ๋“ฑ๊ณผ ๊ฐ™์€ ์†์„ฑ์€ ์ƒ์†๋˜๋Š” ๋ฐ˜๋ฉด์—, margin padding background width height position ๋“ฑ๊ณผ ๊ฐ™์€ ์†์„ฑ์€ ์ƒ์†๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ƒ์†์€ CSS ์˜ ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘ ๋ฐฉ์‹์ด๋ฏ€๋กœ, ์ƒ์†์„ ํ™œ์šฉํ•˜์—ฌ ์Šคํƒ€์ผ์„ ์ผ๊ด€๋˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ, inherit ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€๋ชจ ์š”์†Œ์˜ ์Šคํƒ€์ผ์„ ์ž์‹ ์š”์†Œ์— ๊ฐ•์ œ๋กœ ์ƒ์†์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

inheritinitialunset
๋ถ€๋ชจ ์š”์†Œ์˜ ์Šคํƒ€์ผ์„ ์ƒ์†๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”์ƒ์† ๋˜๋Š” ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”

๐Ÿ”— ์ฐธ๊ณ ์ž๋ฃŒ