๐ฅ CSS !important์ ๋จ์ฉ: ์์ธก ๋ถ๊ฐ๋ฅํ ์คํ์ผ์ ๋ช
Summary
!important
ํค์๋๋ฅผ ๋จ์ฉํ๋ฉด CSS ์บ์ค์ผ์ด๋ ๊ท์น์ ๋ฌด์ํ์ฌ ์คํ์ผ ๊ฐ์ ์ฐ์ ์์ ์ถฉ๋์ ์ผ๊ธฐํ๊ณ , ๋๋ฒ๊น
์ ์ด๋ ต๊ฒ ํ๋ฉฐ, ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ์ฌ๊ฐํ๊ฒ ์ ํดํฉ๋๋ค. ๋์ CSS ์ฐ์ ์์ ๊ท์น์ ์ดํดํ๊ณ , ์๋งจํฑํ๊ณ ๋ช
ํํ ํด๋์ค ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉฐ, ํ์ํ ๊ฒฝ์ฐ CSS Custom Properties๋ CSS-in-JS์ ๊ฐ์ ์ค์ฝํ ๊ธฐ๋ฐ ์๋ฃจ์
์ ํ์ฉํ์ฌ ์์ธก ๊ฐ๋ฅํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์คํ์ผ์ ๊ตฌ์ถํด์ผ ํฉ๋๋ค.
Why Wrong?
CSS๋ '์บ์ค์ผ์ด๋(Cascade)'๋ผ๋ ํต์ฌ ์์น์ ๋ฐ๋ผ ์คํ์ผ์ด ์ ์ฉ๋ฉ๋๋ค. ์ด๋ ์ฌ๋ฌ ๊ท์น์ด ํ ์์์ ์ ์ฉ๋ ๋ ์ด๋ค ๊ท์น์ด '์น๋ฆฌ'ํ ์ง ๊ฒฐ์ ํ๋ ์ฒด๊ณ์ ์ธ ์ฐ์ ์์ ๊ฒฐ์ ๋ฐฉ์์ ๋๋ค. ์ด ์ฐ์ ์์๋ ๋ค์๊ณผ ๊ฐ์ ์์๋ค์ ๊ณ ๋ คํฉ๋๋ค:
- Origin (์ถ์ฒ): ๋ธ๋ผ์ฐ์ ์คํ์ผ์ํธ < ์ฌ์ฉ์ ์คํ์ผ์ํธ < ์์ฑ์(๊ฐ๋ฐ์) ์คํ์ผ์ํธ
- Specificity (๋ช ์๋): ์ ๋ ํฐ๊ฐ ์ผ๋ง๋ ๊ตฌ์ฒด์ ์ธ๊ฐ (์ธ๋ผ์ธ ์คํ์ผ > ID ์ ๋ ํฐ > ํด๋์ค/์์ฑ/๊ฐ์ ํด๋์ค ์ ๋ ํฐ > ํ์ /๊ฐ์ ์์ ์ ๋ ํฐ)
- Order (์ ์ธ ์์): ๋์ผํ ๋ช ์๋๋ฅผ ๊ฐ์ง ๊ฒฝ์ฐ ๋์ค์ ์ ์ธ๋ ๊ท์น์ด ์ฐ์ ํฉ๋๋ค.
!important
ํค์๋๋ ์ด ์บ์ค์ผ์ด๋ ๊ท์น์ ๋ฌด์ํ๊ณ , ๋ชจ๋ ์ผ๋ฐ์ ์ธ CSS ์ ์ธ๋ณด๋ค ์ต์ฐ์ ๊ถ์ ๋ถ์ฌํฉ๋๋ค. ์ด๋ ๋จ๊ธฐ์ ์ผ๋ก ํน์ ์คํ์ผ์ ๊ฐ์ ๋ก ์ ์ฉํ๋ ๋ฐ ํธ๋ฆฌํด ๋ณด์ผ ์ ์์ง๋ง, ์ฅ๊ธฐ์ ์ผ๋ก๋ ๋ค์๊ณผ ๊ฐ์ ์ฌ๊ฐํ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํฉ๋๋ค.
- ์บ์ค์ผ์ด๋ ํ๊ดด:
!important
๋ CSS์ ํต์ฌ์ธ ์บ์ค์ผ์ด๋ฉ ์์น์ ๋ฌด๋ ฅํ์์ผ, ์คํ์ผ์ด ์ด๋์ ์ด๋ป๊ฒ ์ ์ฉ๋๋์ง ์์ธกํ๊ธฐ ๋งค์ฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ์ด๋ ๊ณง 'CSS ์ฐ์ ์์ ์ ์'์ผ๋ก ์ด์ด์ง๋ฉฐ, ํน์ ์คํ์ผ์ ์ค๋ฒ๋ผ์ด๋ํ๊ธฐ ์ํด ๋ ๋ง์!important
๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, ๋งค์ฐ ๋ณต์กํ๊ณ ๊นจ์ง๊ธฐ ์ฌ์ด ์ ๋ ํฐ๋ฅผ ์์ฑํ๊ฒ ๋ง๋ญ๋๋ค. - ๋๋ฒ๊น
์ ์
๋ชฝ:
!important
๊ฐ ๋จ์ฉ๋ ์ฝ๋๋ ์ด๋ค ์คํ์ผ์ด ์ค์ ๋ก ์ ์ฉ๋๋์ง ์ถ์ ํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ๊ฐ๋ฐ์ ๋๊ตฌ์์!important
๊ฐ ๋ถ์ ์คํ์ผ์ ๋ฐ๊ฒฌํ๋ฉด, ํด๋น ์คํ์ผ์ด ์ ์ ์ฉ๋์๋์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ์ค๋ฒ๋ผ์ด๋ํด์ผ ํ๋์ง ํ์ ํ๋ ๋ฐ ๋ถํ์ํ ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ ์๋ชจํ๊ฒ ๋ฉ๋๋ค. - ์ฌ์ฌ์ฉ์ฑ ๋ฐ ์ ์ง๋ณด์์ฑ ์ ํด: ํน์ ์ปดํฌ๋ํธ๋ ์์์
!important
๊ฐ ๋ถ์ผ๋ฉด, ํด๋น ์คํ์ผ์ ๋ค๋ฅธ ๊ณณ์์ ์ฌ์ฌ์ฉํ๊ฑฐ๋ ์์ ํ๊ธฐ๊ฐ ๊ทน๋๋ก ์ด๋ ค์์ง๋๋ค.!important
๋ ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ ๋ฌด์ํ๊ธฐ ๋๋ฌธ์, ๋์ค์ ์ด ์คํ์ผ์ ๋ณ๊ฒฝํ๋ ค๋ฉด ๋ ๊ฐ๋ ฅํ!important
๋ ์ธ๋ผ์ธ ์คํ์ผ ์ธ์๋ ๋ฐฉ๋ฒ์ด ์์ด์ ธ ์ ์ฐ์ฑ์ด ์ฌ๋ผ์ง๋๋ค. - ์์ธก ๋ถ๊ฐ๋ฅํ ์ฌ์ด๋ ์ดํํธ: ํ๋์
!important
์ ์ธ์ด ์์์น ๋ชปํ ๋ค๋ฅธ ์์์ ์คํ์ผ์๋ ์ํฅ์ ์ฃผ๊ฑฐ๋, ๋์ค์ ์ถ๊ฐ๋ ์คํ์ผ๊ณผ์ ์ถฉ๋์ ์ผ์ผ์ผ ์ ์ฒด UI์ ์ผ๊ด์ฑ์ ํด์น ์ ์์ต๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ค์ ํนํ ๋๊ท๋ชจ ํ๋ก์ ํธ๋ ์ฌ๋ฌ ๊ฐ๋ฐ์๊ฐ ํ์ ํ๋ ํ๊ฒฝ์์ ์น๋ช ์ ์ด๋ฉฐ, ํ๋ก ํธ์๋ ์ํคํ ์ฒ์ ๊ฑด์ ์ฑ์ ํด์น๋ ์ฃผ๋ฒ์ด ๋ฉ๋๋ค.
How to Fix?
!important
ํค์๋ ์ฌ์ฉ์ ํผํ๊ณ CSS์ ์บ์ค์ผ์ด๋ ๋ฐ ๋ช
์๋ ์์น์ ์กด์คํ์ฌ ์คํ์ผ์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ค์์ ๊ทธ ๋ฐฉ๋ฒ๋ค์
๋๋ค:
- CSS ๋ช
์๋ ์ดํด ๋ฐ ํ์ฉ:
- ID(
a=100
), ํด๋์ค/์์ฑ/๊ฐ์ ํด๋์ค(b=10
), ํ์ /๊ฐ์ ์์(c=1
)์ ๊ฐ์ค์น๋ฅผ ์ดํดํ๊ณ , ํ์ํ ๊ฒฝ์ฐ์๋ง ์ ์ ํ ๋ช ์๋๋ฅผ ๊ฐ์ง ์ ๋ ํฐ๋ฅผ ์ฌ์ฉํ์ธ์. - ๋จ์ํ ์คํ์ผ์ ์ค๋ฒ๋ผ์ด๋ํ๊ธฐ ์ํด ๋ถํ์ํ๊ฒ ๋ณต์กํ๊ฑฐ๋ ๋์ ๋ช
์๋๋ฅผ ๊ฐ์ง ์
๋ ํฐ(
div#container .item.active span.text
)๋ฅผ ํผํ์ธ์.
- ID(
- BEM(Block Element Modifier) ๋๋ ์ ์ฌํ ๋ฐฉ๋ฒ๋ก ์ฌ์ฉ:
- BEM์ ํด๋์ค ๊ธฐ๋ฐ์ ๋ช
ํํ ๋ค์ด๋ฐ ์ปจ๋ฒค์
์ ์ ๊ณตํ์ฌ CSS ๋ช
์๋๋ฅผ ๋ฎ๊ณ ํํํ๊ฒ ์ ์งํ๋ ๋ฐ ๋์์ ์ค๋๋ค. ์ด๋
!important
์์ด๋ ์์ธก ๊ฐ๋ฅํ ์คํ์ผ ์ ์ฉ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. - ์:
.block__element--modifier
- BEM์ ํด๋์ค ๊ธฐ๋ฐ์ ๋ช
ํํ ๋ค์ด๋ฐ ์ปจ๋ฒค์
์ ์ ๊ณตํ์ฌ CSS ๋ช
์๋๋ฅผ ๋ฎ๊ณ ํํํ๊ฒ ์ ์งํ๋ ๋ฐ ๋์์ ์ค๋๋ค. ์ด๋
- CSS Custom Properties (๋ณ์) ํ์ฉ:
- ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฐ(์์, ํฐํธ ํฌ๊ธฐ, ๊ฐ๊ฒฉ ๋ฑ)์ CSS ๋ณ์๋ก ์ ์ํ์ฌ ์ค์์์ ๊ด๋ฆฌํ๊ณ ์ฌ์ฌ์ฉ์ฑ์ ๋์ผ ์ ์์ต๋๋ค. ๋ณ์ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์บ์ค์ผ์ด๋ ๊ท์น์ ๋ฐ๋ฅด๋ฏ๋ก
!important
์์ด๋ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. - ์:
--primary-color: #007bff;
color: var(--primary-color);
- ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฐ(์์, ํฐํธ ํฌ๊ธฐ, ๊ฐ๊ฒฉ ๋ฑ)์ CSS ๋ณ์๋ก ์ ์ํ์ฌ ์ค์์์ ๊ด๋ฆฌํ๊ณ ์ฌ์ฌ์ฉ์ฑ์ ๋์ผ ์ ์์ต๋๋ค. ๋ณ์ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์บ์ค์ผ์ด๋ ๊ท์น์ ๋ฐ๋ฅด๋ฏ๋ก
- ์ค์ฝํ๋(Scoped) CSS ์๋ฃจ์
์ฑํ:
- CSS Modules, Styled Components, Emotion, Vue์
scoped
CSS, Svelte์scoped
CSS ๋ฑ์ ๊ฐ ์ปดํฌ๋ํธ์ ์คํ์ผ์ด ์ ์ญ ์ค์ฝํ์ ์ํฅ์ ์ฃผ์ง ์๋๋ก ๋ก์ปฌ ์ค์ฝํ๋ฅผ ์์ฑํด์ค๋๋ค. ์ด๋ฅผ ํตํด ์คํ์ผ ์ถฉ๋์ ์์ฒ์ ์ผ๋ก ๋ฐฉ์งํ๊ณ!important
์ ํ์์ฑ์ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
- CSS Modules, Styled Components, Emotion, Vue์
- ์คํ์ผ ์ ์ฉ ์์ ๋ฐ ์์น ๊ณ ๋ ค:
- ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ญ ์คํ์ผ, ์ปดํฌ๋ํธ๋ณ ์คํ์ผ, ํ
๋ง ์คํ์ผ ๋ฑ CSS ํ์ผ์ ๋ก๋ฉ ์์์
<link>
ํ๊ทธ์ ์์น๋ฅผ ๊ณ ๋ คํ์ฌ ์๋ํ ๋๋ก ์คํ์ผ์ด ์บ์ค์ผ์ด๋๋๋๋ก ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ ์ญ ์คํ์ผ์ ๋จผ์ ๋ก๋ํ๊ณ , ๊ทธ ํ์ ์ปดํฌ๋ํธ๋ณ ์คํ์ผ์ ๋ก๋ํฉ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ญ ์คํ์ผ, ์ปดํฌ๋ํธ๋ณ ์คํ์ผ, ํ
๋ง ์คํ์ผ ๋ฑ CSS ํ์ผ์ ๋ก๋ฉ ์์์
- ์ธ๋ผ์ธ ์คํ์ผ ์ฌ์ฉ ์์ :
- ์ธ๋ผ์ธ ์คํ์ผ์ ๊ฐ์ฅ ๋์ ๋ช
์๋๋ฅผ ๊ฐ์ง๋ฏ๋ก (ID ์
๋ ํฐ๋ณด๋ค ๋์)
!important
์ ์ ์ฌํ๊ฒ ์บ์ค์ผ์ด๋ ๊ท์น์ ๋ฌด์ํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ๋์ ์ธ ์คํ์ผ๋ง์ด ํ์ํ ๊ฒฝ์ฐ, CSS ๋ณ์๋ฅผ ํ์ฉํ๊ฑฐ๋ JavaScript๋ก ํด๋์ค๋ฅผ ํ ๊ธํ๋ ๋ฐฉ์์ ์ฐ์ ์ ์ผ๋ก ๊ณ ๋ คํ์ธ์.
- ์ธ๋ผ์ธ ์คํ์ผ์ ๊ฐ์ฅ ๋์ ๋ช
์๋๋ฅผ ๊ฐ์ง๋ฏ๋ก (ID ์
๋ ํฐ๋ณด๋ค ๋์)
!important
๋ ๊ทนํ ์์ธ์ ์ธ ๊ฒฝ์ฐ(์: ์ฌ์ฉ์ ์ ๊ทผ์ฑ ์ค์ , ๋ธ๋ผ์ฐ์ ๊ธฐ๋ณธ ์คํ์ผ ๊ฐ์ ์ค๋ฒ๋ผ์ด๋ ๋ฑ)์๋ง ์ฌ์ฉํด์ผ ํ๋ฉฐ, ๊ทธ๋ง์ ๋ ์ฌ์ฉ ์ ์ถฉ๋ถํ ๊ฒํ ๊ฐ ํ์ํฉ๋๋ค.
Before Code (Bad)
/* beforeCode.css */
/* ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ๊ณตํต ์คํ์ผ */
.button {
background-color: blue;
color: white;
padding: 10px 20px;
border: none;
}
/* ํน์ ํ์ด์ง๋ ์ปดํฌ๋ํธ์์ ๋ฒํผ ์คํ์ผ์ ๋ณ๊ฒฝํ๋ ค ํ ๋ */
/* ์ด ์ฝ๋๋ .button์ด ๋ ์ผ๋ฐ์ ์ด๊ฑฐ๋ ๋์ค์ ์ ์ธ๋ ๊ฒฝ์ฐ ์ ์ฉ๋์ง ์์ ์ ์์ด !important๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. */
.promo-button {
background-color: red !important; /* ๐ฅ ๋ฌธ์ ์ : !important ๋จ์ฉ */
font-weight: bold;
}
/* React ์ปดํฌ๋ํธ ์์ */
/* PromoButton.js */
import React from 'react';
import './beforeCode.css'; // promo-button ์คํ์ผ์ ํฌํจ
function PromoButton() {
return (
<button className="button promo-button">
์ง๊ธ ๊ตฌ๋งคํ์ธ์!
</button>
);
}
export default PromoButton;
After Code (Good)
/* afterCode.css */
/* CommonButton.module.css (CSS Modules ์์) */
/* .button ํด๋์ค๋ CommonButton.module.css์ ์ ์๋์ด ์ค์ฝํ๋ฅผ ๊ฐ์ง๋๋ค. */
.button {
background-color: blue;
color: white;
padding: 10px 20px;
border: none;
}
/* PromoButton.module.css (CSS Modules ์์) */
/* .promoButton์ ์ด ํ์ผ ๋ด์์๋ง ์ ํจํ๋ฉฐ, ๊ณ ์ ํ ํด๋์ค ์ด๋ฆ์ผ๋ก ๋ณํ๋ฉ๋๋ค. */
.promoButton {
background-color: red;
font-weight: bold;
}
/* React ์ปดํฌ๋ํธ ์์ */
/* CommonButton.js */
import React from 'react';
import commonStyles from './CommonButton.module.css';
function CommonButton({ children }) {
return (
<button className={commonStyles.button}>
{children}
</button>
);
}
export default CommonButton;
/* PromoButton.js */
import React from 'react';
import CommonButton from './CommonButton';
import promoStyles from './PromoButton.module.css';
function PromoButton() {
return (
// CommonButton์ ์คํ์ผ ์์ promoButton์ ์คํ์ผ์ ๋ช
์์ ์ผ๋ก ์ถ๊ฐ
// CSS Modules๋ ์๋์ผ๋ก ๊ณ ์ ํ ํด๋์ค ์ด๋ฆ์ ์์ฑํ์ฌ ์ถฉ๋ ๋ฐฉ์ง
<CommonButton>
<span className={promoStyles.promoButton}>์ง๊ธ ๊ตฌ๋งคํ์ธ์!</span>
</CommonButton>
);
}
export default PromoButton;
/* ๋๋ ๋จ์ํ ๋ ๋์ ๋ช
์๋ (BEM ์ปจ๋ฒค์
ํ์ฉ) */
/* styles.css */
.button {
background-color: blue;
color: white;
padding: 10px 20px;
border: none;
}
.button--promo { /* Modifier ํด๋์ค๋ก ๋ช
์๋๋ฅผ ๋์ด์ง ์๊ณ ์๋ฏธ๋ฅผ ๋ช
ํํ */
background-color: red;
font-weight: bold;
}
/* React ์ปดํฌ๋ํธ ์์ */
/* PromoButton.js */
import React from 'react';
import './styles.css';
function PromoButton() {
return (
<button className="button button--promo"> {/* ๋ ํด๋์ค๋ฅผ ํจ๊ป ์ฌ์ฉ */}
์ง๊ธ ๊ตฌ๋งคํ์ธ์!
</button>
);
}
export default PromoButton;