コンテンツにスキップ

CSS レイヤー

プロジェクト全体の CSS を以下の 3 層に分けます。

レイヤー役割
グローバル層サイト全体の設定値・関数・Mixin・ユーティリティ
ページ層ページごとのエントリ CSS(コンポーネントの配置)
コンポーネント層Block / Element + Variant / State による部品設計

グローバル層

サイト全体で共有する設定値・関数・Mixin・リセット・ユーティリティを担当します。

共通パーシャルは Stylelint の ignoreFiles で除外し、共有 keyframes は検証対象に含めます。
詳細はこちら: Stylelint 設定

役割別ファイル構成

カテゴリファイル役割
設定値variables.scss, global/config.scssカラー・タイポグラフィ・スペーシング・ブレークポイント
関数・Mixinglobal/function.scss, global/mixin.scss数値変換・メディアクエリ生成など
基本スタイルreset.scss, base.scss, print.scssリセット・要素スタイル・印刷用
ユーティリティutilities.scss.u-hidden, .u-sr-only など単機能クラス
共有アニメーションkeyframes.scss複数コンポーネントで使う @keyframeskf- prefix)

ユーティリティクラス

構造やスキンに依存しない単機能クラスを限定的に定義します。

  • u- プレフィックス必須(例: .u-hidden, .u-sr-only
  • Block / Element の構造ルール(2 語 / 1 語)とは別カテゴリ
  • サイト全体で再利用される最小限にとどめる

共有アニメーション

複数コンポーネントで使う @keyframeskeyframes.scss に集約します。

  • kf- などの prefix を付けて命名
  • ルート直下に配置(@media / @layer 内は不可)

コンポーネント固有の @keyframes は各コンポーネントの SCSS 内に定義します。
詳細は ファイル管理 を参照。

ページ層

各ページのエントリ SCSS です(例: home.scss, about.scss)。

役割

  • コンポーネントの読み込み(@use
  • ページのルートクラス(.main-container など)で子 Block を配置
  • ページ固有の余白・背景など

担当範囲

担当する担当しない
コンポーネントの読み込み・配置コンポーネント内部のスタイル
Block 間の余白調整Block 内部のレイアウト

ページ層は読み込んだコンポーネントの配置が中心。ページ層でクラスを書く場合も Block/Element の基本ルールに従い、読み込んだコンポーネント内部は触らない。

コード例

@use "@styles/partials/global" as *;
@use "@components/hero/hero-container";
.main-container {
> .hero-container {
// @components/hero/hero-container.scss
margin-top: 0;
}
}

繰り返すページ構造は components/parts/ に共通コンポーネントとして切り出します。

ページ層のルートクラス(.main-container など)は 1 Block = 1 ファイルの対象外です。各ページのエントリ SCSS 内で完結させます。

コンポーネント層

Block / Element による構造設計、Variant / State による見た目と状態の分離、SCSS のセクション構成、ファイル管理を一貫したルールで整理します。

  • Block(2 語): 部品そのもの(例: .hero-container
  • Element(1 語): Block 内の要素(例: .title
  • Variant / State: data 属性(デフォルト)または class モードで表現
  • 1 Block = 1 ファイル: 各 Block は 1 つの SCSS ファイルと対応
  • @keyframes: Block 固有のものは各コンポーネント SCSS のルート直下・末尾に配置する

詳細は コンポーネント を参照してください。

ディレクトリ構成例

src/
├── styles/ # グローバル層
│ └── partials/
│ ├── global/
│ │ ├── config.scss
│ │ ├── function.scss
│ │ ├── index.scss
│ │ └── mixin.scss
│ ├── base.scss
│ ├── keyframes.scss
│ ├── print.scss
│ ├── reset.scss
│ ├── utilities.scss
│ └── variables.scss
├── components/ # コンポーネント層
│ ├── common/ # サイト全体で共通
│ │ └── site-header/
│ │ └── site-header.scss
│ ├── parts/ # 複数ページで共有
│ │ └── hero-banner/
│ │ └── hero-banner.scss
│ └── pages/ # ページ固有
│ ├── home/
│ │ └── home-hero/
│ │ └── home-hero.scss
│ └── about/
│ └── about-intro/
│ └── about-intro.scss
└── assets/
└── css/ # ページ層
├── home.scss
└── about.scss

SCSS 構造サンプル(簡易版)

spiracss-scss-structure