Skip to content

CSS๋ฐฉ๋ฒ•๋ก (BEM ๋ฐ ๊ธฐํƒ€)

  • Web
  • Html
  • Css

March 05, 2023

CSS๋ฐฉ๋ฒ•๋ก (BEM ๋ฐ ๊ธฐํƒ€)

๐ŸŸ  BEM

  • 'Block,Element,Modifier'์˜ ์ค„์ž„๋ง
  • Yandex์‚ฌ(๋Ÿฌ์‹œ์•„)๊ฐ€ ์ œ์ฐฝํ•œ component๊ธฐ๋ฐ˜ ์›น ๊ฐœ๋ฐœ ์ ‘๊ทผ๋ฒ•์ด๋‹ค.
  • UI๋ฅผ ๋…๋ฆฝ๋œ block์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ณต์žกํ•œ ํŽ˜์ด์ง€์—์„œ๋„ ๊ฐ„๋‹จํ•˜๊ณ  ์‹ ์†ํ•˜๊ฒŒ ๊ฐœ๋ฐœ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ž„.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” Module๊ธฐ๋ฐ˜์˜ ๋ฐฉ๋ฒ•์ด๋‚˜, ๋‹ค๋ฅธ ์„ค๊ณ„๊ธฐ๋ฒ•์— ๋น„ํ•ด ์—„๊ฒฉํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ๊ทœ์น™์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์„ธ๊ณ„์ ์œผ๋กœ ์œ ๋ช…ํ•ด์กŒ์œผ๋ฉฐ, ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์ค‘์ž„.
1. Block
  • ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ์ ์œผ๋กœ ๋…๋ฆฝ๋œ ํŽ˜์ด์ง€ ๊ตฌ์„ฑ์š”์†Œ.
  • BEM์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” id selector๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ.(=class selector๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐ ๊ฐ€๋Šฅ)
  • Block์˜ ์ด๋ฆ„์€ state(์ƒํƒœ)๊ฐ€ ์•„๋‹Œ ํ•ด๋‹น block์˜ purpose(์šฉ๋„)๋ฅผ ์˜๋ฏธ.
  • ๊ฐ ๋ธ”๋Ÿญ์€ ํ™˜๊ฒฝ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์•„์•ผํ•จ.(block์ž์ฒด์— ๋Œ€ํ•œ ์™ธ๋ถ€ margin๋˜๋Š” position์„ ์„ค์ •ํ•˜์ง€ ์•Š์Œ.)
  • ๊ฐ Block๋“ค์€ ์„œ๋กœ ์ค‘์ฒฉ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ.
2. Element
  • Block์˜ ๋ณตํ•ฉ์ ์ธ ๋ถ€ํ’ˆ์œผ๋กœ block๊ณผ ๋ณ„๋„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ.
  • Element์˜ ์ด๋ฆ„ ๋˜ํ•œ state(์ƒํƒœ)๊ฐ€ ์•„๋‹Œ ํ•ด๋‹น block์˜ purpose(์šฉ๋„)๋ฅผ ์˜๋ฏธ.
  • ๋ช…๋ช…๋ฒ• : block-name_element-name โ†’ Block์ด๋ฆ„ + Element์ด๋ฆ„์„ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ช…๋ช…ํ•œ๋‹ค.
  • Element๋Š” ํ•ญ์ƒ Block์— ํฌํ•จ๋˜์–ด์•ผ ํ•˜๋ฉฐ, ๋ถ„๋ฆฌํ•ด์„œ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋ชจ๋“  Block์ด Element๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ์€ ์•„๋‹˜.
  • ๊ฐ Element ๋˜ํ•œ ์ค‘์ฒฉ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ.
3. Modifier
  • Block ๋˜๋Š” Element์˜ ๋ชจ์–‘, ์ƒํƒœ ๋˜๋Š” ๋™์ž‘์„ ์ •์˜ํ•จ.
  • Modifier ์ด๋ฆ„์€ Appearance(๋ชจ์–‘), State(์ƒํƒœ), Behavior(๋™์ž‘)๋ฅผ ๋‚˜ํƒ€๋ƒ„.
  • Modifier๋Š” ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.
๐Ÿ“ Modifier์˜ 2๊ฐ€์ง€ ์œ ํ˜•

โ€ฃ Boolean

  • Modifier์˜ ์œ ๋ฌด๋งŒ ์ค‘์š”ํ•˜๊ณ  ๊ทธ ๊ฐ’์€ ๋ฌด๊ด€ํ•  ๋•Œ ์‚ฌ์šฉ โ†’ disabled, focused
  • Boolean Modifier๊ฐ€ ์žˆ์œผ๋ฉด ํ•ด๋‹น ๊ฐ’์ด '์ฐธ'์œผ๋กœ ๊ฐ„์ฃผ๋จ.
  • ๋ช…๋ช…๋ฒ• : block-name_modifier-name, block-name_element-name_modifier-name

โ€ฃ Key-Value

  • Modifier์˜ ๊ฐ’์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ โ†’ size_s , theme_islands
  • ๋ช…๋ช…๋ฒ• : block-name_modifier-name_modifier-value, block-name_element-name_modifier-name_modifier-value
  • MindBEMding : Modifier์˜ ์ „ํ›„ ๊ตฌ๋ถ„๋ฌธ์ž๋ฅผ _(์–ธ๋”๋ฐ” 1๊ฐœ)์—์„œ --(ํ•˜์ดํ”ˆ 2๊ฐœ)๋กœ ๋ณ€๊ฒฝํ•œ ์Šคํƒ€์ผ.
'block-name--modifier-name'
'block-name__element-name--modifier-name'
'block-name--modifier-name--modifier-value'
'block-name__element-name--modifier-name--modifier-value'
4. Mix
  • Block๊ณผ Element๊ฐ€ ํ•˜๋‚˜์˜ HTML์š”์†Œ ์•ˆ์— ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•จ.
  • ์ฝ”๋“œ ์ค‘๋ณต์„ ํ”ผํ•˜๋ฉด์„œ ์—ฌ๋Ÿฌ BEM์˜ Entity(๊ฐœ์ฒด)์˜ ๋™์ž‘๊ณผ ์Šคํƒ€์ผ์„ ๊ฒฐํ•ฉ.
  • ๊ธฐ์กด BEM Entity๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์˜๋ฏธ์ƒ ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑ.
  • ๊ฐ€๊ธ‰์  ์ƒ์„ธ๋„๋ฅผ ๋†’์ด์ง€ ์•Š๊ณ  Block์˜ ๋…๋ฆฝ์„ฑ ์œ ์ง€ ๊ฐ€๋Šฅ.

๐Ÿ”ธ Block vs Element ์–ด๋–ค ๊ฑธ ๋งŒ๋“ค์–ด์•ผํ• ๊นŒ? ๐Ÿ”ธ

  • ๊ตฌํ˜„๋œ ๋‹ค๋ฅธ ํŽ˜์ด์ง€ component์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ์ฝ”๋“œ๊ฐ€ ์žฌ์‚ฌ์šฉ๋œ๋‹ค. โ†’ Block
  • ๋ถ€๋ชจ Block์—†์ด ๊ตฌ๋ถ„ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. โ†’ Element
  • ๋” ์ž‘์€ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋‰˜์–ด์ ธ์•ผํ•˜๋Š” Elements โ†’ Block ๋˜๋Š” Mix (BEM์—์„œ Elements์˜ Elements๋Š” ๋งŒ๋“ค ์ˆ˜ ์—†์Œ)

๐ŸŸก ๊ธฐ์กด CSS๋ฐฉ๋ฒ•๋ก ์˜ ๋ฌธ์ œ์ 

โ†’ CSS๊ฐ€ HTML์˜ ๊ตฌ์กฐ์™€ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์Œ

1. HTML์— CSS๊ฐ€ ์˜์กด

  • Html์—์„œ ์Šคํƒ€์ผ์ด ํ•„์š”ํ•œ ์š”์†Œ์— class๋ช…์„ ๋ถ€์—ฌ.
  • ํด๋ž˜์Šค๋ช…์ด ๋ถ€์—ฌ๋œ ์š”์†Œ์— ๋Œ€ํ•˜์—ฌ CSS์—์„œ ์Šคํƒ€์ผ๋ง ์ง„ํ–‰.

2. CSS์— HTML์ด ์˜์กด

  • CSS์—์„œ Html๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ์Šคํƒ€์ผ์„ ์„ ์–ธ.
  • Html์—์„œ๋Š” ์„ ์–ธ๋˜์–ด ์žˆ๋Š” style์— ํ•œํ•˜์—ฌ ๋งˆํฌ์—… ์ž‘์„ฑ

๐ŸŸก ์ƒˆ๋กœ์šด CSS๋ฐฉ๋ฒ•๋ก (Utility-First CSS / Functional CSS)

  • ๋„๋ฆฌ ์•Œ๋ ค์ง„ Utility-First CSS : Tailwind CSS / Tachyons / Atomic CSS
  • ์‹œ๋ฉ˜ํ‹ฑํ•˜๊ณ  ์ฝ˜ํ…์ธ ์— ์˜์กดํ•˜์ง€ ์•Š๋Š” CSS๋ฅผ ์ž‘์„ฑ โœ•
  • class๋ช…๋งŒ ๋ณด์•„๋„ CSS์˜ ์†์„ฑ๊ณผ ๊ฐ’์„ ๋ฐ”๋กœ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹จ ํ•˜๋‚˜์˜ ์†์„ฑ๊ณผ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” CSS๋ฅผ ์‚ฌ์ „์— ๋ฏธ๋ฆฌ ์ •์˜
  • ๋ฏธ๋ฆฌ ์ •์˜๋œ ํด๋ž˜์Šค๋ฅผ ๋งˆ์น˜ HTML ์š”์†Œ์— ์ œ๊ณตํ•˜๋Š” API๋กœ ์ƒ๊ฐํ•˜์—ฌ API(ํด๋ž˜์Šค๋ช…)์„ html์—์„œ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉ.
<!-- index.html -->
<button class="w-1/2 rounded-md border border-gray-300">๋ฒ„ํŠผ</button>
/* index.css */
.w-1/2 {
  width: 50%;
}

.rounded-md {
  border-radius: 0.375rem;
}

.border {
  border-width: 1px;
}

.border-gray-300 {
  border-color: rgb(209, 213, 219);
}

๐Ÿ“ ๊ธฐ์กด inline style๊ณผ ๋‹ค๋ฅธ ์ 

  1. ์•„๋ฌด ๊ฐ’์ด๋‚˜ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹˜. ์‚ฌ์ „์— ์ •ํ•ด์ง„ ๋ฆฌ์ŠคํŠธ์—์„œ ๊ณจ๋ผ์•ผํ•˜๋ฏ€๋กœ ์ „์ฒด์ ใ…‡๋‹ˆ ์ผ๊ด€์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Œ.
    โŒ : font-size : 14px, font:size: 13px, font-size:.9rem, font-size:.85rem
    โœ… : text-sm ๋˜๋Š” text-xs, py-3 ๋˜๋Š” py-4, text-dark ๋˜๋Š” text-light
  2. hover, focus๋“ฑ์˜ ์˜์‚ฌ class selector๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.
  3. media query๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ๋ฐ˜์‘ํ˜• ๋””์ž์ธ์— ๋Œ€์‘์ด ์ˆ˜์›”ํ•˜๋‹ค.

์ถœ์ฒ˜ : ์šฐ์•„ํ•œํ…Œํฌ - ๐Ÿ‘‰๐Ÿป ๋™๋™์˜ CSS๋ฐฉ๋ฒ•๋ก (์˜์ƒ)

Previous Post

Javascript ๋ฌธ๋ฒ• for REACT(์ฝ”๋”ฉ์•Œ๋ ค์ฃผ๋Š” ๋ˆ„๋‚˜)

Javascript ๋ฌธ๋ฒ• for REACT(์ฝ”๋”ฉ์•Œ๋ ค์ฃผ๋Š” ๋ˆ„๋‚˜)
Next Post

CSS๋ฐฉ๋ฒ•๋ก (OOCSS, SMACSS)

CSS๋ฐฉ๋ฒ•๋ก (OOCSS, SMACSS)

ยฉ 2023 Haeun Choi

  • Github
  • Contact