νλ‘ νΈμλ κ°λ°μμ κ°μ₯ μ€μν κ² μ€ νλλ μ μ§λ³΄μμ±μ΄ λμ μ½λλ₯Ό μμ±νλ κ²μ λλ€. νλ‘μ νΈ κ·λͺ¨κ° 컀μ§μλ‘ CSS μ½λλ 볡μ‘ν΄μ§κ³ , ν΄λμ€ μ΄λ¦ μΆ©λμ΄λ μλμΉ μμ μ€νμΌ λ³κ²½μ΄ λΉλ²νκ² λ°μν©λλ€.
μ΄λ¬λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ λ±μ₯ν κ²μ΄ λ°λ‘ BEM(Block, Element, Modifier) λ°©λ²λ‘ μ λλ€. BEMμ λͺ ννκ³ κ΅¬μ‘°μ μΈ μ΄λ¦ κ·μΉμ μ 곡νμ¬ CSSλ₯Ό ν¨μ¨μ μΌλ‘ κ΄λ¦¬ν μ μκ² λμ΅λλ€.
1. BEM μ΄λ 무μμΈκ°?
BEMμ Block(λΈλ‘), Element(μμ), Modifier(μμ μ) μΈ κ°μ§ ν΅μ¬ κ°λ μΌλ‘ CSS ν΄λμ€ μ΄λ¦μ ꡬμ±νλ λ°©λ²λ‘ μ λλ€. μ΄ κ΅¬μ‘°λ₯Ό ν΅ν΄ ν΄λμ€ μ΄λ¦λ§ 보λλΌλ ν΄λΉ HTML μμκ° μ΄λ€ μν μ νκ³ μ΄λ€ μμΉμ μλμ§ μ§κ΄μ μΌλ‘ νμ ν μ μμ΅λλ€.
BEMμ κΈ°λ³Έ λͺ λͺ κ·μΉ
BEMμ block__element--modifier ννμ ꡬ쑰λ₯Ό μ¬μ©ν©λλ€.
- ꡬλΆμ:
- __ (λ κ°μ μΈλλ°): λΈλ‘κ³Ό μμλ₯Ό ꡬλΆν©λλ€.
- -- (λ κ°μ νμ΄ν): μμ λλ λΈλ‘κ³Ό μμ μλ₯Ό ꡬλΆν©λλ€.
2. BEMμ μΈ κ°μ§ ν΅μ¬ κ΅¬μ± μμ
2.1. Block (λΈλ‘) π¦
λΈλ‘μ μΉ μ ν리μΌμ΄μ μ λ 립μ μΈ κ΅¬μ± μμλ₯Ό μλ―Έν©λλ€. μ¬μ¬μ© κ°λ₯ν λ¨μμ΄λ©°, μ체μ μΌλ‘ μλ―Έλ₯Ό κ°μ§λλ€.
- νΉμ§: λ 립μ μΌλ‘ μ¬μ©λ μ μμ΄μΌ νλ©°, λ§μ§μ΄λ μμΉ μ§μ (positioning) CSSλ₯Ό κ°μ§μ§ μλ κ²μ΄ μ’μ΅λλ€.
- μμ: header, menu, button, card, search-form
- ν΄λμ€λͺ : menu
2.2. Element (μμ) βοΈ
μμλ λΈλ‘μ λΆλΆμ΄λ©°, λΈλ‘ μμ΄λ μλ―Έκ° μλ μ’ μμ μΈ κ΅¬μ± μμμ λλ€.
- νΉμ§: νμ λΆλͺ¨ λΈλ‘μ μν΄μΌ νλ©°, λ¨λ μΌλ‘ μ¬μ©λμ΄μλ μ λ©λλ€. block__element ννλ‘ λͺ λͺ λ©λλ€.
- μμ: menu λΈλ‘μ νλͺ©λ€, card λΈλ‘μ μ λͺ©μ΄λ λ³Έλ¬Έ
- ν΄λμ€λͺ : menu__item, card__title
2.3. Modifier (μμ μ) π¨
μμ μλ λΈλ‘ λλ μμμ μΈκ΄, μν, λμ λ±μ λ³κ²½νλ νλκ·Έ(Flag) μν μ ν©λλ€. κ°μ λΈλ‘μ΄λ μμλΌλ λ€λ₯΄κ² 보μ΄κ±°λ μλνκ² λ§λ€ λ μ¬μ©ν©λλ€.
- νΉμ§: μλ³Έ ν΄λμ€ λ€μ --modifier ννλ‘ λͺ λͺ λ©λλ€.
- μμ: νμ±νλ λ²νΌ, λΉνμ±νλ λ©λ΄ νλͺ©, λ€λ₯Έ ν¬κΈ°μ μΉ΄λ
- ν΄λμ€λͺ : button--primary, menu__item--active, card--large
3. μ€μ μ½λ μ μ© μμ
λ€μμ κ°λ¨ν κ²μ νΌ(Search Form)μ BEMμΌλ‘ ꡬνν μμμ λλ€.
<form class="search-form">
<input type="text" class="search-form__input" placeholder="κ²μμ΄λ₯Ό μ
λ ₯νμΈμ">
<button type="submit" class="search-form__button search-form__button--disabled">
κ²μ
</button>
</form>
/* 1. Block: search-form */
.search-form {
display: flex;
padding: 10px;
border: 1px solid #ccc;
}
/* 2. Element: search-form__input */
.search-form__input {
flex-grow: 1;
padding: 8px;
border: none;
}
/* 3. Element: search-form__button */
.search-form__button {
padding: 8px 15px;
background-color: #007bff;
color: white;
border: none;
cursor: pointer;
}
/* 4. Modifier: search-form__button--disabled */
.search-form__button--disabled {
opacity: 0.5;
cursor: not-allowed;
/* λ²νΌμ λΉνμ±ν μνλ₯Ό μ μ */
}
4. BEM λ°©λ²λ‘ μ μ₯μ
- λͺ νμ± (Clarity): ν΄λμ€ μ΄λ¦λ§ λ΄λ ν΄λΉ μμκ° μ΄λ€ λΈλ‘μ μνλ©° μ΄λ€ μν μ νλμ§ μ¦μ νμ ν μ μμ΅λλ€.
- μ¬μ¬μ©μ± (Reusability): λΈλ‘ λ¨μλ‘ λ 립μ μΈ CSSκ° μμ±λλ―λ‘, νΉμ λΈλ‘μ λ€λ₯Έ νμ΄μ§λ μ»΄ν¬λνΈμμ μ½κ² κ°μ Έμ μ¬μ¬μ©ν μ μμ΅λλ€.
- μΆ©λ λ°©μ§ (Isolation): λͺ¨λ ν΄λμ€ μ΄λ¦μ΄ κ³ μ νκ³ μμΈνκΈ° λλ¬Έμ, μ μ CSSμμ μΆ©λμ΄λ μλμΉ μμ μ€νμΌ μμ λ¬Έμ λ₯Ό κ·Όλ³Έμ μΌλ‘ λ°©μ§ν μ μμ΅λλ€.
- μ μ§λ³΄μ μ©μ΄μ± (Maintainability): μμ ν΄μΌ ν μ€νμΌμ΄ μμ λ, ν΄λΉ BEM ν΄λμ€λ§ μ°ΎμΌλ©΄ λλ―λ‘ μ½λλ₯Ό μΆμ νκ³ μμ νλ μκ°μ΄ λ¨μΆλ©λλ€.
5. κ²°λ‘
BEMμ λ¨μν λͺ λͺ κ·μΉμ λμ΄, λκ·λͺ¨ νλ‘μ νΈμμ CSSλ₯Ό ꡬ쑰μ μ΄κ³ λͺ¨λνλ λ°©μμΌλ‘ κ΄λ¦¬νκ² ν΄μ£Όλ κ°λ ₯ν λ°©λ²λ‘ μ λλ€. μ²μμλ μ΄λ¦μ΄ κΈΈμ΄μ§λ κ²μ κ±°λΆκ°μ΄ λ€ μ μμ§λ§, νλ‘μ νΈμ κ·λͺ¨κ° 컀μ§μλ‘ BEMμ΄ μ 곡νλ λͺ νμ±κ³Ό μ μ§λ³΄μμ±μ κ°λ° μμ°μ±μ ν¬κ² ν₯μμμΌ μ€ κ²μ λλ€.
