Skip to content

Latest commit

ย 

History

History
272 lines (175 loc) ยท 6.5 KB

CSS-BEM.md

File metadata and controls

272 lines (175 loc) ยท 6.5 KB

BEM (Block Element Modifier)

BEM ์˜๋ฏธ

BEM์€ Block, Element, Modifer๋กœ ๊ตฌ์„ฑ๋œ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ง“๋Š” CSS ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค.

BEM ๋ฐฉ๋ฒ•๋ก ์€ id์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ  ์˜ค์ง class๋ช…์—๋งŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

BEM ์˜๋ฏธ

Block Element Modifier
์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋…๋ฆฝ์ ์ธ ๋ธ”๋ก ๋ธ”๋ก์„ ๊ตฌ์„ฑํ•˜๋Š” ์ข…์†์ ์ธ ํ•˜์œ„ ์š”์†Œ ๋ธ”๋ก ๋˜๋Š” ์š”์†Œ์˜ ๋ณ€ํ˜•
(๋ชจ์–‘, ์ƒํƒœ, ๋™์ž‘)

BEM ์˜๋ฏธ


BEM ํŠน์ง•

  1. ์˜๋ฏธ๋ก ์  ํด๋ž˜์Šค ์„ ํƒ์ž ์ž‘๋ช… ๊ทœ์น™

    ์•ฝ์–ด ์‚ฌ์šฉ ํ”ผํ•˜๊ธฐ

  2. ๋‹ค๋ฅธ ํ˜•์‹์˜ ์„ ํƒ์ž ์‚ฌ์šฉ์„ ์ œํ•œ

    --, __ ํ˜•์‹ ์ด์™ธ์— ๋‹ค๋ฅธ ํ˜•์‹์˜ ๊ธฐํ˜ธ ์‚ฌ์šฉ ์ œํ•œ

  3. ์ „์—ญ์—์„œ ์œ ์ผํ•œ ์ด๋ฆ„ ๊ถŒ์žฅ

  4. ๋‚ฎ์€ ์„ ํƒ์ž ํŠน์ด์„ฑ ์œ ์ง€

  5. HTML/CSS ์—ฐ๊ฒฐ์ด ๋Š์Šจ, ๋ณ‘๋ ฌ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ


์ž‘๋ช… ๊ทœ์น™์„ ์ž˜๋ชป ๊ด€๋ฆฌํ•œ ์‚ฌ๋ก€

  • ์˜๋ฏธ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์—†๋Š” ์ž‘๋ช…

    .cnt {...}
    .uw {...}
    .sa {...}

  • ์ „์—ญ ๊ณต๊ฐ„์„ ์„ ์ ํ•œ ํ”ํ•œ ์ด๋ฆ„

    .top {...}
    .content {...}
    .button {...}

CSS ์„ ํƒ์ž ์šฐ์„ ์ˆœ์œ„ ๊ทœ์น™ (CSS selector specificiy)

id class, [attr], :class type, ::element
0 0 0

์˜ˆ์‹œ

CSS ์„ ํƒ์ž ์šฐ์„ ์ˆœ์œ„
a 0, 0, 1 โžœ 001
.a 0, 1, 0 โžœ 010
#a 1, 0, 0 โžœ 100
#a a 1, 0, 1, โžœ 101
#a.a a 1, 1, 1 โžœ 111
#a#b[href]::before 2, 1, 1 โžœ 211

์Šคํƒ€์ผ์‹œํŠธ ๋ถ„์„

์•„๋ž˜์˜ ๊ทธ๋ž˜ํ”„๋Š” cssstats.com์—์„œ ์ œ๊ณตํ•˜๋Š” ์›น ์‚ฌ์ดํŠธ ์„ ํƒ์ž ์‚ฌ์šฉ ํ˜„ํ™ฉ ๋ถ„์„ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋ถ„์„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ์˜ˆ์‹œ A ์‚ฌ์ดํŠธ

    ๋‚˜์œ ์Šคํƒ€์ผ์‹œํŠธ ์˜ˆ์‹œ

ํ‰๊ท  ์„ ํƒ์ž ์ ์ˆ˜: 58์ 
์ตœ๋Œ€ ์ ์ˆ˜: 410์ 


  • ์˜ˆ์‹œ B ์‚ฌ์ดํŠธ

    ์ข‹์€ ์Šคํƒ€์ผ์‹œํŠธ ์˜ˆ์‹œ

ํ‰๊ท  ์„ ํƒ์ž ์ ์ˆ˜: 14์ 
์ตœ๋Œ€ ์ ์ˆ˜: 101์ 


์„ ํƒ์ž ์ ์ˆ˜๋Š” ๋‚ฎ๊ฒŒ ์œ ์ง€ํ•˜๊ณ  020 ์ˆ˜์ค€์œผ๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ ์‚ฌ์ดํŠธ๋“ค์„ ๋น„๊ตํ•ด๋ณด๋ฉด B ์‚ฌ์ดํŠธ๊ฐ€ A ์‚ฌ์ดํŠธ๋ณด๋‹ค ๋” ๊ด€๋ฆฌ๊ฐ€ ์ž˜ ๋˜๊ณ  ์žˆ๋Š” ์‚ฌ์ดํŠธ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CSS ์„ ํƒ์ž ๋ถ„์„ ๊ทธ๋ž˜ํ”„๋Š” ๋‚ฎ๊ณ  ํ‰ํƒ„ํ•œ๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.

- A ์‚ฌ์ดํŠธ B ์‚ฌ์ดํŠธ
Max score 410 101
CSS ์„ ํƒ์ž #a #b #c #d .f {...} #a p {...}

๐Ÿ”— cssstats ๋ฐ”๋กœ๊ฐ€๊ธฐ Click ! ๐Ÿ‘ˆ

์Šคํƒ€์ผ์‹œํŠธ์— ๋Œ€ํ•œ ๋ถ„์„ ๋ฐ ์‹œ๊ฐํ™”๋ฅผ ์ œ๊ณตํ•˜๋Š” ์›น ์‚ฌ์ดํŠธ

์ƒˆ ์ฐฝ ์—ด๊ธฐ ๋ฐฉ๋ฒ• : CTRL+click (on Windows and Linux) | CMD+click (on MacOS)


BEM ๋ช…๋ช… ๊ทœ์น™

๊ธฐํ˜ธ ์˜๋ฏธ
__ ํ•˜์œ„ ์š”์†Œ๋ฅผ ์˜๋ฏธ
-- ์ƒํƒœ ๋ณ€ํ˜•์„ ์˜๋ฏธ

ํ•˜๋‚˜์˜ ์ด๋ฆ„์— ์š”์†Œ, ๋ณ€ํ˜•์€ ๊ฐ ํ•œ ๋ฒˆ๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.


์˜ˆ์‹œ

.block {...}
.block__element {...}
.block__element--modifier {...}
.block--modifier {...}

์ด ํ˜•์‹ ์ด์™ธ์— ๋‹ค๋ฅธ ํ˜•์‹์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


// ๋‹จ์ˆœ ๋ธ”๋ก
<button class="btn" />

// ์š”์†Œ ๋ฐ ๋ณ€ํ˜• ์ถ”๊ฐ€
<em class="info__label info__label--warning" />
// ์ž˜๋ชป๋œ ์‚ฌ์šฉ
<button class="btn--submit" />

// ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ
<button class="btn btn--submit" />

'๋ณ€ํ˜•' ํด๋ž˜์Šค ๋‹จ๋… ์‚ฌ์šฉ ๋ถˆ๊ฐ€, ํ•ญ์ƒ ๋ธ”๋ก ๋˜๋Š” ์š”์†Œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ


์‹ค์‚ฌ์šฉ ์˜ˆ์‹œ

<div class=โ€œcardโ€>
  <img class=โ€œcard__imageโ€>
  <h2 class=โ€œcard__titleโ€>I am a card</h2>
  <p class=โ€œcard__descriptionโ€>I am the card paragraph</p>
  <!-- The button is an element inside the block -->
  <a class=โ€œcard__buttonโ€>Learn more</a>
</div>

BEM Card


BEM ์•ˆํ‹ฐํŒจํ„ด

์•ˆํ‹ฐํŒจํ„ด(anti-pattern) ์€ ๋น„ํšจ์œจ์ ์ด๊ฑฐ๋‚˜ ๋น„์ƒ์‚ฐ์ ์ธ ํŒจํ„ด์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  • ์ž˜๋ชป๋œ ์‚ฌ์šฉ

    .photo {...}              // ํŠน์ด์„ฑ 10
    .photo img {...}          // ํŠน์ด์„ฑ 11
    .photo figcaption {...}   // ํŠน์ด์„ฑ 11

    '์„ ํƒ์ž ํŠน์ด์„ฑ'์ด ๋†’์•„์ง€๋Š” ์ค‘์ฒฉ ๊ตฌ์กฐ, ํƒ€์ž… ์„ ํƒ์ž๋Š” 'BEM'์—์„œ ์•ˆํ‹ฐ ํŒจํ„ด์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.

    ๊ทธ๋Ÿฌ๋ฏ€๋กœ ํƒ€์ž… ์„ ํƒ์ž๋Š” ๊ฐ€๊ธ‰์  ํ”ผํ•˜๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.


  • ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ

    .photo {...}              // ํŠน์ด์„ฑ 10
    .photo__img {...}         // ํŠน์ด์„ฑ 10
    .photo__figcaption {...}  // ํŠน์ด์„ฑ 10

    ์ œ์–ดํ•˜๋ ค๋Š” ๋ชจ๋“  ์š”์†Œ์— ํด๋ž˜์Šค ์ด๋ฆ„์„ ๋ถ€์—ฌํ•˜์—ฌ ํŠน์ด์„ฑ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


  • ์ž˜๋ชป๋œ ์‚ฌ์šฉ

    .__elem {...}
    .--modi {...}
    .block__elem1__elem2 {...}
    .block--modi1--modi2 {...}

    ๋ธ”๋ก/์š”์†Œ ์ด๋ฆ„ ์ƒ๋žต, ์š”์†Œ/๋ณ€ํ˜• ์ด๋ฆ„ ์ค‘๋ณต์„ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค.


ํ‚ค์›Œ๋“œ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•

ํ‘œ๊ธฐ๋ฒ•
PascalCase
camelCase
kebab-case
snake_case

์ ‘๋‘์–ด ์‚ฌ์šฉ

์ด๋ฆ„ ๊ณต๊ฐ„์„ ์œ„ํ•œ ์ ‘๋‘์–ด ์‚ฌ์šฉ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

.lzModal {...}
.lzModal__title {...}
.lzBtn {...}
.lzBtn--small {...}

์ ‘๋‘์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ณต์กด์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ ‘๋‘์–ด ์—†์ด .btn์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ ๊ฒฝ์šฐ bootstrap ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ค‘์ฒฉ๋  ์ˆ˜ ์žˆ๋‹ค.


BEM ์ •๋ฆฌ

  1. ์˜๋ฏธ๋ก  ์ž‘๋ช…๋ฒ•์œผ๋กœ ์ฝ๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.
  2. ์ƒ์†Œํ•œ ์ด๋ฆ„์— ์•ฝ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  3. ํŠน์ด์„ฑ์„ '020' ๋ณด๋‹ค ์ž‘๊ฒŒ ์œ ์ง€ํ•œ๋‹ค.
  4. ์„ ํƒ์ž ์ด๋ฆ„์€ ์ „์—ญ ๊ณต๊ฐ„์—์„œ ์œ ์ผํ•˜๋‹ค.
  5. HTML/CSS ๋ณ‘๋ ฌ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ

https://cssstats.com/

https://www.emrerothzerg.com.au/what-is-bem-methodology/

https://scalablecss.com/bem-blocks-within-blocks/

https://fastcampus.co.kr/dev_red_jcm

์ƒˆ ์ฐฝ ์—ด๊ธฐ ๋ฐฉ๋ฒ• : CTRL+click (on Windows and Linux) | CMD+click (on MacOS)