コンテンツにスキップ

標準化とスケーリング

プロジェクトの特性や規模に応じて、設計をスケールする方法について説明します。

アプローチ

想定するプロジェクトにおける 「最大規模のCSS分類」をあらかじめ用意し、プロジェクトによって拡張・縮小します。

全体像と導入方法で示した構成も、この最大構成を縮小した形の一つです。

最大構成の標準化

StrataCSSが標準とする最大構成は次の通りです。
レイヤー基点で概念構造を記載します。

概念的なレイヤー構造
* Base               # プロジェクトの基底となるCSS
    * Generic        # ブラウザ初期スタイルの平滑化
    * Library        # 外部で作成された基底系や共通機能のCSS
    * Resources      # フォントやアニメーションなどの共通アットルールの定義
    * Tokens         # デザイントークンとして用いるCSSカスタムプロパティ
    * Themes         # テーマ切り替えに利用するスタイル(Tokens上書き用)
    * Elements       # プレーンHTML用のスタイル
* Layout             # ヘッダー、フッターなどのページレイアウト要素
* Components         # ボタンやカードなどの共通部品
* Pages              # ページコンテンツ用のCSS
* Utilities          # 単機能のCSS
* Print              # 印刷用に上書きするCSS

それぞれの詳細については、 標準の名称と定義 で改めて説明します。

上記の記述順が、そのままレイヤー構造と上書きのルールになります。

仕様に落とし込むために、 @layer の宣言もネスト構造にします。
この構造をそのまま利用する場合、@layer は次のように記述します。

CSS
@layer
    base.generic , base.library , base.resources , base.tokens , base.themes , base.elements,
    layout,
    components,
    pages,
    utilities,
    print;

上記は、可読性を考慮して改行していますが、1行で記述しても問題ありません。

また、宣言に合わせて、エントリファイル(global.css / global.scss)の読み込み部分も対応させる必要があります。

CSS|global.css の読み込み部分|※ネイティブCSS共通
@import "./global/base/generic/index.css" layer(base.generic);
@import "./global/base/library/index.css" layer(base.library);
/* 以降 `layout`、`components`… も同様 */
SCSS|global.scss の読み込み部分
@layer base.generic {
    @include meta.load-css("./global/base/generic");
}
@layer base.library {
    @include meta.load-css("./global/base/library");
}
// 以降 `layout`、`components`… も同様

それぞれのディレクトリ内部の構成は、ファイルの管理しやすさにより適宜決定します。

スケーリング

前述の構造をもとに、プロジェクトによるスケーリングを検討します。
方法は、「不要なものは削除し、必要なものがあれば加える」ことです。

小規模サイトの例

数ページのコーポレートサイトの場合、前述の構成はオーバースペックになる可能性が高いでしょう。例えば、次のように構造を縮小できます。

小規模サイトの場合の構造例
* Base               # プロジェクトの基底となるCSS
    * Generic        # ブラウザ初期スタイルの平滑化
    * Resources      # フォントやアニメーションなどの共通アットルールの定義
    * Elements       # プレーンHTML用のスタイル
* Layout             # ヘッダー、フッターなどのページレイアウト要素
* Components         # ボタンやカードなどの共通部品
* Pages              # ページコンテンツ用のCSS

プロジェクト規模と照らし合わせ、実装上で不要と判断したものを削除した状態です。

さらに、ファイル管理視点では、Generic、Resources、Elements は、ディレクトリ化しなくとも、それぞれ1枚ずつのCSS(SCSS)で充分かもしれません。

要件に無い場合

印刷時のスタイル調整や、ライト・ダークなどのテーマ切り替えは要件に入らないこともあります。このような場合、対応する概念を丸ごと削除します。

将来追加するかもしれない、との方針で残すこともできますが、こちらは適宜ご判断ください。

追加ディレクトリが必要な場合

スライダーなどの外部でつくられたプラグインのCSSを、npm管理ではなく、ソースファイルのディレクトリでファイル管理しなければならないケースがあるかもしれません。

このようなケースにおいて、ファイル管理の視点から、CSSとJavaScriptを同じディレクトリに保存したい場合は、以下のように拡張しても問題ありません。

プラグイン用のディレクトリを追加(src全体の図)
📁 src/
├─ 📁 styles/
│  ├─ 📁 abstracts/  # 共通利用する関数やMixin、Sass変数など
│  ├─ 📁 global/     # Global用のディレクトリ(全域用のCSSを管理)
│  └─ 📁 pages/      # Pages用のディレクトリ(ページ個別のCSSを管理)
├─ 📁 js/            # JavaScriptの管理ディレクトリ
└─ 📁 plugins/       # プラグイン用のCSSとJavaScriptの管理ディレクトリ

plugins/ は、他の命名でも問題ありません。
そして、内部に配置したプラグイン付属のCSSは、影響範囲や上書きしたいレイヤーに応じて、 global/ もしくは pages/ の該当ファイルから読み込むことになります。

この場合、見た目でスコープを把握する力は弱くなる(原則1から外れる)ため注意が必要です。

プロジェクトの成長と拡張

規模の違いはプロジェクト特性だけでなく、同じプロジェクトそのものが変化することがあります。
例えば、小規模なWebサイトに改修を加え、それに伴い構造が大きくなるケースです。

このようなケースでは、実際はリニューアルになることが多いかもしれませんが、デザインをそのままに拡張する場合でも、規模や要件追加に応じて必要なCSS分類を足す ことで、再設計のコストを抑えて拡張できます。

最大規模の標準を定めている場合、この枠を超えない限り同じ法則でスケーリングできます。

Pagesスコープの拡張

Pagesスコープの内部も、Globalと同じ考え方で拡張できます。
新たな概念を設けて仕様レベルで制御したい場合は、レイヤーを追加する、もしくはサブレイヤーとして定義できます。

例えば、特定のページ群(製品シリーズなど)で共通するCSSを pages-group として定義した場合は、次のようになります。

@layerの宣言(pages-group を追加した例)
@layer base , layout , components , pages-group , pages , utilities , print;

その他の拡張と @layer の構造

その他のレイヤーも同様に拡張・変更できます。

どのように変更する場合でも、 @layer の定義とディレクトリ・ファイル構造は、サブレイヤーまで機械的に揃える必要がない点に注意してください。

例えば、layout/ の内部に header.scssfooter.scss を配置したからといって、必ずしも @layer layout.header {} , @layer layout.footer {} のように宣言する必要はありません。(※通常、サイトのヘッダーとフッターの上書き順は制御不要でしょう)

ディレクトリ・ファイル名と @layer の定義は、名前を一致させることで「関連性が見える状態」を維持できればよく、実際に@layer を定義するかどうかは、そのレイヤーが実装上で本当に必要かどうかで判断します。

Abstracts の構成

Abstracts は、Sass (SCSS) を利用する場合、もしくは将来 CSSカスタム関数とミックスイン が実用レベルになった際に利用しますが、内部構造はITCSSの定義を使います。

abstracts/ の内部構造
📁 styles/
├─ 📁 abstracts/     # GlobalとPagesで共通利用する関数やMixinなどの管理
│  ├─ settings/      # Sass変数の定義
│  └─ tools/         # Mixinと関数の管理
...

こちらも標準として定義しますが、必要に応じて変更してください。

次のステップ

分類の認識が一致していれば、構造が増減してもスケールしやすい状態を保てます。

次は、CSS分類とその他の名称も含め、StrataCSSの定義を説明します。

標準の名称と定義