젭(zep)을 통해 화상회의로 진행되었다.
ex) block-name__element-name--modifire-name
기본적인 BEM모델은 Block__Element_Modifire 의 형태를 가지고 있음
그런데 어떤 블로그 기사(MindBEMding)에서 유명해진 Block__Element--Modifire 형태도 널리 사용되고 있음
1. Block
- Block의 이름은 상태가 아닌 용도를 나타내야함(시멘틱한 의미를 가지고 있어야함)
- ex) 빨갛다, 크다 등의 형용사 red, big을 쓰는게 아닌 버튼, 상자, 에러 등의 용도를 담고 있는 문장 button, box, error등을 사용해야함
- Block은 환경에 영향을 미치지 않아야 한다. => Block자체에 대한 외부 지오메트리(?)Margin 또는 Block의 위치 Position 또는 fontSize등을 설정하지 않아야 한다.(Mix요소라면 얘기가 좀 다름)
- Block요소가 외부환경의 영향을 받게 된다면 기능적으로 독립적이어야 한다는 Block의 정의와 맞지 않게 됨
- Block들은 서로 중첩될 수 있다.
ex) header 안에 Menu block, Logo block, Search block, Auth block등이 중첩되어 묶여있다.(근데 header는 Block요소 아닌가요? -> Block요소 안에 또 Block요소가 존재하면 이를 Mix 하는 방법이 있음)
2. Element
- Block의 복합 부품으로 Block과 별도로 사용할 수 없음(block에 종속된 요소)
- Element도 상태가 아닌 용도를 나타내게 지어야 한다.
- Block요소에 언더바 두개( )를 추가해서 이름을 기재함
ex) BlockElement- Element는 서로 중첩될 수 있다.
- 하지만 Element는 Block의 일부분인 요소들이지 다른 Element의 부분이 아니다.
- Element는 반드시 Block의 엔티티(구성요소)여야 함
- 모든 Block이 반드시 Element를 가질 필요는 없다.
+) Block과 Element를 사용해야 하는 시기
- 구현된 다른 페이지 컴포넌트에 의존하지 않고 코드가 재사용된다 => Block
- 부모 엔티티(Block)없이 구분해서 사용할 수 없다 => Element
- 더 작은 부분으로 나뉘어져야 하는 Elements => Block/Mix == Block을 추가하는 방법(Mix방법)
- BEM에서 Elements의 Elements는 만들 수 없다.
3. Modifire
- Modifire는 Block 또는 Element의 모양, 상태 또는 동작을 정의함
- Modifier 이름은 모양, 동작, 상태를 나타냄
- 어떤 사이즈?, 어떤 테마? => --size--s, --theme--islands
- 어떻게 다른 것들과 다른가? => --disabled, --focused, --etc
- 어떻게 행동할 것인가? => --directions--left-top- Modifire는 Element처럼 홀로 사용되지 않음(Block또는 Element의 행동, 상태를 변경하는 것이지 대체하는 것이 아님)
Modyfire 두 가지 유형
1. boolean
- Boolean유형은 Modifire의 유무만 중요하고 그 값이 무관할때 사용됨
- 사용법은 일반적으로 --Modifire의 형식으로 입력한다.
ex) search-form__button--disabled
- key-value
- key-value유형은 Modifire값이 중요한 경우 사용
- 만약 사이즈를 의미하는 Modifire를 만들때 size를 key값, s, m, l를 value값으로 표현할 수 있음
- 사용 방법은 Modifire의 --key--value 형식으로 Modifire 연결자(?)를 2개 사용하면 된다.
ex) search-form__button--size--s- 동일한 key의 다른 value을 지닌 key-value형식 Modifire는 동시에 사용되어선 안된다.
ex)<form class="search-form--theme_island search-form--theme_museum"></div> <button class="search-form__button--size--s search-form__button--size--m"></button> <!-- 똑같은 key값(theme, size)를 가지면서 다른 value값(island != museum, s != m)을 가지고 있는 값이 중복 클래스로 들어가면 안됨. -->
- 동일한 key값으로 지은 선택자는 동일한 속성을 가지고 있을거임 => 동일한 선택자 끼리 속성이 겹치게 됨
- CSS의 Cascading(?)이라는 원칙으로 인해 마지막에 선언된 속성이 적용되긴 한데 좋은 방식이 아니므로 금지하는 편
4. Mix
- Block과 Element가 하나의 HTML 요소에 존재하는 것을 의미
- 코드 중복을 피하면서 여러 BEM 엔티티의 동작과 스타일을 결합
- 기존 BEM 엔티티를 기반으로 의미상 새로운 인터페이스 컴포넌트를 작성
- 가급적 상세도를 높이지 않고 Block의 독립성을 유지할 수 있음
ex)<div class="header"> <!-- header는 header__search-form을 통해 연결된 속성을 부여하고 search-form을 사용해 search-form만의 독립적인 속성을 부여 --> <div class="search-form header__search-form"></div> </div>
참고
https://www.youtube.com/watch?v=B70h37mpD74 우아한테크코스 BEM방법론 발표
https://nykim.work/15 BEM방법론 설명 블로그