BEM은 Blcok, Element, Modifier를 뜻한다.
저 세 가지로 구성된 이름을 짓는 것을 의미하며, 각각 __와 --로 구분한다.
.header__navigation--navi-text {
color: red;
}
위 코드에서
header는 Block,
naviagtion은 Element,
navi-text는 Modifier가 된다.
BEM은 기본적으로 ID를 사용하지 않으며, class만을 사용한다.
또, '어떻게 보이는가'가 아니라 '어떤 목적인가'에 따라 이름을 짓는다.
예를 들어, 에러 메시지를 띄우는 P 태그에게는 .red가 아닌, .error라는 이름을 줘야한다.
이름을 연결할 때는 block-name과 같이 하이픈 하나를 써서 단어를 연결한다.
재사용 가능한 기능적으로 독립적인 페이지 컴포넌트(A functionally independent page component that can be reused)를 블럭이라고 부른다.
예를 들어, Logo 블럭은 어딘가에 종속되지 않는다. 헤더에 쓰일 수도 있고, 푸터에 쓰일 수도 있고, 여기저기 붙였다 떼었다 할 수 있다.
이렇게 재사용할 수 있는 요소를 블럭이라고 한다.
엘리먼트는 블럭을 구성하는 단위이다.
블럭은 독립적인 형태인 반면, 엘리먼트는 의존적인 형태이다. 자신이 속한 블럭 내에서만 의미를 가지기 때문에 블럭 안에서 떼어다 다른 데 쓸 수 없다.
<form class="search-form">
<input class="search-form__input"/>
<button class="search-form__button">Search</button>
</form>
위 예시에서 .search-form은 블럭이고, .search-forminput과 .search-formbutton은 엘리먼트이다.
저 search-form이란 블럭은 떼어내서 여기저기 재사용이 가능하다.
하지만 내부의 input과 button은 검색을 위한 인풋창이자 버튼이기 때문에, search-form 안에서만 존재 의미가 있는 엘리먼트이다.
엘리먼트 또한 중첩이 가능하다.
.block > .block__element1 > .block__element2 같은 형태가 가능하다는 뜻이다.
그러나 .block__element2를 .block__element1의 하위 엘리먼트로 보지 않고, 똑같이 .block의 엘리먼트로 취급한다.
<form class="search-form">
<div class="search-form__content">
<input class="search-form__content__input"/>
<button class="search-form__content__button">Search</button>
</div>
</form>
<form class="search-form">
<div class="search-form__content">
<input class="search-form__input"/>
<button class="search-form__button">Search</button>
</div>
</form>
모디파이어는 블럭이나 엘리먼트의 속성을 담당한다.
생긴 게 조금 다르거나, 다르게 동작하는 블럭이나 엘리먼트를 만들 때 사용하면 된다.
<ul class="tab">
<li class="tab__item tab__item--focused">탭 01</li>
<li class="tab__item">탭 02</li>
<li class="tab__item">탭 03</li>
</ul>
<div class="column">
<strong class="title">일반 로그인</strong>
<form class="form-login form-login--theme-normal">
<input type="text" class="form-login__id"/>
<input type="password" class="form-login__password"/>
</form>
</div>
<div class="column">
<strong class="title title--color-gray">VIP 로그인 (준비중)</strong>
<form class="form-login form-login--theme-special form-login--disabled">
<input type="text" class="form-login__id"/>
<input type="password" class="form-login__password"/>
</form>
</div>
결론 : SASS랑 쓰면 좋다.