๐ ์คํ์ผ ์ถฉ๋์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ, ๋ฌด์์ด ๋ฌธ์ ์ผ๊น ?
CSS ๋ฅผ ์ฌ์ฉํ ๋, ์ข
์ข
์คํ์ผ์ด ์๊ธฐ์น ์๊ฒ ๋ฎ์ด์์์ง๋ ๋ฌธ์ ๋ฅผ ๊ฒช์ต๋๋ค.
ํนํ, ์ฌ๋ฌ ๊ฐ๋ฐ์์ ํจ๊ป ํ์
ํ๋ ํ๋ก์ ํธ์์๋ ์คํ์ผ ์ถฉ๋์ด ๋์ฑ ๋น๋ฒํ๊ฒ ๋ฐ์ํฉ๋๋ค.
์ด๋ฌํ ์คํ์ผ ์ถฉ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด BEM(Block-Element-Modifier) ๋ CSS Modules, CSS-in-JS ์ ๊ฐ์ ๋ค์ํ ์ ๊ทผ ๋ฐฉ์์ด ๋ฑ์ฅํ์ต๋๋ค.
ํ์ง๋ง, CSS ์คํ์ผ์ ์ ์ฉ๋ฐฉ์ (์ฐ์ ์์) ๊ฐ ์ด๋ป๊ฒ ๊ฒฐ์ ๋๋์ง ์ดํดํ์ง ๋ชปํ๋ฉด, ๊ทผ๋ณธ์ ์ธ ํด๊ฒฐ์ฑ ์ ์ฐพ๊ธฐ ์ด๋ ต์ต๋๋ค
๐จ CSS Cascade Algorithm ์ด๋?
CSS ๋ Cascading Style Sheets ์ ์ฝ์๋ก, ์คํ์ผ ์ฐ์ ์์ ๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐฉ์์ ์ ์ํฉ๋๋ค.
Cascade : ํญํฌ ๋๋ ์์์ ์๋๋ก ๋จ์ด์ง๋, ํ๋ฅด๋
CSS๋ ์์์ ์ฌ๋ฌ ์คํ์ผ์ด ์ ์ฉ๋์์ ๋ ๋ค์๊ณผ ๊ฐ์ ์ฐ์ ์์ ๊ท์น์ ๋ฐ๋ผ ์ต์ข
์คํ์ผ์ ๊ฒฐ์ ํฉ๋๋ค.
์ฐ์ ์์๋ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์ ์ฉ๋ฉ๋๋ค
- ์ค์๋ (
!important
)- ์คํ์ผ์ ์ ๋ (origin)
- Cascade Layer (sub-origin)
- Selector ์ ๊ตฌ์ฒด์ฑ (specificity)
- ์ ์ธ ์์ (order)
- ์์ (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 Animation | CSS ์ ๋๋ฉ์ด์ ์คํ์ผ | 3 |
Inline | HTML ์์์ ์ง์ ์์ฑํ ์คํ์ผ | 4 |
User && !important | ์ฌ์ฉ์๊ฐ ์ค์ ํ !important | 5 |
Author && !important | ๊ฐ๋ฐ์๊ฐ ์ค์ ํ !important | 6 |
โผ๏ธ 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์ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์ ์ฉ๋ฉ๋๋ค.
- User Agent
- User
- Author
- Inline Style
- Author !important
- 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
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ๋ชจ ์์์ ์คํ์ผ์ ์์ ์์์ ๊ฐ์ ๋ก ์์์ํฌ ์ ์์ต๋๋ค.
inherit | initial | unset |
---|---|---|
๋ถ๋ชจ ์์์ ์คํ์ผ์ ์์ | ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ด๊ธฐํ | ์์ ๋๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ด๊ธฐํ |