BEM 방법론: 블록, 요소, 수정자
Block__Element--Modifier 패턴으로 CSS 클래스를 지정해 자체적으로 의미가 드러나고 특이도가 낮으며 재사용 가능한 컴포넌트 스타일을 만듭니다.
BEM 방법론: 블록, 요소, 수정자은(는) CoddyKit의 무료 Frontend Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Frontend Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Frontend Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
BEM이란 무엇입니까
BEM(Block, Element, Modifier)은 스타일을 예측 가능하고 재사용 가능하며 충돌 없이 만드는 CSS 명명 규칙입니다. 클래스 이름에 컴포넌트 구조를 표현하므로 명시도 경쟁과 우발적인 스타일 충돌을 없앱니다.
블록 — 독립적인 컴포넌트
블록은 독립적으로 사용할 수 있고 재사용 가능한 컴포넌트입니다. 예를 들어 card, button, nav가 있습니다. 클래스 이름은 블록 이름을 소문자와 하이픈으로 작성합니다.
<div class="card">...</div>
<button class="btn">...</button>
<nav class="main-nav">...</nav>요소 — 블록의 구성 부분
요소는 자체적으로는 의미가 없는 블록의 구성 부분입니다. 밑줄 두 개를 사용하십시오: block__element.
<div class="card">
<img class="card__image" src="..." alt="...">
<div class="card__body">
<h2 class="card__title">Title</h2>
<p class="card__description">...</p>
</div>
<footer class="card__footer">
<a class="card__link" href="...">Read more</a>
</footer>
</div>수정자 — 변형과 상태
수정자는 블록이나 요소의 모양 또는 동작을 변경합니다. 하이픈 두 개를 사용하십시오: block--modifier 또는 block__element--modifier.
<button class="btn">Default</button>
<button class="btn btn--primary">Primary</button>
<button class="btn btn--danger btn--large">Large Danger</button>
<div class="card card--featured">...</div>
<nav class="main-nav main-nav--collapsed">...</nav>BEM CSS 규칙
BEM 클래스는 명시도가 낮고 서로 동일합니다(각각 클래스 하나). 따라서 스타일을 쉽게 재정의할 수 있습니다. ID나 중첩된 요소 선택자는 절대 사용하지 마십시오. 명시도가 예측할 수 없게 높아집니다.
/* Good BEM CSS */
.card { /* ... */ }
.card__title { /* ... */ }
.card--featured { /* ... */ }
/* Avoid */
.card h2 { /* targets any h2 in .card — too broad */ }
#featured-card { /* high specificity — hard to override */ }Sass를 사용한 BEM
Sass의 & 부모 선택자를 사용하면 BEM을 더 간결하게 작성할 수 있습니다. 컴파일된 CSS는 일반 BEM과 동일합니다.
.card {
padding: 16px;
&__title {
font-size: 1.25rem;
font-weight: 600;
}
&__body {
color: var(--color-text-secondary);
}
&--featured {
border: 2px solid var(--color-brand);
}
}새 블록을 만드는 경우
컴포넌트를 독립적으로 사용할 수 있고 다양한 맥락에서 재사용할 수 있다면 새 블록을 만드십시오. 특정 블록 내부에서만 의미가 있는 구성 부분이라면 요소를 만드십시오.
BEM은 중첩을 피합니다
BEM은 HTML과 CSS에서 깊은 중첩을 권장하지 않습니다. 요소 안에 있는 요소도 block__element__subelement이 아니라 여전히 block__element입니다.
<!-- Correct: -->
<div class="card">
<div class="card__meta">
<time class="card__date">Jan 1</time>
</div>
</div>
<!-- Wrong: -->
<div class="card">
<div class="card__meta">
<time class="card__meta__date">Jan 1</time> <!-- 3 levels = wrong -->
</div>
</div>BEM과 JavaScript
동작 연결 지점에는 JavaScript 전용 클래스를 별도로 사용하십시오: js- 접두사입니다. 이렇게 하면 스타일과 스크립트가 분리되므로 BEM 클래스의 이름을 바꿔도 JavaScript 동작이 중단되지 않습니다.
<button class="btn btn--primary js-submit">Submit</button>
// JS: select by js- class
document.querySelector('.js-submit').addEventListener('click', handleSubmit);BEM 블록 혼합하기
한 요소에 여러 블록 클래스를 적용하면 블록을 결합하지 않고도 맥락에 맞는 스타일을 지정할 수 있습니다.
<button class="btn btn--primary form__submit">Submit</button>BEM의 한계
클래스 이름이 길어질 수 있습니다. BEM은 전역 스타일의 일관성이 중요한 대규모 팀과 디자인 시스템에 가장 적합합니다. 범위가 지정된 스타일을 사용하는 컴포넌트 프레임워크(React/Vue)에서는 BEM 네임스페이스의 이점이 그다지 중요하지 않습니다.
빠른 확인
BEM에서 card__title--truncated는 무엇을 나타냅니까?
요약: BEM
블록: 독립적인 컴포넌트입니다. 요소(밑줄 두 개 __): 블록의 구성 부분입니다. 수정자(하이픈 두 개 --): 변형 또는 상태입니다. 명시도는 낮고 서로 동일합니다. ID 선택자와 깊은 중첩을 피하십시오. JavaScript 연결 지점에는 js- 접두사를 사용하십시오. Sass의 &로 BEM을 더 간결하게 작성할 수 있습니다. 대규모 팀과 디자인 시스템에 매우 적합합니다.
자주 묻는 질문
“BEM 방법론: 블록, 요소, 수정자” 강의는 무료인가요?
네 — “BEM 방법론: 블록, 요소, 수정자” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Frontend Academy 강의 전체를 잠금 해제할 수 있습니다. Frontend Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“BEM 방법론: 블록, 요소, 수정자”에서 뭘 배우나요?
Block__Element--Modifier 패턴으로 CSS 클래스를 지정해 자체적으로 의미가 드러나고 특이도가 낮으며 재사용 가능한 컴포넌트 스타일을 만듭니다. 브라우저에서 직접 실행하는 실습 코드로 Frontend Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Frontend Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Frontend Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“BEM 방법론: 블록, 요소, 수정자” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Frontend Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Frontend Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- BEM 방법론: 블록, 요소, 수정자
- CSS Modules: 범위가 지정된 클래스 이름
- CSS-in-JS: Styled-components와 Emotion
- Tailwind CSS 유틸리티 우선 접근법