Repository: manabuyasuda/styleguide Branch: master Commit: bd4acfd0d091 Files: 10 Total size: 110.1 KB Directory structure: gitextract_j70as5z8/ ├── .gitignore ├── LICENSE ├── README.md ├── css-class-name-list.md ├── css-coding-rule.md ├── css-styleguide.md ├── how-to-bem.md ├── how-to-ecss.md ├── image-naming-rule.md └── svg-operating-rules.md ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ .git ================================================ FILE: LICENSE ================================================ The MIT License (MIT) Copyright (c) 2015 Manabu Yasuda Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ # styleguide リポジトリを変更してガイドラインを整理しました。 [coding-guidelines](https://github.com/manabuyasuda/coding-guidelines) ================================================ FILE: css-class-name-list.md ================================================ # CSS クラス名リスト 名前をつけることは難しいですが、とても重要なことです。 CSSには設計思想が必要ですが、実践するにあたり、名前と機能の意味がとおり、名前のつけ方にブレがないようにするべきです。 このドキュメントでは、CSSでよく使われる単語を分類し、意味や機能を短くまとめています。 ただし、見た目やUIの機能をクラス名にするのではなく、デザインの意図やそのコンポーネントの役割をクラス名にすることを推奨します。 ## 場所 - `section` - 区分・区画。 - `content` - 文書の内容。 - `article` - 記事。 - `post` - 投稿。 - `top` - 頂上・上部。 - `home`- トップページ。 - `sidebar` - 補足記事。 ## 比較 - `main` - 主要な。 - `primary` - 主要な。 - `secondary` - 補助的な・第二の。 - `tertiary` - 第三の。 - `quaternary` - 第四の。 - `common` - 共通の。 - `global` - 全体的な。 - `local` - 局所的な。 - `general` - 一般的な。 ## 補足 - `wrapper` - 内包する。 - `wrap` - `wrapper`の略語。 - `container` - `wrapper`の類語。容器・入れ物。 - `group` - 集まり。 - `area` - 特定の場所・範囲。 - `brand` - ブランドの。 - `site` - サイトの。 - `emphasis` - 強調・重視。 - `catch` - 興味を惹く・関心をつかむ。 - `note` - 注釈。 - `description` - 概要。 - `desc` - `description`の略語。 - `introduction` - 前置き・導入。 - `intro` - `introduction`の略語。 - `announce` - お知らせ。 - `information` - 情報。 - `info` - `information`の略語。 - `action` - Call To Action。重要度の高い。 - `success` - 成功。 - `alert` - 注意・警戒。 - `attention` - 配慮・気配り。 - `error` - 間違い・失敗。 - `caution` - 用心・警告。 - `warning` - 警告・予告。 - `danger` - 危険・驚異。 - `more` - もっと多くの。 - `feature` - 主要なもの。 - `detail` - 詳細・細部。 - `summary` - 概要・要約。 ## コンテンツ - `about` - 〜について。 - `work` - 仕事・任務。 - `product` - 製品。 - `service` - サービス。 - `news` - お知らせ・近況。 - `event` - 行事・出来事。 - `history` - 歴史・沿革。 - `archive` - 保存・保管・記録。 - `concept` - 構想・概念・考え。 - `recommend` - おすすめ・推奨。 - `table of contents` - 目次。 - `toc` - `Table of contents`の略語。 - `index` - 索引・指標。 - `contact` - 問い合わせ・連絡。 - `inquiry` - 問い合わせ・質問・調査。 - `access` - 交通手段。 - `shop` - 店舗。 - `related` - 関連のある。 - `privacy` - 個人情報の利用・保護の方針。 - `qanda` - Question and answer(質問と回答)の略。 - `faq` - `qanda`の類語、Frequently asked questions(よくある質問)の略。 ## レイアウトパターン - `wrapper` - 複数の要素を内包する。 - `grid` - グリッドレイアウト。 - `block` - 縦に積まれる。 - `inline` - 横一列に並ぶ。 - `media` - テキストと画像の横並び。 - `flag` - テキストと画像の横並び(垂直方向の指定可能)。 - `box` - 箱状の。 - `card` - (主に)画像を目立たせるカード型。 - `tile` - 繰り返しによって構成されるパターン。 ## UI ### Text - `link` - アンカーテキスト。 - `label` - 分類する・項目名。 - `tag` - 符号・識別子。 - `badge` - 残数を示す数値。 - `copyright` - 著作権表示。 - `dialog` - (主に)注意や警告を知らせるために使用されるメッセージで、ユーザーに操作を要求するのが特徴。 - `toast` - `dialog`の類語で、`dialog`との違いは時間が経つと自動的に消えること。 - `tooltip` - マウスオーバー時に補足情報を表示するインターフェイス。 - `button` - オン・オフの選択に使うインターフェイス。 - `btn` - `button`の略語。 ### Image - `image` - 画像。 - `img` - `image`の略語。 - `icon` - 対象の内容や機能などを小さな絵柄で表したもの。 - `loading` - 読み込み中であることを示すインターフェイス。 - `logo` - 社名や製品名などを図案化・装飾化した文字・文字列。 - `map` - 地図。 - `chart` - 理解しやすいような方法で情報を示すリストやグラフのこと。 - `graph` - `chart`の類語で視覚表現のための手段のこと。 - `hero` - キービジュアルになる大型の画像。 - `banner` - (主に宣伝用の)画像をともなうリンク。 - `carousel` - 画像などのコンテンツを上下左右にスライドさせて切り替えるインターフェイス。 - `slider` - `carousel`の類語。 - `ticker` - `carousel`の類語で自動でアイテムを左右に流しながら表示する。ユーザーは基本的にコントロールできない。 ### Navigation - `navigation` - 情報へ誘導するリンク。 - `nav` - `navigation`の略語。 - `breadcrumb` - パンくずリスト。トップページから現在ページまでの階層構造を示したリンク。 - `topicpath` - `breadcrumb`の類語。 - `springboard` - 同じサイズのリンクを2×2や3×3のように配置した同じ重要度を持つ並列なナビゲーション。 - `cards` - トランプのような積み重なったカードのメタファーをもつインターフェイス。 - `list-menu` - 縦に並んだリスト型のリンクで、階層構造をもったナビゲーション。 - `dashboard` - グラフやステータスなどを一つの画面にまとめたインターフェイス。 - `pagination` - 昇順にしたページ番号付きのナビゲーション。 - `back-to-top` - ページトップに戻るためのページ内リンク。 - `tabbar` - 書類などのインデックスタブを模した、別のドキュメントに切り替えるインターフェイス。 - `segmented-control` - モバイルアプリケーションでは`tabbar`を画面全体の切り替えに使い、`segmented-control`は画面内の特定の表示領域の表示切り替えに使う。 - `toolbar` - ユーザーが利用できるツールやアクションをまとめたインターフェイス。 - `off-canvas` - 表示領域外から画面の大半を覆い隠したり(オーバーレイ)、ずらすようにスライドしながら表示するナビゲーション。 - `side-drawer` - `off-canvas`の類語。drawerは「引き出し」の意味。 - `toggle-menu` - 同一の操作で二つの状態を交互に切り換えるインターフェイスで、操作対象になるボタンを基準にナビゲーションを表示することが多い。 - `scroll-tab` - 表示領域よりも横に長いナビゲーションで、左右にスクロールすることで非表示部分を見ることができるインターフェイス。 - `sitemap` - サイト内のすべてのページへのリンクをリスト化したもの。 - `sns` - ソーシャルネットワーキングサービス。 ### Form - `form` - 送信フォーム。 - `login` - ユーザー認証をするためのフォーム。 - `signin` - `login`の類語。 - `registration` - ユーザー登録をするためのフォーム。 - `step-navigation` - 複数画面にわたるフォームの順序や、現在地を示したナビゲーション。 - `cart` - 購入するアイテムを一時的に保存する画面。 - `checkout` - 保存していたアイテムを購入する画面。 - `search-box` - キーワード検索するためのフォームエリア。 - `search-result` - 検索結果画面。 ### etc. - `dropdown` - 複数の項目を表示して、1つの項目を選択するインターフェイス。 - `pulldown` - `dropdown`の類語。 - `accordion` - 折りたたまれたコンテンツを選択することで表示させるインターフェイス。 - `comment` - 記事に対する反応。 - `table` - テーブル・図表。 - `timeline` - チャットや年表のように時系列に並べたリスト。 ## Element - `inner` - 内側の。 - `outer` - 外側の。 - `body` - 主要部分。 - `head` - 上部。 - `foot` - 下部。 - `heading` - 見出し・表題。 - `title` - 表題・題名。 - `lead` - 見出しの補足・記事の要約。 - `list` - 一覧・表。 - `menu` - 一覧・表。 - `item` - (表やデータなどの)項目。 - `unit` - 1つの単位・1セット。 - `column` - 縦列。 - `col` - `column`の略語。 - `text` - 本文。 - `caption` - 画像・図表の補足文。 - `thumbnail` - 縮小した画像。 - `thumb` - `thumbnail`の略語。 - `avatar` - 人の顔を示す画像。 - `feature` - 特徴を補足する画像。 - `tel` - 電話番号。 - `address` - 住所。 - `date` - 日付。 - `time` - 日時。 - `category` - 分類・部類。 - `cat` - `category`の略語。 - `tag` - 識別子。 - `next` - 次の。 - `previous` - 前の。 - `prev` - `previous`の略語。 - `mask` - 覆い隠す。 - `overlay` - かぶせる・上書きする。 - `delimiter` - アイテムの範囲や境界線を示すインターフェイス。 - `separator` - `delimiter`の類語で混ぜないように分離する目的で使います。 - `divider` - `delimiter`の類語でグルーピングするように分割する目的で使います。 ## Modifier - `tiny` - とても小さい。 - `xs` - `tiny`の類語でExtra small(smallよりさらに小さい)こと。 - `small` - 小さい。 - `medium` - 中間。 - `large` - 大きい。 - `huge` - とても大きい。 - `xl` - `huge`の類語でExtra large(特大・超大型)のこと。 - `reverse` - 反転する。 - `push` - 前方に押す。 - `pull` - 自分の方に引く。 - `offset` - 相殺する・埋めあわせる。 - `left`- 左側の。 - `center` - 真ん中。 - `right` - 右側の。 - `top` - 上部。 - `middle` - 真ん中。 - `bottom` - 下部。 - `round` - 角丸。 - `circle` - 円形。 ## 状態 - `show` - 見せる。 - `hide` - 隠す。 - `open` - 開く。 - `close` - 閉じる。 - `current` - 現在の。 - `active` - 活動中・有効な。 - `disabled` - 無効になっている。 ================================================ FILE: css-coding-rule.md ================================================ # CSSコーディングルール ## ファイル・ディレクトリ構成 ファイルの構成は[FLOCSS](https://github.com/hiloki/flocss)をベースにします。 ``` root └── assets/ └── css/ ├── common.scss ├── foundation/ │   ├── base/ │   ├── function/ │   ├── mixin/ │   └── variable/ ├── layout/ └── object/     ├── component/     ├── project/     ├── scope/     └── utility/ ``` スタイルは基本的に`/assets/css/common.scss`で出力しますが、ページ特有のスタイルが多く出る場合は`css/pagename.scss`のようにページ専用のスタイルシートを作ることもできます。 ``` root ├── assets/ │   └── css/ │   ├── common.scss │   ├── foundation/ │   │   ├── base/ │   │   ├── function/ │   │   ├── mixin/ │   │   └── variable/ │   ├── layout/ │ └── object/ │    ├── component/ │    ├── project/ │    ├── scope/ │    └── utility/ ├── css/ │   └── index.scss ├── index.html └── page/ ├── css/ │   └── index.scss └── index.html ``` 無理に1つのCSSとして管理するより、以下のようにHTMLから優先度が把握できるほうがスタイルの追加が容易になり、`common.css`の肥大化・複雑化を防ぐことができます。 ```html ``` ### FLOCSSの基本 FLOCSSはFoundation、Layout、Objectの3つのレイヤーとComponent、Project、Utilityの3つの子レイヤーから構成されます。 #### 1. Foundation Foundationレイヤーでは`html`や`body`のような広範囲にわたるベーススタイル、`h2`や`ul`のような基本的なタイプセレクタのデフォルトスタイルを定義します。装飾的なスタイルは避けて、できる限り低詳細度に保ちます。idセレクタやclassセレクタは使用しません。 Foundationレイヤーにはレイヤーを追加するため、normalize.cssやベーススタイルは`foundation/base`レイヤーに指定します。 ```scss @import "foundation/base/_normalize"; @import "foundation/base/_base"; ``` #### 2. Layout Layoutレイヤーはヘッダーやフッターのような、ページを構成するコンテナブロックのスタイルを定義します。目安としてはワイヤーフレームに書かれるような大きな単位のブロックです。汎用性のあるグリッドシステムは次のObject/Componentレイヤーで定義します。 例えば、ヘッダーにあるロゴやグローバルナビゲーションのレイアウトの役割を持つといったことができます。グローバルナビゲーションやコピーライトのようなコンポーネントは、Object/Projectレイヤーで定義します。基本的にはclass属性を使用しますが、id属性を使用することもできます。 プレフィックス(接頭辞)として`l-`をつけます。 ```scss @import "layout/_header"; @import "layout/_footer"; @import "layout/_main"; ``` #### 3. Object Objectレイヤーはプロジェクトにおけるビジュアルパターンです。抽象度や詳細度、拡張性などによって、3つのレイヤーにわけられます。 1. Component(`c-`) 2. Project(`p-`) 3. Utility(`u-`) #### 3.1 Component Componentレイヤーは多くのプロジェクトで横断的に再利用のできるような、小さな単位のモジュール(機能)です。 OOCSSの構造(structure)の機能を担うため、装飾的なスタイルをできるだけ含めないようにします。また、`width`や`margin`といったレイアウトに影響を与えるプロパティもできるだけ含めないようにします。 プレフィックス(接頭辞)として`c-`をつけます。 ```scss @import "object/component/_list-ordered"; @import "object/component/_media"; @import "object/component/_layout"; @import "object/component/_wrapper"; ``` #### 3.2 Project Projectレイヤーはプロジェクト固有のパターンで、複数のページで使い回せるようなコンポーネントです。具体的なスタイルを持つUI(ユーザーフェイス)で、追加されるコンポーネントのほとんどはこのレイヤーに置かれます。 構造的なパターンでも、(ボタンのように)装飾的に拡張されるのであればProjectレイヤーに置きます。 もし、このレイヤーで同じパターンが3箇所で使われていたら、別のコンポーネント(構造部分だけのパターンならComponentレイヤー、それ以外ならProjectレイヤー)としてまとめられないか検討しましょう。 プレフィックス(接頭辞)として`p-`をつけます。 ```scss @import "object/project/_icon"; @import "object/project/_icon-extend"; @import "object/project/_label"; @import "object/project/_button"; @import "object/project/_heading-h2"; @import "object/project/_heading-h3"; ``` #### 3.4 Utility Utilityレイヤーはいわゆる汎用クラスで、ほとんどの場合は単一のスタイルをもっています。コンポーネント間の間隔を調整したり、BEMのModifierが増えすぎるのを防ぎます。 共通の構造を持っていないセクションごとの余白などは、BEMのBlockとModifierで拡張することが適切でない場合があります。 そのようなモジュールは無理にBEMにせず、`.u-section`のようプレフィックスつけた汎用クラスを作ります。 `.mb10`のような具体的な名前より`.mb-small`のような相対的な名前にしたり、pxよりもemや%で指定することを推奨します。確実にスタイルを適応させるために`!important`を使用します。 プレフィックス(接頭辞)として`u-`をつけます。 ```scss @import "object/utility/_text"; @import "object/utility/_align"; @import "object/utility/_display"; @import "object/utility/_sr-only"; @import "object/utility/_width"; @import "object/utility/_margin"; @import "object/utility/_section"; ``` ### 追加するレイヤー FLOCSSのファイル構成に5つのレイヤーを標準で追加します。 #### 1.1 Variable プロジェクト全体で使われる変数を定義します。例えば以下のように、基本的な変数を定義する`global.scss`とブレイクポイント、色、font-familyを定義するファイルを分割すると見通しがよくなります。 ```scss @import "foundation/variable/_global"; @import "foundation/variable/_breakpoint"; @import "foundation/variable/_font-family"; @import "foundation/variable/_color"; ``` Sass(scss記法)で変数を定義する場合は以下のことに気をつけます。 - `!default`フラグを指定することで、先に読み込んだ変数が適応されるルールに統一します。 - `$pn-`(Project name)のようにプレフィックスを付けることで名前の衝突を防ぎます。 - ハイフン(`-`)とアンダースコア(`_`)は同一と見なされるので、注意して扱います。 - 3箇所以上で使われる共通の値やプロジェクトに関わらず利用できる値だけを定義します。 #### 1.2 Function Sassで使用できるfunctionを機能ごとに定義します。例えばpxをremに変換したり、PhotoShopのトラッキングをemに変換するfunctionなどです。 `$pn-`(Project name)のようにプレフィックスを付けることで名前の衝突を防ぎます。 ```scss @import "foundation/function/_em"; @import "foundation/function/_rem"; @import "foundation/function/_tracking"; ``` #### 1.3 Mixin Sassで使用できるmixinを機能ごとに定義します。例えばメディアクエリやclearfix、再利用できるオブジェクトのベーススタイルなどです。 `$pn-`(Project name)のようにプレフィックスを付けることで名前の衝突を防ぎます。 ```scss @import "foundation/mixin/_mq-up"; @import "foundation/mixin/_mq-down"; @import "foundation/mixin/_clearfix"; @import "foundation/mixin/_media"; ``` #### 1.4 Base normalize.cssや要素セレクタ・属性セレクタのデフォルトスタイルを指定します。 ```scss @import "foundation/base/_normalize"; @import "foundation/base/_base"; ``` #### 3.3 Scope ComponentレイヤーやProjectレイヤーのようなコンポーネント単位ではなく、ページ内の小さな範囲(スコープ)でのスタイルを定義します。繰り返し使用しないページ特有のスタイルはPageレイヤーやHTMLファイルのある各ディレクトリに定義します。 例えばブログページのスタイルとして_blog.scssを作成します。このレイヤーでは`.s-blog p`のような要素セレクタとの結合子も使うこともできます。 もし、このレイヤーで同じパターンが3箇所で使われていたら、ProjectレイヤーやUtilityレイヤーでまとめられないか検討しましょう。 直下の要素に一律の余白を指定するといった使い方をしてもいいでしょう。 ```scss .s-block { > { section, address, // h1, h2, h3, h4, h5, h6, p, ul, ol, dl, pre, div, blockquote, figure, table, form, a { &:not(:last-child) { margin-bottom: 1.7rem; } } } } ``` プレフィックス(接頭辞)として`s-`をつけます。 ```scss @import "object/scope/_element"; @import "object/scope/_block"; @import "object/scope/_blog"; ``` #### その他のレイヤー その他にもレイヤーを追加することもできます。 - Page - ページ特有のスタイルやページ単位でObjectレイヤー内のスタイルを上書きする場合など - Theme - SMACSSのThemeモジュールに該当するテーマによる色の切り替えなど - QA/Test - Quality Assurance(品質保証)、もしくはテストのための一次的なスタイル レイヤーの追加は以下のリンクを参考にします。 * [More Transparent UI Code with Namespaces](http://csswizardry.com/2015/03/more-transparent-ui-code-with-namespaces/) * [Managing CSS Projects with ITCSS](http://csswizardry.net/talks/2014/11/itcss-dafed.pdf) #### モジュール化 Layoutレイヤー以下のモジュールは機能ごとにファイルに分割します。モジュールは後述するBEMをベースに名前をつけ、モジュール名とファイル名は一致するようにします。 - `.grid` => `_grid.scss` - `.button` => `_button.scss` #### モジュールの粒度 モジュールを適切な粒度(受け持つ機能の大きさ)にするために、以下の3つの粒度でモジュールを分類し、小さなモジュールから読み込みます。 1. Content 1. Medium Container 1. Large Container ##### 1. Content 見出しやリスト、ボタンやアイコンなどのページの内容を表現する小さなオブジェクトです。 ##### 2. Medium Container Contentを内包するオブジェクトで、Contentのスタイルを上書きすることができます。例えば、`.media`や`.button-group`のようなオブジェクトです。 ##### 3. Large Container ContentやMedium Containerを内包するオブジェクトで、内包するオブジェクトに干渉することはできません。例えば、`.grid`や`.wrapper`のようなオブジェクトです。 Large BlockはSmall BlockとMedium Blockを内包することができますが、スタイルを上書きすることはできません。 #### レイヤーの順序 カスケーディングを管理するため、レイヤーを読み込ませる順序は - 低詳細度から高詳細度 - 抽象的なスタイルから具体的なスタイル - カスケーディングを許容するモジュールからカスケーディングを許容しないモジュール のようにする必要があります。例えば以下のような順番で読み込ませます。 ```scss @import "foundation/"; @import "layout/"; @import "object/component/"; @import "object/project/"; @import "object/scope/"; @import "object/utility/"; @import "page/"; @import "theme/"; @import "qa/"; ``` #### 外部ライブラリのレイヤー JQueryのプラグイン、CSSフレームワークやライブラリを読み込ませる順序は「レイヤーの順序」で示した基準を使います。外部ライブラリであっても、役割や機能が変わることはないからです。 例えば、normalize.cssは`foundation/base/`、スライダーのようなJQueryプラグインは`object/project/`のMedium Containerが適切な位置になるでしょう。 外部ライブラリは基本的にファイルを直接上書きせず、`libraryname-extend.scss`のようなファイルを作成し、上書きをします。 ## 命名規則 命名規則はBEM(MindBEMding)をベースとし、レイヤーごとにプレフィックスをつけることで名前空間とし、ブレイクポイントをもつモジュールにはサフィックス(接尾辞)をつけることで名前のブレを防ぎます。 ### BEM(MindBEMding) [BEM](https://github.com/juno/bem-methodology-ja/blob/master/definitions.md)をベースにした[MindBEMding](http://csswizardry.com/2013/01/mindbemding-getting-your-head-round-bem-syntax/)を使用します。BEMには役割や関係性を明確にできるメリットがあります。 BEMはBlock、Element、Modifierの3つの概念から構成され、以下のようなクラス名になります。 ```scss .block-name {} .block-name__element {} .block-name--modifier-name {} .block-name__element--modifier-name {} ``` * 小文字の英単語とハイフン1つ(`-`)とハイフン2つ(`--`)、アンダースコア2つ(`__`)で構成されます * BlockとElementとModifierの単語はハイフン(`-`)でつなぎます * BlockとModifierはできるだけ2つ以上の単語を合わせてユニークな名前にします * ElementとModifierは1つの単語だけを使ってもかまいません * ElementとModifierはBlockの名前を受け継ぎます * BlockとElementはアンダースコア2つ(`__`)でつなぎます * BlockとModiferもしくはElementとModiferはハイフン2つ(`--`)でつなぎます 基本的にクラスセレクタ1つだけにスタイルを指定しますが、`.block--modifier`の指定でElementにもスタイルを指定したい場合にはクラスセレクタを2つ使って指定することもできます。ただし、直近の子要素に限定するなど、影響範囲をできるだけ狭くしておきます。 ```scss // Good .block--modifier > .block__element {} // Bad .block--modifier .block__element {} ``` #### BEMの注意点 Elementを入れ子にするときに`.block__element__element`のような名前にできるだけならないようにします。HTMLの構造を示すのではなく、Blockに対するElementとModifierの関係性を示します。 ```scss // Good .block__element {} .block__child-element {} // Bad .block__element {} .block__element__element {} ``` OOCSSのようにマルチクラスで指定するのを基本とします。基本的にはBlockは独立して機能するようにしますが、汎用性を考慮したり、クラス名が長くなりすぎる場合には、Modifierだけでなく汎用クラスを組み合わせることもあります。 ```html
``` Blockを親セレクタにしてElementとModifierを指定しません。スコープは命名規則によって擬似的に作ります。スタイルは柔軟に上書きができるように、詳細度をできるだけ弱くしておきます。 ```scss // Good .block {} .block__element {} .block--modifier {} // Bad .block {} .block .block__element {} .block .block--modifier {} ``` Blockのスタイルを上書きするときに詳細度を変えないようにします。例えば、`.block1`のスタイルを変更するために`.block2`を親セレクタにして`.block1`を上書きするような指定はできるだけ避けます。同じ詳細度のセレクタであとから読み込ませることで上書きするようにします。 ```scss // Good .block1 {} .block__element {} .block2 {} // Bad .block1 {} .block__element {} .block2 .block1 {} ``` FLOCSSにカスケーディングに関するルールを2つ追加しています。 1. 同じProjectレイヤーでもMedium BlockはSmall Blockのスタイルを一部上書きすることができます。 1. Scopeレイヤー、Themeレイヤー、QAレイヤーはそれまでのレイヤーを上書きすることができます。 Sassの入れ子とアンパサンド(`&`)でBEMの記述を短縮することができますが、基本的に使わないようにします。1つ目の理由は入れ子のElementが増えると、今のアンパサンドがどこまでのElementとModifierを含んでいるのかを把握しにくくなるからです。 ```scss // Bad .foo { color: white; &--bar { color: red; } & .bar { color: red; } } ``` 2つ目の理由は実際に指定しているセレクタ名で検索できなくなるからです。CSSにコンパイルされてはじめて`.block__element`のように生成されるので、Sass編集時に検索することができません。 入れ子を使うのは擬似要素やステートクラス、ブレイクポイントの挿入などに制限します。 ```scss // Good .block { &:hover { color: blue; } &.is-active { color: blue; } @include _mq-up(md) { color: green; } } ``` 早く書けることも必要ですが、修正や運用がしやすいことのほうがずっと重要です。 その他のBEMに関する注意点などは[BEM(MindBEMding)によるCSS設計](https://github.com/manabuyasuda/styleguide/blob/master/how-to-bem.md)を参照してください。 ### プレフィックス(Prefix) レイヤーごとの役割を示したり、名前の重複をさせないために名前空間としてプレフィックスをつけます。FLOCSSで推奨されているプレフィックスといくつかのプレフィックスを使用します。 - `l-` Layoutレイヤー - `c-` Componentレイヤー - `p-` Projectレイヤー - `u-` Utilityレイヤー - `t-` Themeレイアー - `s-` Scopeレイヤー - `qa-`, `te-` QA/Testレイヤー - `is-` クリックやマウスオーバーなどのイベントが発生している要素に付与する - `js-` JavaScriptから参照される要素 - `cp-` あるHTML専用のCSSファイル(current pageの略称。名前を変更することもできます。) ### サフィックス(Suffix) ブレイクポイントを指定しているクラス名は`-sm`や`-md`のようなブレイクポイントのキーワードをクラス名の末尾につけます。 ブレイクポイントはグローバル変数として定義しておき、そのキーをクラス名にも使うようにします。 ```scss $_breakpoint-up: ( 'sm': 'screen and (min-width: 400px)', 'md': 'screen and (min-width: 768px)', 'lg': 'screen and (min-width: 1000px)', 'xl': 'screen and (min-width: 1200px)', ) !default; ``` ```scss @media (min-width: 400px) { .u-dn-sm { display: none; } } @media (min-width: 768px) { .u-dn-md { display: none; } } @media (min-width: 1000px) { .u-dn-lg { display: none; } } @media (min-width: 1200px) { .u-dn-xl { display: none; } } ``` メディアクエリは`min-width`を優先的に使い`-sm`などとします。`max-width`のパターンも作る場合は`-sm-down`などとします。 ## コメント コメントにはコードだけでは理解できない(しにくい)情報を残します。例えば以下のようなものです。 - 全体を見渡せるような目次 - レイヤーやモジュールの区切りをわかりやすくするための見出し - なぜその実装方法を選んだのかという理由 - コードの整理をしたい、バグを修正したいといった、コードからはわからない情報 - コード自体の補足 ### 目次(Table of Contents) スタイルシートのボリュームが一定以上になると全体の把握は難しくなります。CSSでもSassでも利用できる目次をスタイルシートのはじめに用意しておくことを推奨します。 ```scss /** * VARIABLE * global...サイト全体に使用するサイズや数値に関する変数です。 * breakpoint...メディアクエリで使用するブレイクポイントです。 * font-family...font-family指定をまとめています。 * color...グローバルに使用する色指定です。 * * FUNCTION * em...pxをemに変換します。 * rem...pxをremに変換します。 * tracking...Photoshopのカーニングをemに変換します。 * * MIXIN * mq-up...メディアクエリを`min-width`で挿入します。 * mq-down...メディアクエリを`max-width`で挿入します。 * responsive...レスポンシブ対応クラスを生成します。 * on-event...:hover, :active, :focusをまとめて指定します。 * clearfix...floatの解除をします。 * sr-only...非表示にしてスクリーンリーダーにだけ読み上げさせます。 * list-unstyled...list-unstyledオブジェクトのベーススタイルです。 * list-mark...list-markオブジェクトのベーススタイルです。 * media...mediaオブジェクトのベーススタイルです。 * flag...flagオブジェクトのベーススタイルです。 * ratio...ratioオブジェクトのベーススタイルです。 * layout...layoutオブジェクトのベーススタイルです。 * * BASE * normalize...Normalize.cssをインポートしています。 * base...タイプセレクタと属性セレクタのデフォルトスタイルです。 * * LAYOUT * header...``タグ直下にある`
`タグのスタイルです。 * footer...``タグ直下にある`