Springfalfal

【CSS設計】BEM・Sassを使ったフォルダ構成

設計イラスト

そもそも、BEMとはなんだ?という方は、

BEMの基本をまとめた記事を用意していますので、こちらをチェックしてください。

1. 推奨されるフォルダ構成(ディレクトリ構造)

Sassの管理手法として標準的な

「7-1パターン(7つのフォルダと1つのメインファイル)」をベースに、

BEM(Block単位の分割)を落とし込んだ構成です。

各フォルダ内のファイル名の先頭には、

scss/
│
├── foundation/          # 1. サイト全体の土台(要素の上書き)
│   ├── _reset.scss      # リセットCSS(DestyleやNormalizeなど)
│   └── _base.scss       # 全体共通(bodyの背景色、デフォルトの文字色、フォント等)
│
├── global/              # 2. 変数や共通ツール(CSSは出力しない)
│   ├── _variables.scss  # カラーコード、フォント、Z-indexなどの変数
│   └── _mixins.scss     # メディアクエリ(ブレイクポイント)や汎用関数
│
├── layout/              # 3. 画面を構成する大きな枠組み(Block)
│   ├── _header.scss     # .l-header (サイト共通ヘッダー)
│   ├── _footer.scss     # .l-footer (サイト共通フッター)
│   └── _sidebar.scss    # .l-sidebar (サイドバー)
│
├── component/           # 4. 再利用可能な最小限のパーツ(BEMの核)
│   ├── _btn.scss        # .c-btn (様々な場所で使うボタン)
│   ├── _card.scss       # .c-card (記事一覧などのカード型パーツ)
│   ├── _title.scss      # .c-title (セクション見出しなど)
│   └── _nav.scss        # .c-nav (グローバルナビ、SNSナビなど)
│
├── project/             # 5. 特定のページや文脈に依存する固有の要素(BEMの核)
│   ├── _mv.scss         # .p-mv (メインビジュアル)
│   ├── _faq.scss        # .p-faq (よくある質問セクション)
│   └── _contact.scss    # .p-contact (お問い合わせフォーム)
│
└── style.scss           # すべてのファイルを一括で読み込むメインファイル

2. 各フォルダの役割とBEMの組み合わせ方

③ foundation/

リセットcssやサイト全体に共通するスタイルをまとめるフォルダです。

② global/

CSS自体は出力せず、Sassの機能(変数やMixin)をまとめるフォルダです。

カラーコード($color-primary: #xxxxxx; など)や、レスポンシブ用のメディアクエリをここに定義します。

③ layout/ (接頭辞:l-)

ページ全体のレイアウトを形作る、構造的なBlockを管理します。

基本的にはどのページでも共通して配置される、ヘッダー、フッター、メインコンテンツエリア、サイドバーなどが該当します。

  • 記述例: .l-header, .l-footer

④ component/ (接頭辞:c-)

「単体で独立しており、どこに移動させても100%同じ見た目で機能する」最小単位のBlockを管理します。

ボタン(.c-btn)やカード(.c-card)などは、

トップページでも、下層ページでも、サイドバーの中でも再利用されるため、ここに集約します。

⑤ project/ (接頭辞:p-)

component/ よりも大きな、いくつかのパーツ(Elementや他のComponent)が組み合わさった具体的なBlockを管理します。

例えば、トップページのメインビジュアル(.p-mv)や、会社概要(.p-profile)など、

特定のセクションそのものを1つのBlockとして定義します。

💡 接頭辞(プレフィックス)をつけるメリット

 HTML上でクラス名を見たときに、

class="c-btn"であれば「これはどこでも使い回せるボタンだな」、

class="p-mv__title" であれば「これはメインビジュアル特有の見出しだな」

と、コードの役割が瞬時に判断できるようになります。

⑥ style.scss

上記のファイルを全て読み込むファイルです。

このファイルからcssをコンパイルします。

3. 具体的なSass(SCSS)の書き方

各ファイル(Block単位)の中では、

BEMの命名規則に合わせて、Sassのアンパサンド(&)によるネストを活用して記述します。

【例: component/_card.scss の中身】

// globalで定義した変数やmixinを読み込む
@use "../global" as g;

.c-card {
  display: block;
  background-color: #fff;
  box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);

  // Element: カードの画像エリア (__ で繋ぐ)
  &__img {
    width: 100%;
    height: auto;
    object-fit: cover;
  }

  // Element: カードのテキスト内容
  &__body {
    padding: 20px;
  }

  // Element: タイトル
  &__title {
    font-size: 18px;
    font-weight: bold;
    
    // 画面幅がタブレット以上の時のスタイル(Mixinを活用)
    @include g.mq(md) {
      font-size: 22px;
    }
  }

  // Modifier: 注目させたいカードのバリエーション (-- で繋ぐ)
  &--featured {
    border: 2px solid #ff0000;
  }
}

4. 親ファイル(style.scss)での読み込み方

最後に、すべてのファイルを style.scss で一括で読み込みます。

コンパイル(CSSへの変換)はこの style.scss 1つに対して行います。

CSSの依存関係(上書きルール)を正しく保つため、読み込む順番が非常に重要です。

土台(foundation)から始まり、徐々に具体的なパーツ(project)へと進むように記述します。

/* ==========================================================================
   style.scss (Sass一括読み込み用の総親ファイル)
   ========================================================================== */

// 1. Foundation (土台)
@use "foundation/reset";
@use "foundation/base";

// 2. Layout (大きな枠組み)
@use "layout/header";
@use "layout/footer";
@use "layout/sidebar";

// 3. Component (再利用パーツ)
@use "component/btn";
@use "component/card";
@use "component/title";
@use "component/nav";

// 4. Project (各セクション・固有要素)
@use "project/mv";
@use "project/faq";
@use "project/contact";

運用のワンポイント

新しくコンポーネント(例:_gallery.scss)を作った際は、

component/ フォルダにファイルを格納し、

この style.scssに @use "component/gallery"; を追記するだけで、

自動的にBEMの独立したスタイルが破綻なくサイト全体に適用されます。

まとめ

これらのフォルダ構成を用いて、大規模なサイトでも運営を効率的に行えます。

ぜひ、BEMを用いたCSS設計をマスターしましょう!

学習記録一覧へ