๐ฏ 02. CSS ์ ํ์์ Specificity: '์ฐ์ ์์ ์ ์์์ ์ด์๋จ๋ ๋ฒ'
๐ ๊ฐ์
์ํ๋ ์์๋ง ์ฝ ์ง์ด๋ด๋ ์ ๊ตํ ์ ํ์์, ์คํ์ผ ์ถฉ๋์ ํด๊ฒฐํ๋ '๋ช ์๋(Specificity)'์ ๊ณ์ฐ๋ฒ์ ์์ฒ ์ด์ ํจ๊ป ์์๋ด ๋๋ค.
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 10๋ถ(์ ์ฒด) / ํต์ฌ ํํธ๋ง: 5๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ํ๋ฆ
[์ ํ์์ ์ข
๋ฅ] โ [Specificity ๊ณ์ฐ๊ธฐ] โ [!important์ ์ ํน๊ณผ ์ํ]
๐ฏ ์ด ๋ฌธ์๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
- ๋จ์ ์ ํ์๋ถํฐ ๋ณตํฉ ์ ํ์๊น์ง ์ฉ๋์ ๋ง๊ฒ ๊ณจ๋ผ ์ธ ์ ์์ต๋๋ค.
- ๋ด ์คํ์ผ์ด ์ ์ ์ฉ๋์ง ์๋์ง ๋ช ์๋ ์ ์๋ฅผ ํตํด ๋ ผ๋ฆฌ์ ์ผ๋ก ํ์ ํฉ๋๋ค.
- ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ ํ์ ์์ฑ ์ ๋ต์ ์ธ์ธ ์ ์์ต๋๋ค.
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ๐ฃ ์์ฒ ( ์ ์
): "์ํธ ๋! ๋ถ๋ช
ํ
.buttonํด๋์ค์ ๋นจ๊ฐ์์ ์คฌ๋๋ฐ, ์ ํ๋ฉด์๋ ๊ณ์ ํ๋์์ผ๋ก ๋์ค๋ ๊ฑธ๊น์? ๊ฐ๋ฐ์ ๋๊ตฌ ๋ณด๋๊น ์ค์ด ๊ทธ์ด์ ธ ์์ด์! ๋๊ฐ ์ ์ฝ๋๋ฅผ ๋ฐฉํดํ๋ ๊ฑฐ์ฃ ? ๐ " - ๐ฆ ์ํธ ( ๋ฆฌ๋ ): "์์ฒ ๋, CSS์์ ์ฝ๋๋ ์์์ ์๋๋ก ํ๋ฅด์ง๋ง, ๊ทธ๋ณด๋ค ๋ ๊ฐ๋ ฅํ '๊ณ๊ธ'์ด ์กด์ฌํด์. ๋ฐ๋ก ๋ช
์๋(Specificity)์ฃ . ๋๊ฐ ๋ ํ์ด ์ผ์ง ๊ณ์ฐํ ์ค ๋ชจ๋ฅด๋ฉด, ๋งจ๋
!important๋ง ๋จ๋ฐํ๊ฒ ๋ ๊ฒ๋๋ค. ์, ๊ณ๊ธ์ฅ์ ๋ผ๊ธฐ ์ ์ ์ ์๋ถํฐ ๋งค๊ฒจ๋ณด์ฃ ."
๐ค ์ ์์์ผ ํ๋๊ฐ
CSS(Cascading Style Sheets)์ ์๊ธ์์ธ **Cascading(ํญํฌ)**์ ์คํ์ผ์ด ์ฐ์ ์์์ ๋ฐ๋ผ ๊ฒน์ณ์ง๋ฉฐ ์ ์ฉ๋๋ค๋ ๋ป์ ๋๋ค. ์ด ์ฐ์ ์์๋ฅผ ๊ฒฐ์ ํ๋ ํต์ฌ ๊ณต์์ด ๋ฐ๋ก **๋ช ์๋(Specificity)**์ ๋๋ค.
์ ์
๊ฐ๋ฐ์๋ค์ ์คํ์ผ์ด ์ ๋จนํ ๋๋ง๋ค ๋ ๊ตฌ์ฒด์ ์ธ ์ ํ์๋ฅผ ๋ง๋ถ์ด๊ฑฐ๋ !important๋ฅผ ์ฌ์ฉํด ๋ฌธ์ ๋ฅผ 'ํํผ'ํ๊ณค ํฉ๋๋ค. ํ์ง๋ง ์ด๊ฑด ์ํํญํ์ ์ฌ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. 5๋
์ฐจ ์ด์์ ์๋์ด๋ ์ต์ํ์ ๋ช
์๋๋ก ์คํ์ผ์ ๊ด๋ฆฌํ์ฌ ์๋ง ์ค์ CSS ์์์๋ ์ถฉ๋ ์์ด ํํ๋กญ๊ฒ ์ฝ๋๋ฅผ ์ ์ง๋ณด์ํฉ๋๋ค.
๐ฐ 1. ์ ํ์์ ๊ณ๊ธ: ๋ช ์๋ ์ ์ํ
๋ช ์๋๋ ์ ์๋ก ๊ณ์ฐ๋ฉ๋๋ค. ์ ์๊ฐ ๋์ ์ ํ์๊ฐ ์น๋ฆฌํฉ๋๋ค!
| ์ ํ์ ์ข ๋ฅ | ์์ | ์ ์ (๊ฐ์ค์น) |
|---|---|---|
| Inline ์คํ์ผ | style="..." | 1000 |
| ID ์ ํ์ | #header | 100 |
| Class, Pseudo-class, Attribute | .btn, :hover, [type="text"] | 10 |
| Element, Pseudo-element | div, h1, ::before | 1 |
| ์ ์ฒด ์ ํ์ | * | 0 |
๐ฆ ์ํธ์ ๊ณ์ฐ๋ฒ:
"์์ฒ ๋,#nav .list-item a์ ์ ์๋ ์ผ๋ง์ผ๊น์?
ID 1๊ฐ(100) + Class 1๊ฐ(10) + Element 1๊ฐ(1) = 111์ ์ ๋๋ค.
๋ง์ฝ ๋๊ฐ.menu a(11์ )๋ก ์คํ์ผ์ ๋ฎ์ด์ฐ๋ ค ํ๋ค๋ฉด? ์ ๋ ์ด๊ธธ ์ ์์ฃ ."
โ๏ธ 2. ์ฐ์ ์์ ์ ์: ๋๊ฐ ์ด๊ธธ๊น?
- ๋์ผ ์ ์๋ฉด?: ๋์ค์ ์ด ๋์ด ์ด๊น๋๋ค. (ํญํฌ์ ์์น)
- !important๋?: ๋ชจ๋ ์ ์๋ฅผ ๋ฌด์ํ๊ณ ์์ด ๋ฉ๋๋ค. ํ์ง๋ง ๋จ์ฉํ๋ฉด ์ํคํ ์ฒ๊ฐ ๋ง๊ฐ์ง๋๋ค.
- ์์๋ฐ์ ์คํ์ผ์?: ๊ฐ์ฅ ํ์ด ์ฝํฉ๋๋ค. ๋ช ์๋๊ฐ 0์ด๋ผ๋ ์ง์ ์ ํํ ์คํ์ผ์ด ๋ฌด์กฐ๊ฑด ์ด๊น๋๋ค.
/* ๐ฃ ์์ฒ ์ด์ ์ฝ๋ (10์ ) */
.button { color: red; }
/* ๐ค ๋๊ตฐ๊ฐ ์ด ๋ ๊ฐ๋ ฅํ ์ฝ๋ (21์ ) */
body #container .button { color: blue; }
/* ๐ฃ ์์ฒ : "์... ID๊ฐ ๋ค์ด๊ฐ๋๊น ์ ์๊ฐ ํ ๋ฐ๋ค์!" */๐ก๏ธ 3. 5๋ ์ฐจ์ ์ ๋ต: '๊ตฌ์ฒด์ฑ'์ ํจ์ ํผํ๊ธฐ
์๋์ด๋ค์ ์ ํ์๋ฅผ ๋๋ฌด ๊ธธ๊ฒ ์ฐ์ง ์์ต๋๋ค. #main section div ul li a ์ฒ๋ผ ์ฐ๋ฉด ๋์ค์ ์คํ์ผ์ ๋ฐ๊พธ๊ธฐ๊ฐ ๋๋ฌด ํ๋ค์ด์ง๊ธฐ ๋๋ฌธ์ด์ฃ .
[์ํธ ๋ฆฌ๋์ ํด๋ฆฐ ์ ํ์ ํ]
- ID ์ ํ์ ์ฌ์ฉ ์ง์: ๊ฐ๊ธ์ ํด๋์ค(
.) ์์ฃผ๋ก ์ค๊ณํ์ธ์. ID๋ ๋๋ฌด ํ์ด ์ธ์ ๋์ค์ ์ ์ดํ๊ธฐ ํ๋ญ๋๋ค. - BEM(Block Element Modifier) ํ์ฉ:
.header__nav-item--active์ฒ๋ผ ํด๋์ค ํ๋์ ์๋ฏธ๋ฅผ ๋ด์ ๋ช ์๋๋ฅผ ๋ฎ๊ฒ(10์ ) ์ ์งํ์ธ์. - ๋ฒ์ฉ์ฑ vs ํน์์ฑ: ๊ณตํต ์คํ์ผ์ ๋ฎ์ ์ ์์ ์ ํ์๋ก, ํน๋ณํ ์คํ์ผ์ ํด๋์ค๋ฅผ ์ถ๊ฐํด ์ด์ง ๋์ ์ ์๋ก ๊ด๋ฆฌํ์ธ์.
๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. ๋ค์ ์ ํ์ ์ค ์ ์๊ฐ ๊ฐ์ฅ ๋์ ๊ฒ์ ๋ฌด์์ผ๊น์?
nav ul li a.main-nav .link#logodiv.content p
โ
์ ๋ต: 3. #logo
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
: ๋ช
์๋ ์ ์ํ๋ก ๋น๊ตํ๋ฉด โ โ
nav ul li a= 0-0-4 (์์ 4๊ฐ), โก.main-nav .link= 0-2-0 (ํด๋์ค 2๊ฐ), โข#logo= 1-0-0 (ID 1๊ฐ), โฃdiv.content p= 0-1-2 (ํด๋์ค 1 + ์์ 2). ID(100์ ) ๊ฐ ํด๋์ค(10์ )๋ณด๋ค ํญ์ ์ด๊น๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ์ ํ์๊ฐ ์๋ฌด๋ฆฌ ๊ธธ์ด๋ **๊ณ๊ธ(ID > Class > Element)**์ ๋ชป ์ด๊ฒจ์. ์์ ์ ํ์ 100๊ฐ๋ฅผ ํฉ์ณ๋ ํด๋์ค ํ๋๋ณด๋ค ์ฝํฉ๋๋ค!"
- ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "ID ํ ๋ฐฉ์ด๋ฉด ํด๋์ค ์ด ๋ช ๋ ๋ฌด๋ฆ ๊ฟ๋๋ค!"
Q2. !important๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์คํ์ผ ์ถฉ๋์ ํด๊ฒฐํ๋ ๊ฐ์ฅ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ ๋ฌด์์ผ๊น์?
- ๋ถ๋ชจ ์์๋ฅผ ๋ ๋ง์ด ์จ์ ์ ํ์๋ฅผ ๊ธธ๊ฒ ๋ง๋ ๋ค.
- ๋ชจ๋ ์์ฑ์ ID ์ ํ์๋ฅผ ๋ถ์ธ๋ค.
- ํ์ฌ ์ ์ฉ๋ ์คํ์ผ๋ณด๋ค ๋ช ์๋ ์ ์๊ฐ ๋๊ฑฐ๋ ๊ฐ์ ํด๋์ค๋ฅผ ์ถ๊ฐํ๋ค.
- CSS ํ์ผ์ ๋งจ ๋ง์ง๋ง ์ค๋ก ์ฝ๋๋ฅผ ์ฎ๊ธด๋ค.
โ
์ ๋ต: 3. ํ์ฌ ์ ์ฉ๋ ์คํ์ผ๋ณด๋ค ๋ช
์๋ ์ ์๊ฐ ๋๊ฑฐ๋ ๊ฐ์ ํด๋์ค๋ฅผ ์ถ๊ฐํ๋ค.
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช : ๋ช ์๋์ ์๋ฆฌ์ ๋ฐ๋ผ ๊ฐ์ ์์ค์ ์ ํ์๋ก ๋ ผ๋ฆฌ์ ์ผ๋ก ๋์ํ๋ ๊ฒ์ด ๊ฐ์ฅ ๊ฑด๊ฐํ ํด๊ฒฐ๋ฒ์ ๋๋ค. ๋ถํ์ํ ID ๋จ์ฉ์ด๋ ์ ํ์ ๊ธธ์ด ๋๋ฆฌ๊ธฐ๋ ์ ์ง๋ณด์๋ฅผ ๋ง์น๊ณ , ํ์ผ ์์์ ์์กดํ๋ ๊ฒ์ ๋ฆฌํฉํ ๋ง ์ ๊นจ์ง๊ธฐ ์ฝ์ต๋๋ค.
- ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, โ ์ ๋ถํ์ํ๊ฒ ๋ณต์กํ๊ณ , โก๋ ID ๋จ์ฉ์ผ๋ก ์ด์ด์ง๋ฉฐ, โฃ๋ CSS ํ์ผ์ ํฉ์น๊ฑฐ๋ ์์๊ฐ ๋ฐ๋๋ฉด ๋ฐ๋ก ๊นจ์ ธ์!"
- ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "์ถฉ๋ ํด๊ฒฐ์ ์ ์: ๊ฐ์ ๊ธ์์ ์ ๋ฉด ์น๋ถํ๋ผ!"
Q3. [์์ฒ ์ด์ ํ
์คํธ ํ์: ๊ธด๊ธ ๋๋ฒ๊น
]
์์ฒ ์ด๊ฐ ๋ฒํผ์ :hover ์ ๋ฐฐ๊ฒฝ์์ ๋
ธ๋์์ผ๋ก ๋ฐ๊ฟจ๋๋ฐ, ํน์ ํ์ด์ง์์๋ ๊ณ์ ์๋ ์์ธ ํ์์ผ๋ก ๋์ต๋๋ค. ํ์ธํด๋ณด๋ ํด๋น ํ์ด์ง ๊ฐ์ด๋์์ #sidebar a ๋ผ๋ ์คํ์ผ์ด ์ด๋ฏธ ๋ฐฐ๊ฒฝ์์ ํ์์ผ๋ก ๊ณ ์ ํ๊ณ ์์์ต๋๋ค. ์์ฒ ์ด๊ฐ ์์ ๋์์ด๋ ๋์ด ์ํ๋ '๋
ธ๋์ ํธ๋ฒ ํจ๊ณผ'๋ฅผ ๋ด๊ธฐ ์ํด ๊ฐ์ฅ ๊ถ์ฅ๋๋ ํด๊ฒฐ์ฑ
์ ๋ฌด์์ผ๊น์?
โ
์ ๋ต: ๋ฒํผ์ ๋ ๋ช
ํํ ํด๋์ค(์: .btn--yellow-hover)๋ฅผ ๋ถ์ฌํ๊ฑฐ๋, ์ ํ์์ ๋ช
์๋๋ฅผ ๋์ฌ(์: .sidebar .btn:hover) ๋์ํ๋ค.
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
:
#sidebar a๋ ID๊ฐ ํฌํจ๋์ด 101์ ์ ๋๋ค. ์์ฒ ์ด์.button:hover๋ 20์ ๋ฐ์ ์ ๋์ฃ . - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ์ฌ๊ธฐ์
!important๋ฅผ ์ฐ๋ฉด ๋ค์๋ฒ์ ๋ ๋๊ตฐ๊ฐ ๊ทธ ๋ฒํผ์ ๋ฐ๊พธ๋ ค ํ ๋ ์ ์์ด ์ผ์ด๋ฉ๋๋ค. ๊ณ๊ธ ์ ์๋ฅผ ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ง์ถฐ์ฃผ์ธ์." - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "๊ณ๊ธ(ID)์ด ์ค๋ ฅ(Class)์ ์ด๊ธด๋ค. ์ด๊ธฐ๋ ค๋ฉด ๊ณ๊ธ์ ๋์ด๊ฑฐ๋, ๊ฐ์ ๊ธ์์ ์ค๋ ฅ์ ๋ ์์๋ผ(Class ์ถ๊ฐ)."
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
์ค๋์ ๋ด ์ฝ๋๊ฐ ์ ๋ฌด์๋นํ๋์ง ๊ทธ ์ด์ ๋ฅผ ๋ช
ํํ ์๊ฒ ๋๋ค.
ID ์ ํ์๊ฐ ๊ทธ๋ ๊ฒ ๊ฐ๋ ฅํ ๊นกํจ(?)์ธ ์ค ๋ชฐ๋๋ค. ๊ทธ๋ฅ ์ด๋ฆํ์ธ ์ค ์์๋๋ฐ...
์ํธ ๋์ด "์ ํ์๊ฐ ๊ธธ์ด์ง์๋ก ๋ ๋ฏธ๋์ ๋ฐ๋ชฉ์ ์ก๋ ๊ฑฐ๋ค"๋ผ๊ณ ํ์ ๋ง์์ด ๊ฐ์ด์ ์ฝ ๋ฐํ๋ค.
๐ก "๋ช ์๋๋ ๋ฌด๊ธฐ๊ฐ ์๋๋ผ ๊ท ํ์ด๋ค. ๊ฐ์ฅ ๋ฎ์ ์ ์๋ก ์ํ๋ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๋ ๊ฐ๋ฐ์๊ฐ ์ง์ง ๊ณ ์๋ค."
์ง์ ๊ฐ๋ฉด์ ์ค๋ ์ง ์ฝ๋๋ค์์ ๋ถํ์ํ๊ฒ ๊ธด ์ ํ์๋ค์ ์ด๋ป๊ฒ ์ค์ผ ์ ์์์ง ๋จธ๋ฆฟ์์ผ๋ก ๋ฆฌํฉํ ๋งํด๋ดค๋ค.
BEM์ด๋ผ๋ ๊ฒ๋ ์ข ๋ ์์ธํ ์ฐพ์๋ด์ผ๊ฒ ๋ค.
์ค๋๋ 1% ์๋์ด์ ๊ฐ๊น์์ง ๋๋! ๋งฅ์ฃผ ํ ์ ํ๋ฌ ๊ฐ์ผ์ง! ๐ป