2014. 10. 9. 01:43

BEM(Block-Element-Modifier)

- HTML 마크업 모듈화

- block요소를 독립적이고, 재사용 가능한 모듈이라는 개념으로 접근

- 대표적인 사이트 tuts+

- 예).block(전체를 감싸고 있는 블록요소)__element(내부 요소)--modifier(기능)

prefix 붙여 일종의 네임스페이스개념으로 사용

- 실제 서비스를 하면 HTML의 구조가 바뀌는 일이 다반사

- 탐색레벨은 낮고 단순하게 유지하는 것이 유지보수하기 좋음

- 최근 브라우저 테스트 자동화에 대한 요구가 커지고 있음

- 쿼리를 단순하게 하기 위해 길고 유니크한 클래스명을 사용하는 것이 좋음


장점

-class name 중복방지

-직관적 : .gnb__home--active .icon-home

-전제 DOM tree를 다시 보지 않아도 됨


환경에 대한 변경을 표시해주는 클래스명을 

root node(delegate parent)에 부여하자


1)<html class="js lt-ie10 mobile">

: js, css 지원여부와 데스크탑/모바일 등의 client 접속 환경정보

2)<body class="log-in myinfo abtest-a">

: 접근중인 컨트롤러, 실행중인 액션, 로그인, AB테스트의 대상 여부 등

3)<div class="msgbox msgbox__unread">

:BEM에서 block요소 - 개별 모듈의 상태에 대한 정보를 담는다.


페이지의 상태값을 javascript로 전달할 방법이 필요


- 자바스크립트 전역변수나 <input type="hidden">사용을 지양하자.

=> HTML5스펙의 data-* attribute를 사용하자!(장점보기)



CSS속성은 한줄에 하나만 선언!

- 가독성이 좋고 어느 속성을 어느 위치에 넣을 것인지 고민할 필요 없음

- diff 할때 좋음

빌드타임에 minify하는 전략


BEM 예


===============================================================

.block {}

.block__element {}

.block--modifier {}

===============================================================

.site-search {} /* Block */

.site-search__field {} /* Element */

.site-search--full {} /* Modifier */

===============================================================

.person {}

.person__hand {}

.person--female {}

.person--female__hand {}

.person__hand--left {}

===============================================================

<form class="site-search  site-search--full">

    <input type="text" class="site-search__field">

    <input type="Submit" value ="Search" class="site-search__button">

</form>

===============================================================

.media {}

.media__img {}

.media__img--rev {}

.media__body {}

===============================================================

<div class="media">

    <img src="logo.png" alt="Foo Corp logo" class="media__img--rev">

    <div class="media__body">

        <h3 class="alpha">Welcome to Foo Corp</h3>

        <p class="lede">Foo Corp is the best, seriously!</p>

    </div>

</div>

===============================================================

<div class="content">

    <h1 class="content__headline">Lorem ipsum dolor...</h1>

</div>logo {}

===============================================================

.site-logo {}

.site-logo--xmas {}

===============================================================

.header__logo {} 

.header__tagline {} 

.header__searchbar {}

.header__navigation {}

===============================================================

.header__navigation {}

.header__navigation--secondary {}

===============================================================

.label {}

.label--alert {}

===============================================================

with Sass

.header__navigation { 

    background: #008cba; 

    padding: 1rem 0; 

    margin: 2rem 0; 

    text-transform: uppercase; 

    } 

-----------------------------------------------------------------------------------------------------------     

.header__navigation--secondary { 

    @extend .header__navigation;

    background: #dfe0e0; 

    }

-----------------------------------------------------------------------------------------------------------   

.label { 

    background: #eee; 

    border-radius: 505; 

    color: #333; 

    font-size: 1rem; 

    } 

-----------------------------------------------------------------------------------------------------------   

.label--alert { 

    @extend .label; 

    background: #da4531; 

    color: #fff; 

    }

-----------------------------------------------------------------------------------------------------------   


하지만 어떤 BEM카테고리에 들어가지 않는 클래스는 굳이 끼워맞추지 않음

.caps { text-transform: uppercase; } 

.site-logo {}


'프로그래밍 > Node.js' 카테고리의 다른 글

nodejs 배우기  (0) 2014.10.10
Node.js 시작  (0) 2014.10.09
Posted by 루피아빠