blog

Prism CSS naming conventions(オレオレスタイルガイド)

    • Ryuichi Nonaka
    この記事は書かれてから1年以上経過しており、内容が古い場合があります。

    SMACSSSUIT CSS naming conventionsをベースに個人的なプロジェクトのみで使用するスタイルガイドについて考えてみた。前に書いたSass/SCSSでSMACSS(モジュール・状態・テーマ)を意識した色の管理方法について模索してみたと合わせて使うことで管理面を意識したCSSを書いていきたい。

    オレオレスタイルガイドはGistで常時アップデートしていく予定。 https://gist.github.com/nukos/efecafbc75a8bb01dfaf/

    基本

    IDはスタイリングに使わずクラスのみを使用する。

    カテゴリ

    カテゴリ表すためにプレフィックスを使用する。

    • Layout Module .l-<layout_element_name>
    • Component Module .c-<component_element_name>
      • Theme .t-<theme_name>
      • State .is-<state_name>
      • Mofifier .mod-<modify_name>
    • Utility .u-<element_name>
    • JavaScript .js-<element_name>

    文法

    クラス名には先頭にカテゴライズを行うためのプレフィックスを使い、どんなところに使うべきクラスかを表すようにする。 プレフィックスを指定したクラスは一意な名前とし、マルチクラスで子孫セレクタを前提とした構造にすることができる。子孫は必ず親セレクタの名前をプレフィックスとして継承することでセレクタの子孫構造を表し、クラス名が長くなることを避ける。

    // Syntax: <prefix>-<element_name>
    .c-box {
      /* ... */
    }
      // Syntax .<prefix>-<element_name>.<element_name>-<child_element_name>
      .c-box.box-header {
        /* ... */
      }
    

    CSSでは少し冗長であるがSCSSであれば許容できる範囲のシンプルさを保てる。

    .c-box {
      /* ... */
    
      &.box-header {
        /* ... */
      }
    }
    

    子孫セレクタ

    セレクタの子孫が複数の階層構造となってしまう場合、パフォーマンス低下の原因となるので、親のセレクタ<prefix>-<ElementName>を必須とした子孫セレクタにすることを前提として、間のセレクタを省略してセレクタ指定を行える。

    .c-box {
      /* ... */
    
      // Syntax: <element_name>-<child_element_name>
      .box-header {
        /* ... */
      }
        // インデントでレベルを表現
        // Syntax: <child_element_name>-<grand_child_element_name>
        .header-title {
          /* ... */
        }
          // Syntax: .<grand_child_element_name>-<great_grand_child_element_name>
          .title-badge {
            /* ... */
          }
    }
    

    Layout

    HeaderやFooter、Container等の再利用をしないレイアウトモジュールのためのクラス。

    // Syntax: .l-<layout_element_name>
    .l-header {
      background: #aaa;
    }
    

    Component

    リストやボタンなどの再利用可能なモジュールとして定義するクラス。コンポーネントはスタンドアロンで利用できるよう設計し再利用性を高める。

    // Syntax: .c-[<namespace>-]<component_element_name>
    .c-box {
      background: #eee;
    }
    
    <section class="c-box">
      <header class="box-header">
        <h1 class="header-title">{{text}}</h1>
        <p class="header-sub_title">{{text}}</p>
      </header>
      <div class="box-container">{{text}}</div>
    </section>
    

    Theme

    レイアウトモジュールやコンポーネントに対してカラーテーマを指定するためのクラス。Component側ではデフォルトのスタイルを持ちStateやModifyよりもローレイヤーなスタイルとなる。テーマではサイズやポジションに関するスタイリングを指定しない。

    // Syntax: .t-<theme_name>
    .t-inverse {
      background: #000;
    }
    
    <div class="c-box t-inverse">{{text}}</div>
    

    対象

    Themeは下記モジュールにのみ定義できる。

    • Layout Module
    • Component Module

    State

    コンポーネント等のある状態(current等)を表すために利用するクラス。デフォルトテーマ以外のテーマが定義されている場合、テーマモジュールの子孫セレクタとなる。

    // Syntax: .is-<state_name>
    .is-current {
      background: #cc0000;
    }
    
    .t-inverse {
      .is-current {
        background: #00ccc00;
      }
    }
    
    <div class="c-box is-current">{{text}}</div>
    <div class="c-box t-inverse is-current">{{text}}</div>
    

    対象

    Stateは下記モジュールにのみ定義できる。

    • Layout Module
    • Component Module

    Modifier

    Stateの変更とまではならない限定的なスタイルの変更に利用するクラス。Stateに影響を与えないような変更のにみ利用する。Modifierは必ずしもテーマの子孫セレクタになる必要はない。

    // Syntax: .mod-<modify_name>
    .mod-half_width {
      width: 50%;
    }
    
    <div class="c-box mod-half_width">{{text}}</div>
    

    対象

    Modifyは下記モジュールにのみ定義できる。

    • Layout Module
    • Component Module

    Utility

    レイアウトやコンポーネントに属さないポジションなどを制御するためのクラス。

    // Syntax: .u-<element_name>
    .u-clear {
      /* ... */
    }
    

    JavaScript

    JavaScriptでDOMを制御するためのクラス。 スタイルは適用しない。

    <div class="c-box js-insert_text">{{text}}</div>
    

    荒削り過ぎるんだけども、とりあえずこれをベースにしてもっと細かく定義していきたいですね。
    とりあえず今回はここまで。

    参考

    コメント・フィードバック