Elaine's Blog 朝著 senior 前進的工程師

CSS 架構方法 - OOCSS、SMACSS、BEM

2018-05-02

這是我在公司技術分享會的投影片

  • 良好的 css 架構
    • 預測
    • 複用 - 重複利用性、能夠用在更多頁面
    • 維護 - 視覺化、共同開發上更好溝通、網頁維護
    • 延展

模組化 OOCSS (Object Oriented CSS)

  • 元件化
  • 結構與樣式分開
    • 結構:position、float、margin、padding
    • 樣式:border、color、background-color
.mb-20 {
  margin-bottom: 20px;
}
  • 容器與內容分開
    • 容器:排版的框架、grid
    • 內容:元件
  • 減少對 html 的依賴
    • 使用 OOCSS 時,盡量不要用後代選擇器(.header ul)
    • OOCSS 應該是直接命名 class,才能夠隨意指定到各 html tag 上

SMACSS (Scalable Modular Architecture for CSS)

  • 將結構分類

    • base - 標籤預設的樣式
      • css reset
      • css normalize
      • 在 base 裡面不使用 !important
    • layout - 網頁佈局、排版、格線

      • 例如
        • grid
        • header
        • sidebar
        • content
      .layout-header {
      }
      .l-header {
      }
      
    • module - 模塊
      • 頁面上可以單獨存在,並且可以重複使用的元件
      • 子模組以原模組名稱加上 - 作為名稱
        .card {
        }
        .card-header {
        }
        .card-name {
        }
        
      • 例如
        • navbar
        • tab
    • state - 狀態說明

      • active、inactive
      • disabled、default
      • 命名規則是 .is-* 開頭
      .is-hidden {
      }
      .is-error {
      }
      .is-tab-active {
      }
      
    • theme - 主題樣式 (非必要)
      • 網站主視覺
      • 命名通常以 .theme-* 做開頭
  • 命名規則
  • 減少對 html 的依賴
    • 使用 SMACSS 時,盡量不要用後代選擇器(.header ul)
    • SMACSS 應該是直接命名 class,才能夠隨意指定到各 html tag 上
  • 偽元素、@media query 寫在原本 module 的後面

BEM (Block Element Modifier)

  • 把網頁每一個東西都當成積木
  • block - 明確描述目的
    • 在頁面上獨立存在並可重複使用的元件
    • 如同 SMACSS 的 module , layout
    • 每一個 block 都是獨立的存在
    • 命名規則:
      • 明確描述目的 (.logo、.search)
      • 不能寫影響環境的樣式 (margin、position)
      • 不能寫 id 選擇器
/* 合法 */
.error {
}
/* 不合法,如果突然要改成 orange 不就要改名字 */
.text-red {
}
  • element
    • 為 block 的子組件
    • 無法獨立於 block 之外
    • 有 block 可能沒有 element
    • 命名規則以 block 名稱再加上兩條底線 __
.button__icon {
}
.text-field__label {
}
.heading__title {
}
.menu__item {
}
  • modifier - 後修飾語(說明差異)
    • 用來定義 block 或 element 的狀態或屬性
    • 類似 SMACSSS 的 state
    • 同一個 block 或 element 可以允許多組 modifier 同時存在
.button--active {
}
.text-field--editable {
}
.heading_align-top {
}
.search-form__button--lg {
}
  • 命名規則

    • .namespace-block-name__element-name--modifier
  • 使用 BEM 的 CSS 就是 material design

參考資料


Content