css guideline note
Atomic Designのカテゴリをコンポーネント分類としてcssルールに落とし込めないか考えてみたのですが、逆に煩雑になって運用が難しそうなものになってしまったのでお蔵入りとしました。
未完成ですが、いちおう今後の参考のためにメモとして残しておきます。
お蔵入りの理由としては…
コンポーネント粒度種が多くて管理が煩雑になりそう。また人によって分類の解釈に差が生まれそう。
粒度の大きいtemplatesとpagesの使い分けが難しく活用し辛い(moduleに分類せずにSMACSSのlayout相当にカテゴリを変えた方が良いかも?)。
Atomic Designの概念は素のcssコンポーネントとしてよりもsassのmixinなどで取り入れた方が相性が良さそう。
introduction
コンセプトは SMACCS + Atomic Design + OOCSS
なるべくシンプルなルールとしたいため、上記3つをベースにしながらもBEMやFLOCSSその他の命名規則のほか、bootstorap等のCSSフレームワークも参考にルールを策定してみます。
仮称「SAOcss」。(なんてどうだろう)
category
- base
- reset
- initialize
- module
- atoms
- molecules
- organisms
- templates
- pages
- utilities
- layout
- helper
- support
- skin(modifier)
- state
- effect
- extra
- header
- footer
- sidebar
- responsive
- js
base
タグに直接定義するサイト全体の基本スタイル。
reset
ブラウザデフォルトスタイルの差異を埋めるリセット。
reset.css、normalize.css 等のベンダーcssの利用または独自のスタイルを定義。
initialize
プロジェクト独自の初期化スタイル。
resetで不足している基本スタイルを定義。
module
主に再利用可能なコンポーネントモジュールを定義。
componentは粒度を持ち、内包する下位レベル要素のレイアウト定義、デザイン、その他プロパティを変更・定義できる。
atoms(lv1) < molecules(lv2) < organisms(lv3) < templates(lv4) < pages(lv5)
原則として各component自身は幅やマージンなどレイアウト情報を持たず、それらは上位レベルcomponentの子孫要素として定義する。
アイコンや画像等の完結したデザイン情報を持つものを除き、ボタンなどのブロックパーツは幅を持たせずliquidなものとする。
但し、utilitiesクラスを使用して幅やマージ等を持たせることは許容。
内包する同レベルのレイアウト定義、プロパティ変更は不可。
module子孫要素の命名は .prefix-module-element とする。
listやtable等子孫関係が明確な構造体には 子孫セレクタで直接タグに定義することを許容する。
atoms
原子…一要素(1つのタグ)
icon,button,input,badge,text link, ... etc.
.a-classname { ... }
molecules
分子…atoms(又はタグ)2つ以上の組み合わせからなる小部品。
input group,list,table,media,panel ... etc.
.m-classname
organisms
有機体… atomsやmolecules、その他の複数の組み合わせによってできた一つの機能的なブロック。
header,footer,sidebar,widget,panels, ... etc.
.o-classname { ... }
templates
ページ単位のスタイル。
主に内包するmoduleのレイアウトを定義。
moduleをテンプレート固有のデザインに上書き可。
.t-classname .a-classname { ... }
pages
一意のページ固有のスタイルを定義。
主に内包するmoduleのレイアウトを定義。
moduleをページ固有のデザインに上書き可。
.p-pagename .a-classname { ... }
utilities
レイアウトやデザインを調整するためのユーティリティclass。
layout
汎用レイアウトブロックやグリッドシステムを定義。
.l-section { ... }
.l-grid { ... }
helper
marginやpaddingその他、汎用ヘルパークラスを定義。
.h-mt0 { ... }
classは emmet abbreviation をベースに命名。
上書きのため原則 !important を使用。
support
他のクラスと連結してバリエーションを定義するサポートクラス。
このクラス単体にプロパティ定義することは禁止。
skin(modifier)
moduleの色違いやサイズ違いなどに使用する。
class名はハイフン始まり .- とする。
.a-classname.-sm { ... }
skin class例
.-default
.-primary
.-secondary
.-lg
.-sm
.-red
.-odd
.-even
.-alternate
state
jsで動的操作するスタイルを定義。
プレフィックス .is- を付ける
.classname.is-state { ... }
主なstate class
.is-active
.is-disable
.is-checked
.is-current
.is-show
.is-hidden
.is-opened
.is-closed
.is-odd
.is-even
efect
追加アニメーション効果用class
extra(option)
ページ内で再利用しない、バリエーションを持たないmolecules同程度の粒度を持つブロックモジュール。
ヘッダー・フッター・サイドバー等、プロジェクト共通のレイアウトブロックを定義。
(メンテナンス頻度が低く固定的なヘッダー等はmoduleから分離した方がいいのでは?と考えカテゴリを作りましたが必要性が薄いようにも思うのでオプションとしました)
responsive
suffixを使用。
- Small device ... smart phone .classname-sp
- Medium device ... Tablet .classname-tb
- Large device ... pc .classname-pc
js
JavaScriptで操作するための要素指定に使用するセレクタclass。
.js-classname
このクラスにスタイルを定義することは禁止。
また、デザイン定義されている(.js-以外の)classをjsに使用することも禁止。
※デザインと機能は分離する。動的にデザインを変更する場合はstate(.is-)クラスを使用する。なるべくjsでのclassセレクタ利用は避け、id、data属性(jQuery/Sizzle を使用してる場合)を推奨。
naming conventions
.prefix-block-element.-skin.is-state
reference
CSS(design) Architecture
- SMACCSS
https://smacss.com/ja - Atomic Design
http://bradfrost.com/blog/post/atomic-web-design/ - OOCSS
https://github.com/stubbornella/oocss/wiki - BEM
https://en.bem.info/ - SUIT CSS
http://suitcss.github.io/ - FLOCSS
https://github.com/hiloki/flocss - CSS Modules
https://github.com/css-modules/css-modules - MOCSS
https://github.com/nabepon/MOCSS - APB CSS
http://apbcss.com/
components
- Bootstrap
https://getbootstrap.com/docs/4.0/components/buttons/ - Foundation
https://foundation.zurb.com/sites/docs/v/3.2.5/components.php - Semantic UI
https://semantic-ui.com/elements/button.html - patternlab
http://demo.patternlab.io/ - Pure (by Yahoo!)
https://purecss.io/buttons/ - UIkit
https://getuikit.com/docs/button - W3.CSS
https://www.w3schools.com/w3css/default.asp - Material Design Lite
https://getmdl.io/components/index.html - mini.css
https://minicss.org/modules - Material Components for the Web
https://material.io/components/web/catalog/buttons/ - Carbon Design System (by IBM)
http://carbondesignsystem.com/
other
以上、ありがとうございました。