Contents
see List작성일 2025. 11. 30.
BEM 방법론 - CSS 클래스 네이밍
BEM(Block Element Modifier)은 CSS 클래스 이름을 체계적으로 작성하는 방법론입니다. 대규모 프로젝트에서 일관성 있고 재사용 가능한 컴포넌트를 만드는 데 도움이 됩니다.
언제 사용하나요?
- 팀 프로젝트에서 일관된 네이밍 규칙 필요 시
- 컴포넌트 기반 개발
- CSS 충돌 방지가 필요한 경우
- 유지보수가 쉬운 스타일시트 작성
BEM 구조
Block__Element--Modifier
Block: 독립적으로 의미 있는 컴포넌트
Element: Block의 구성 요소 (__)
Modifier: 상태나 변형 (--)기본 예시
<!-- Block -->
<nav class="menu">
<!-- Element -->
<ul class="menu__list">
<li class="menu__item">
<!-- Element with Modifier -->
<a class="menu__link menu__link--active">홈</a>
</li>
<li class="menu__item">
<a class="menu__link">소개</a>
</li>
</ul>
</nav>
<!-- CSS -->
<style>
.menu { }
.menu__list { }
.menu__item { }
.menu__link { }
.menu__link--active { }
</style>카드 컴포넌트 예시
<!-- HTML -->
<article class="card card--featured">
<img class="card__image" src="...">
<div class="card__content">
<h2 class="card__title">제목</h2>
<p class="card__description">설명...</p>
<button class="card__button card__button--primary">
자세히 보기
</button>
</div>
</article>
<!-- CSS -->
.card {
border: 1px solid #ddd;
border-radius: 8px;
overflow: hidden;
}
.card--featured {
border-color: #3498db;
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
}
.card__image {
width: 100%;
height: 200px;
object-fit: cover;
}
.card__content {
padding: 16px;
}
.card__title {
font-size: 18px;
margin-bottom: 8px;
}
.card__button {
padding: 8px 16px;
border: 1px solid #ccc;
background: white;
}
.card__button--primary {
background: #3498db;
color: white;
border: none;
}버튼 컴포넌트
<!-- 다양한 버튼 변형 -->
<button class="btn">기본</button>
<button class="btn btn--primary">기본</button>
<button class="btn btn--secondary">보조</button>
<button class="btn btn--large">큰 버튼</button>
<button class="btn btn--primary btn--large">큰 기본</button>
<button class="btn btn--disabled">비활성화</button>
<!-- 아이콘 포함 -->
<button class="btn btn--icon">
<span class="btn__icon">🔍</span>
<span class="btn__text">검색</span>
</button>
.btn { }
.btn--primary { }
.btn--secondary { }
.btn--large { }
.btn--small { }
.btn--disabled { }
.btn__icon { }
.btn__text { }SCSS와 함께 사용
.card {
border: 1px solid #ddd;
&--featured {
border-color: #3498db;
}
&__image {
width: 100%;
}
&__title {
font-size: 18px;
&--highlight {
color: #e74c3c;
}
}
&__button {
padding: 8px 16px;
&--primary {
background: #3498db;
}
}
}네이밍 규칙
| 규칙 | 좋은 예 | 나쁜 예 |
|---|---|---|
| 소문자 사용 | card__title | Card__Title |
| 하이픈으로 연결 | search-form | searchForm |
| 의미 있는 이름 | user-avatar | img-round |
| 중첩 제한 | card__title | card__header__title |
주의사항
- Element는 Block에만 속함 (Element의 Element 금지)
- Block은 독립적으로 사용 가능해야 함
- Modifier는 단독 사용 불가 (기본 클래스와 함께)
- 너무 깊은 중첩은 새 Block으로 분리
잘못된 예시
<!-- X 잘못됨: Element의 Element -->
<div class="card__header__title"></div>
<!-- O 올바름: 새 Block으로 분리 -->
<div class="card">
<div class="card-header">
<h2 class="card-header__title"></h2>
</div>
</div>
<!-- X 잘못됨: Modifier 단독 사용 -->
<button class="btn--primary"></button>
<!-- O 올바름: 기본 클래스와 함께 -->
<button class="btn btn--primary"></button>html
| No | 작성일 | Title |
|---|---|---|
| 3364 | 2026. 08. 16. | HTML 폼 오류를 누구나 이해하게 만드는 방법: label·aria-describedby·aria-live 실전 가이드 |
| 3332 | 2026. 08. 07. | CSS @layer로 스타일 충돌 줄이기: 대규모 웹 프로젝트 우선순위 설계 가이드 |
| 3300 | 2026. 07. 30. | CSS Container Query 실전 적용: 컴포넌트가 놓인 영역에 맞춰 반응형 만들기 |
| 3269 | 2026. 07. 22. | 접근성 있는 모달 만들기: HTML dialog와 포커스 관리 실전 가이드 |
| 3241 | 2026. 07. 14. | 반응형 이미지 최적화: picture·srcset·sizes로 모바일 전송량 줄이기 |
| 3186 | 2026. 07. 05. | HTML Popover API로 자바스크립트 드롭다운 메뉴 줄이기 |
| 3144 | 2026. 06. 27. | CSS 컨테이너 쿼리 운영 가이드: 화면이 아니라 컴포넌트 폭에 맞춰 레이아웃 바꾸기 |
| 3088 | 2026. 06. 19. | 접근성 있는 모달 창 구현: dialog, focus, 닫기 동작을 함께 설계하기 |
| 2999 | 2026. 06. 11. | HTML 폼 검증 운영 가이드: 브라우저 기본 검증과 서버 검증을 함께 설계하기 |
| 2943 | 2026. 06. 03. | CSS 컨테이너 쿼리 실전 적용: 화면이 아니라 컴포넌트 너비에 맞춰 카드 레이아웃 바꾸기 |