Skip to content

Instantly share code, notes, and snippets.

@negipo
Last active August 29, 2015 14:11
Show Gist options
  • Save negipo/378a47923989db5eabe0 to your computer and use it in GitHub Desktop.
Save negipo/378a47923989db5eabe0 to your computer and use it in GitHub Desktop.
css refactorings

https://github.com/juno/bem-methodology-ja/blob/master/definitions.md

unified data domain

  • ddd的な各コンポーネントに対する命名 以下に説明する内容全てのこと
  • 検索フォーム、とかロゴ、とか
  • ヘッダーを大きくしてね、みたいな風にコミュニケーションする

block

  • アプリケーションの構成要素
  • 検索フォームブロック
  • 単体のものあればネストされたものもある

element

  • ブロックの中で文脈依存で役割を持つもの
  • "検索フォーム" blockの"input" elementと"button" element

blockの中のelementの内包関係

  • タブとかリストビューとか

  • コレクション

  • ヘッダーブロックの中にsearch blockとか

  • ネスト

  • こういった構造をbem treeと読んでdom tree的なmarkupで表現可能 jsonとかそういうテンプレートで扱えるから便利ですね (xjstベースのdslでやってるそうで)

  • 以上の内容で最も重要な点は、各blockが完全に独立して表現できるということで、ネストした状態で表現が必要なelementとして定義が必須なことと明確に区別するべきである

一方cssでは

  • ブロックやエレメントはcss的にユニークなクラスを持つ
  • cssセレクタにhtml要素などの文脈フリーではないセレクタは含まない(.menu td)
  • カスケーディングセレクタを避ける

cssネーミングルール

  • ブロックのcssはblock nameと同じ (.menu)
  • エレメントは、任意のセパレータで区切られたblock nameとelement name(.menu .menu__item)
  • カスケーディングを最小にするために、エレメントのCSSにはブロック名を含める

独立したテンプレート

  • ブロックとエレメントは入力データを表現する必要がある
  • ブロックはbem treeのどこにでも出現できる

ブロックの反復

  • コレクションとして表現可能、つまり
  • idベースのcssクラスを使わない
  • 動揺の振る舞いを持つブロックはjs的に動揺に検出される

モディファイア

  • 例えばトップメニューとボトムメニューでエレメントは一緒だが見栄えや振る舞いが違う要な場合
  • ブロックに対してcssを適切に表現する
  • .menu.menu_size_big.menu_type_buttons
  • "どこに出現するか"よりは"どのような振る舞い・見栄えを示すか”のほうが重要
  • エレメントについても同様に
  • .menu__item.menu__item_state_current

抽象化

  • 上でDDDって書いたけど、まさにユニバーサル言語的なことを期待していて、で"メンバーはデータドメインに関して合意を持ち、ブロックやエレメントの命名にはそのドメインを使うべきである" だそうです
  • 開発コミュニケーション上の観点では同じ用語を使うようになって便利
  • cssの観点では命名規約に則ったdslが使えるようになって便利
  • ↓なるほど、これをscssでやるのは結構大変じゃないかなあ
  .menu {
    __layout {
      display: inline;
    }
    __layout-item {
      display: inline-block;
      …
    }
    __item {
      _state_current {
        font-weight: bold;
      }
    }
  }
  • jsでは、クラスセレクタを使う代わりに特殊なヘルパライブラリを使うと良い
  • $('menu__item') みたいなのよりは↓みたいなの ま言いたいことはわかる
block('menu').elem('item').click( … );
block('menu').elem('item').setMod('state', 'current');
block('menu').toggleMod('size', 'big', 'small');

再利用性

  • jsを加味した再利用性を考えたい たとえばホバーすると挙動がかわるボタン
  • ブロックは自身に対する全てを"知って"いるべき
  • 使用している言語全ての技術を用いて見栄えとふるまいを表現する これを多言語主義(multilingualism)と呼ぶ
  • つまり、js, css, テンプレート、ドキュメントなど全ての総体をここではブロックと定義したい、という話のようだ

https://app.codegrid.net/entry/smacss-1 http://qiita.com/matsui_q/items/9b9188904d160a3ec223

cssのカテゴライズ

  • ベース
  • 要素そのもののデフォルトスタイル
  • レイアウト
  • ページをエリア分割
  • モジュール
  • 再利用可能なパーツ
  • ステート
  • レイアウトやモジュールの状態
  • テーマ
  • ルック& フィール

目的

  • デザインの中で繰り返されるパターンを体系立てるため
  • コード量が少なくなる
  • メンテナンス性を高める
  • ユーザー体験の一貫性の向上

ベース

  • body, a, input, a:hover など
  • cssリセット

レイアウト

  • .l-header など
  • プレフィクスをつける
  • IDセレクタはなるべく避ける
  • レイアウトとモジュールを独立させることで、それぞれの再利用性がアップする
  • あるboxをマルチカラムで配置するみたいな場合、boxのルール(padding, text-align, color...) とカラム配置のルール(いわゆるgrid的な.l-grid-06 { width: 350px; }...)を分割することで、それぞれが再利用可能になる

モジュール

  • 親モジュールの名前をプレフィクスでつけると一意にできる
  • .item .item-text
  • クラス名について
  • li, aはそれほどクラス名を必要としない ( aはネストされない, liはネストする場合 > を使う)
  • div,spanはつける
  • 親要素が違うから同一のmoduleを使って、全く同一ではないものをよりわけるみたいなのはなし
.l-main
  .search
.l-sub
  .search

で.searchがぜんぜん違うみたいなのはなし

.l-main
  .search
.l-sub
  .search.search-vertical

みたいにするのが良い

ステート

  • .is- prefixを使う
  • .is-active

テーマ

  • 色とかそういうのを管理
  • .theme- prefix
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment