사전스터디 페이지를 작업하면서 BEM에 대해 알게 되었고, Portfolio 작업하는 동안 BEM을 지키면서 class명을 짓기로 했다!
사전스터디를 작업하면서 class명을 그냥 느낌 가는대로 정하다 보니, 나중에 CSS 스타일링 할때마다 html 파일을 열어서 확인해야 하는 일이 은근 시간도 많이 잡아먹고 심적으로 지치게 했다.....😩
💁🏻♀️ CSS preprocessor(Sass, Less 등)을 사용하면 BEM이나 OOCSS같은 방법론은 사용할 일이 없다고 하지만, 아직 Sass는 커녕 CSS도 어려운걸....
.header__navigation--navi-text {
color: red;
}
위 에시에서 header
는 Block, naviagtion
은 Element, navi-text
는 Modifier를 의미한다.
작명 규칙 (Naming Convention)
- 개발, 디버깅, 유지보수를 위하여 CSS 선택자의 이름을 가능한 한 명확하게 만든다.
- 소문자, 숫자만을 이용해서 작명한다.
- 여러단어의 조합은 싱글 하이픈(-)으로 연결하여 작명한다.
- 전체적인 문법은 요런 너낌
(class=”block__elemen--modifier”)
__
element 형태로 사용 (더블 언더바)__
item, header__
title …__
element--
modifier, block--
modifier 형태로 사용 (더블 하이픈)⇒ 이렇게! card는 block이고, card안의 요소들은 __로 네이밍!
만약 card의 디자인이 2가지 버전이라면?!
이렇게 요소가 아닌, 수식어 -- (더블 하이픈)으로 구분해준다!
만약 이렇게 여러개의 card를 사용해야 한다면?!
.cards => card가 담긴 container
.cards__card => 각각의 card
.cards__card__title
.cards__card__description
이렇게 해야 할까???
🙅🏻♀️NO!!!!
물론 위의 방법은 무조건 틀렸다는건 아니지만... BEM의 목적은 인터페이스 요소의 component들을 block 레벨로 나누어 쉽게 관리하는 것이다.
card
는 그 자체로 하나의 component이고,cards
는card
라는 component를 묶어주는것에 불과하므로 아래처럼 작성하는게 훨씬 효율적이고 작성해야 하는코드의 양도 줄어든다..cards => card가 담긴 container .card => 각각의 card .card__title .card__description
__
element 형태로 사용 가능__
element 으로 여백이나 위치 등 스타일을 지정하고 block1은 독립적으로 유지할 수 있다.<div class=”header”>
<div class=”button button--state-success”></div>
</div>
참고하기 좋은 사이트
BEM: http://getbem.com/introduction/
BEM 101 by CSS-Tricks: https://css-tricks.com/bem-101/
CSS 방법론에는 BEM 외에도 SMACSS, OOCSS 등이 더 있는데 이건 다음에 다시 정리하기로!!
잘봤습니다.