BEM(Block, Element, Modifier)์ CSS๋ฅผ ๋ชจ๋ํํ๊ณ ๊ด๋ฆฌํ๋ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ๋ก ์ค ํ๋์ ๋๋ค. ํ์ง๋ง BEM์ ํ๋ก์ ํธ์ ์ฑ๊ณต์ ์ผ๋ก ์์ฐฉ์ํค๊ธฐ ์ํด์๋ ๋ช ๊ฐ์ง ์ค์ ํ๊ณผ SCSS ํ์ฉ ์ ๋ต์ ์์งํด์ผ ํฉ๋๋ค.์ด ๊ธ์์๋ BEM์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ, ๊ฐ๋ฐ์๋ค์ด ํํ ์ ์ง๋ฅด๋ ์ค์ 3๊ฐ์ง๋ฅผ ์๋ ค๋๋ฆฝ๋๋ค.
1. ๐ป SCSS์์ BEM์ ํ์ฉํ๋ ๋ฒ: ๊ฐ๊ฒฐํ ๋ค์คํ ์ ๋ต
SCSS๋ CSS์ ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์ฒ๋ฆฌ๊ธฐ์ ๋๋ค. SCSS์ ๋ค์คํ (Nesting)๊ณผ ์ฐํผ์๋(&)๋ฅผ ํ์ฉํ๋ฉด BEM์ ๊ธด ํด๋์ค๋ช ์ ํจ์ฌ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ๋ฉด์๋ BEM ๊ท์น์ ์๋ฒฝํ๊ฒ ์ค์ํ ์ ์์ต๋๋ค.
SCSS๋ฅผ ์ด์ฉํ BEM ๋ช ๋ช
SCSS์์ ์ฐํผ์๋(&)๋ ๋ถ๋ชจ ์ ํ์๋ฅผ ์ฐธ์กฐํ๋ฉฐ, ์ด๋ฅผ ์ด์ฉํ์ฌ BEM์ ๊ตฌ๋ถ์(__, --)๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค.
| BEM ๊ตฌ์ฑ ์์ | SCSS ํํ ๋ฐฉ๋ฒ | ์ปดํ์ผ ๊ฒฐ๊ณผ (์์) |
| Block | .card { ... } | .card |
| Element | &__title { ... } | .card__title |
| Modifier | &--dark { ... } | .card--dark |
์์ฑ ์์
.button {
display: inline-block;
padding: 10px 20px;
background-color: #007bff;
color: white;
// Element: button__icon
&__icon {
margin-right: 5px;
}
// Modifier: button--primary
&--primary {
background-color: #28a745;
}
}
โจ ์ฅ์ : ์ฝ๋ฉ ์ ํด๋์ค๋ช ๋ฐ๋ณต์ ์ค์ฌ ์์ฐ์ฑ์ด ํฅ์๋๋ฉฐ, ์ปดํ์ผ๋ CSS๋ BEM ๊ท์น์ ์๋ฒฝํ ๋ฐ๋ฅด๋ฏ๋ก ์ ์ง๋ณด์์ฑ์ด ๋์ต๋๋ค.
2. ๐ BEM ์ ์ฉ ์ ๋ฐ๋์ ํผํด์ผ ํ 3๊ฐ์ง ์ฃผ์์
BEM์ ํต์ฌ ์์น์ ๋ฒ์ด๋๋ฉด ์คํ๋ ค CSS๊ฐ ๋ณต์กํด์ง๊ฑฐ๋ ์๋์น ์์ ์ถฉ๋์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ค์ ์ธ ๊ฐ์ง ์ค์๋ฅผ ํผํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
โ ๏ธ ์ฃผ์์ 1: Element์ ์ค์ฒฉ์ ํผํ๊ณ ๊น์ด๋ 1๋จ๊ณ๋ก ์ ์งํ๋ผ
BEM์ ํํํ ๊ตฌ์กฐ(Flat Structure)๋ฅผ ์งํฅํฉ๋๋ค. Element๋ ํญ์ Block์ ์ง์ ์์์ฒ๋ผ ๋ช ๋ช ๋์ด์ผ ํ๋ฉฐ, block__element__subelement์ ๊ฐ์ ๊น์ ์ค์ฒฉ์ ํผํด์ผ ํฉ๋๋ค.
SCSS ์ฌ์ฉ ์ ์ฃผ์: SCSS ๋ค์คํ ์ ์ฌ์ฉํ ๋๋, &__item ์์ ๋ค์ &__link๋ฅผ ๋ค์คํ ํ์ง ๋ง๊ณ , .menu__item๊ณผ .menu__link๋ฅผ .menu ๋ธ๋ก ํ์์ ๋๋ํ ์์ฑํด์ผ ํฉ๋๋ค.
โ ๏ธ ์ฃผ์์ 2: Modifier๋ ์๋ณธ ํด๋์ค์ ๋ฐ๋์ ์ถ๊ฐํ์ฌ ์ฌ์ฉํ๋ผ
Modifier๋ ์ํ ๋ณ๊ฒฝ๋ง์ ์ํ ํ๋๊ทธ์ด๋ฏ๋ก, ํญ์ ์๋ณธ ํด๋์ค(Block ๋๋ Element)์ ํจ๊ป ์ฌ์ฉํด์ผ ํฉ๋๋ค.
<button class="button button--disabled">
</button>
CSS: Modifier ํด๋์ค๋ง ๋จ๋ ์ผ๋ก ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ ์คํ์ผ์ด ๊นจ์ง๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
โ ๏ธ ์ฃผ์์ 3: CSS ์ ํ์(Selector)์ ๋ณต์ก๋๋ฅผ ๋์ด์ง ๋ง๋ผ
BEM์ ๋ฎ์ ๋ช ์๋๋ฅผ ์ ์งํ์ฌ ์คํ์ผ ์ฌ์ ์(Override)๋ฅผ ์ฝ๊ฒ ๋ง๋๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ๋ฐ๋ผ์ ํ๊ทธ ์ ํ์๋ > ๊ฐ์ ๋ณต์กํ ๊ฒฐํฉ์๋ฅผ BEM ํด๋์ค์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ์ ์ง์ํด์ผ ํฉ๋๋ค.
SCSS ์ฌ์ฉ ์ ์ฃผ์:
// โ ์ง์: ๋ณต์กํ ์ ํ์๋ก ์ปดํ์ผ๋จ
.card {
a { /* ... */ }
}
// โ
๊ถ์ฅ: ๋จ์ผ BEM ํด๋์ค๋ก ๋ช
ํํ๊ฒ ์ง์
.card {
&__link { /* ... */ }
}
๐ ํต์ฌ: BEM ํด๋์ค(.block-name) ํ๋๋ง์ผ๋ก ์คํ์ผ์ ์ง์ ํ์ฌ CSS์ ๋ช ์๋๋ฅผ ๋ฎ๊ฒ ์ ์งํ๋ ๊ฒ์ด BEM์ ์ด์ ์ ๊ทน๋ํํ๋ ๊ธธ์ ๋๋ค.
5. ๊ฒฐ๋ก
BEM ๋ฐฉ๋ฒ๋ก ์ SCSS๋ฅผ ๋ง๋ฌ์ ๋ ๊ฐ๋ฐ ์์ฐ์ฑ์ด ๊ทน๋ํ๋ฉ๋๋ค. ์ฐํผ์๋์ ๋ค์คํ ์ ํ์ฉํ์ฌ ์ฝ๋ฉ์ ๋น ๋ฅด๊ฒ ํ๋, ํํํ ๊ตฌ์กฐ ์ ์ง, Modifier์ ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ, ๋จ์ผ ํด๋์ค ์ ํ์ ์ฌ์ฉ์ด๋ผ๋ BEM์ ์ธ ๊ฐ์ง ํต์ฌ ์์น์ ์งํจ๋ค๋ฉด, ์ด๋ค ๋๊ท๋ชจ ํ๋ก์ ํธ์์๋ ๊ฒฌ๊ณ ํ๊ณ ์ ์ง๋ณด์๊ฐ ์ฌ์ด CSS ๊ตฌ์กฐ๋ฅผ ํ๋ณดํ ์ ์์ต๋๋ค.
