Upgrade to Pro — share decks privately, control downloads, hide ads and more …

漫談 CSS 架構方法 - 以 OOCSS, SMACSS, BEM 為例

漫談 CSS 架構方法 - 以 OOCSS, SMACSS, BEM 為例

2014/05/26 - F2E.tw Party 8th.

Kuro Hsu

May 26, 2014
Tweet

More Decks by Kuro Hsu

Other Decks in Technology

Transcript

  1. – Chris Eppstein “CSS is simple..., It’s simple to understand.

    But CSS is not simple to use or maintain.” http://chriseppstein.github.io/blog/2009/09/20/why-stylesheet-abstraction-matters/
  2. ! .font-­‐18{      font-­‐size:  18px;   }   !

    ! .red-­‐text{      color:  red;   }  
  3. ! .font-­‐18{      font-­‐size:  18px;   }   !

    @media  only  screen  and  (max-­‐width:  320px){   ! }
  4. 
  .red-­‐text{        color:  orange;    }
 !

    .font-­‐18{      font-­‐size:  18px;   }   ! @media  only  screen  and  (max-­‐width:  320px){      .font-­‐18{          font-­‐size:  14px;      }     }
  5. 
  .red-­‐text{        color:  orange;    }
 !

    .font-­‐18{      font-­‐size:  18px;   }   ! @media  only  screen  and  (max-­‐width:  320px){      .font-­‐18{          font-­‐size:  14px;      }     }
  6. #news  h2{      border-­‐bottom:  1px  solid  #000;    

     padding:  1em;      font-­‐size:  18px;      font-­‐weight:  700;   }
  7. #news  h2{      border-­‐bottom:  1px  solid  #000;    

     padding:  1em;      font-­‐size:  18px;      font-­‐weight:  700;   } #faq  .title{      border-­‐bottom:  1px  solid  #000;      padding:  1em;      font-­‐size:  18px;      font-­‐weight:  700;   }
  8. #news  h2{      border-­‐bottom:  1px  solid  #000;    

     padding:  1em;      font-­‐size:  18px;      font-­‐weight:  700;   } #faq  .title{      border-­‐bottom:  1px  solid  #000;      padding:  1em;      font-­‐size:  18px;      font-­‐weight:  700;   } #service  .feature  .title{      border-­‐bottom:  1px  solid  #000;      padding:  0.5em;      font-­‐size:  16px;   }
  9. .column_2  #inbox  .list  {  ...  }   .column_3  #inbox  .list

     {  ...  }   .column_3  #inbox  .list  .name  {  ...  }   .column_3  #inbox  .list  .name  p  {  ...  }   .column_3  #inbox  .list  .name.reply  {  ...  }   .column_3  #inbox  .list  .name.reply  a  {  ...  }   ! #top  .column_3  #inbox  .list.left  {  ...  }
  10. – Nicole Sullivan “We have been doing it all wrong…,

    
 Our (CSS) best practices are killing us! ” http://www.stubbornella.org/content/2011/04/28/our-best-practices-are-killing-us/
  11. 良好的 CSS 架構 • 預測 - Predictable • 複⽤用 -

    Reusable • 維護 - Maintainable • 延展 - Scalable http://philipwalton.com/articles/css-architecture/
  12. <div  class="media">      <div  class="media-­‐img">        

     <img  src="http://placehold.it/80x80"  alt="">      </div>      <div  class="media-­‐body">          <p>...</p>      </div>   </div>
  13. <div  class="media  media-­‐shadow">      <div  class="media-­‐img">      

       <img  src="http://placehold.it/80x80"  alt="">      </div>      <div  class="media-­‐body">          <p>...</p>      </div>   </div>
  14. <div  class="media  media-­‐no-­‐border”>      <div  class="media-­‐img">      

       <img  src="http://placehold.it/80x80"  alt="">      </div>      <div  class="media-­‐body">          <p>...</p>      </div>   </div>
  15. SMACSS - Base • CSS Reset • CSS Normalize •

    There should be no need to use 
 !important in a Base style.
  16. SMACSS - Module http://smacss.com/book/type-module • ⾴頁⾯面上可單獨存在並且可重複使⽤用的元件 • 定義 Module 時應避免使⽤用

    id 或標記名稱 做選擇器 • ⼦子模組以原模組名稱加 dash (-) 作為名稱
 如: .mod-­‐header , .mod-­‐body
  17. SMACSS - State http://smacss.com/book/type-module • 與 Layout, Module 搭配 •

    表⽰示 Layout 或 Module 的狀態變化 • 由 class 定義 • 命名規則是 .is-* 開頭
  18. <div  class="media  is-­‐box-­‐shadow”>      <div  class="media-­‐img">      

       <img  src="http://placehold.it/80x80"  alt="">      </div>      <div  class="media-­‐body">          <p>...</p>      </div>   </div> module class state sub module sub module
  19. • Use class over ID. • Use child selector. (

    .menu > li > a ) • Apply a class when the HTML won’t be predictable.
  20. <div  class="media">        <img  src="http://placehold.it/80x80"  alt="">    

       <div>...</div>   </div>   ! <div  class="media">        <img  src="http://placehold.it/80x80"  alt="">        <p>...</p>   </div>
  21. ! .media  p,  .media  div,  .media  ul  {  ...  }

      ! .media-­‐body  {  ...  }  
  22. <div  class="media  is-­‐box-­‐shadow”>      <div  class="media-­‐img">      

       <img  src="http://placehold.it/80x80"  alt="">      </div>      <div  class="media-­‐body">          <p>...</p>      </div>   </div> module class state sub module sub module
  23. BEM - CSS 命名原則 (Block) .button   .text-­‐field   .heading

      .menu .b-­‐button   .b-­‐text-­‐field   .b-­‐heading   .b-­‐menu ( prefix ⾮非必要)
  24. BEM - CSS 命名原則 (Element) .button__icon   .text-­‐field__label   .heading__title

      .menu__item 以 Block 名稱加上兩個底線 _ _ 作為 prefix
  25. BEM - Modifier • ⽤用來定義 Block 或 Element 
 的狀態或屬性

    • 類似 SMACSS 的 State • 同⼀一個 Block 或 Element 可以允許多組 modifier 同時存在
  26. BEM - CSS 命名原則 (Modifier) .button_active   .text-­‐field_editable   .heading_align_top

      .menu__item_promo 以 Block 或 Element名稱加上⼀一個底線 _作為 prefix
  27. <div  class="media  media_shadow">      <div  class="media__img">      

       <img  src="http://placehold.it/80x80"  alt="">      </div>      <div  class="media__body">          <p>...</p>      </div>   </div> Block Modifier Element Element
  28. MindBEMding • 改良版 BEM,由 Nicolas Gallagher 提出 http://csswizardry.com/2013/01/mindbemding-getting-your-head-round-bem-syntax/ .block  {

     ...  }   .block-­‐-­‐modifier  {  ...  }   .block__element    {  ...  }   .block__element-­‐-­‐modifier  {  ...  }
  29. 良好的 CSS 架構 • 預測 - Predictable • 複⽤用 -

    Reusable • 維護 - Maintainable • 延展 - Scalable http://philipwalton.com/articles/css-architecture/