CSS Layersは2022年にすべてのモダンブラウザでサポートされた新機能で、CSSのカスケードを層(レイヤー)で管理できる画期的な仕組みです。しかし実際にプロジェクトで使ってみると、理想と現実の間にはいくつかの課題があることが分かりました。

CSS Layersとは何か

CSS Layersは @layer ディレクティブを使って、CSSのスタイルを階層的に管理する仕組みです。従来の詳細度による優先順位ではなく、レイヤーの順序で明確にスタイルの適用順序を制御できます。

基本的な使い方

/* レイヤーの順序を定義(左から右へ優先度が上がる) */
@layer reset, base, components, utilities;

/* 各レイヤーにスタイルを定義 */
@layer reset {
  * {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
  }
}

@layer base {
  body {
    font-family: Arial, sans-serif;
    line-height: 1.6;
  }
}

@layer components {
  .button {
    padding: 0.5rem 1rem;
    border: none;
    border-radius: 4px;
  }
}

@layer utilities {
  .text-center {
    text-align: center;
  }
}

サブレイヤーでより細かな制御

@layer reset, base, components, utilities;
@layer components.base, components.variations, components.states;

@layer components.base {
  .button {
    padding: 0.5rem 1rem;
    background: #007bff;
    color: white;
  }
}

@layer components.variations {
  .button--large {
    padding: 1rem 2rem;
    font-size: 1.2rem;
  }
}

@layer components.states {
  .button:hover {
    background: #0056b3;
  }
}

CSS Layersの素晴らしい利点

1. 詳細度の悩みから解放

従来のCSS開発で最も頭を悩ませる詳細度の問題を根本的に解決できます。

/* 従来の問題 */
.header .nav .menu .item a { color: blue; }
/* さらに詳細度を上げて上書き... */
.header .nav .menu .item a.active { color: red; }

/* CSS Layersなら */
@layer base {
  .nav-link { color: blue; }
}

@layer utilities {
  .active { color: red; } /* シンプルなクラスでも確実に優先される */
}

2. 構造的なCSS管理

プロジェクトのCSS構造が明確になり、チーム開発での保守性が向上します。

@layer 
  reset,           /* リセットCSS */
  tokens,          /* デザイントークン */
  base,            /* 基本スタイル */
  layout,          /* レイアウト */
  components,      /* コンポーネント */
  utilities;       /* ユーティリティ */

3. !importantに頼らない開発

レイヤーの順序だけで優先順位が決まるため、!important を乱用する必要がありません。

実際に使って分かった問題点

1. 最大の課題:プラグインCSSとの共存

CSS Layersの最も重要な仕様上の制限:レイヤー化されていないCSS(通常のCSS)は、すべてのレイヤーよりも優先度が高くなります。

/* あなたの美しいレイヤー構造 */
@layer reset, base, components, utilities;

@layer utilities {
  .margin-0 { margin: 0; } /* 最高優先度のつもり... */
}

/* でも、プラグインの普通のCSS */
.some-plugin-class { 
  margin: 20px; /* こちらが勝ってしまう! */
}

これにより、WordPressプラグインやサードパーティライブラリのCSSが、あなたの精密に設計されたレイヤー構造を無視して最優先で適用されてしまいます。

2. 具体的な被害例

/* プラグインが定義する野蛮なリセット */
* {
  margin: 0;
  padding: 0;
  box-sizing: content-box; /* あなたのborder-boxを上書き */
}

/* あなたのレイヤー内の設定は無力 */
@layer reset {
  * { box-sizing: border-box; } /* 負ける */
}

@layer utilities {
  .p-4 { padding: 1rem; } /* 負ける */
}

3. @importのパフォーマンス問題

CSS Layersは @import と組み合わせて使うことが多いですが、@import は直列読み込みのためパフォーマンスに悪影響があります。

/* パフォーマンスが悪い例 */
@import url('reset.css') layer(reset);
@import url('components.css') layer(components);
@import url('utilities.css') layer(utilities);
/* 3つのファイルを順番に読み込み = 遅い */

現実的な対処法

1. プラグインCSSを制御する

<?php
// functions.php
function control_plugin_styles() {
    // 問題のあるプラグインCSSを無効化
    wp_dequeue_style('problematic-plugin');
    
    // 自分でレイヤー化した版を読み込み
    wp_enqueue_style('plugin-layered', 
        get_template_directory_uri() . '/css/plugin-layered.css');
}
add_action('wp_enqueue_scripts', 'control_plugin_styles', 999);
?>

2. 重要なユーティリティは非レイヤーで

@layer reset, base, components;
/* utilities レイヤーは作らない */

/* 重要なユーティリティは普通のCSSとして定義 */
.text-center { text-align: center; }
.hidden { display: none; }
.margin-0 { margin: 0; }
/* これでプラグインCSSと同等の優先度 */

3. 戦略的な!important使用

@layer utilities {
  .force-center {
    text-align: center !important; /* プラグインに勝つ */
  }
}

パフォーマンス最適化

1. ビルドツールでの結合

// webpack.config.js例
module.exports = {
  // 複数のCSSファイルを1つに結合
  optimization: {
    splitChunks: {
      cacheGroups: {
        styles: {
          type: 'css/mini-extract',
          chunks: 'all',
          enforce: true,
        },
      },
    },
  },
};

2. linkタグでの並列読み込み

<!-- @import の代わりに並列読み込み -->
<link rel="stylesheet" href="css/layers-base.css">
<link rel="stylesheet" href="css/components.css">
<link rel="stylesheet" href="css/utilities.css">

実用的なレイヤー設計パターン

シンプルな4層構造

@layer reset, base, components, utilities;

詳細な8層構造

@layer 
  reset,           /* normalize.css など */
  tokens,          /* CSS カスタムプロパティ */
  base,            /* HTML要素の基本スタイル */
  layout,          /* グリッド、フレックスボックス */
  components,      /* ボタン、カードなど */
  patterns,        /* コンポーネントの組み合わせ */
  utilities,       /* 単一目的のクラス */
  overrides;       /* 緊急時の上書き */

サブレイヤーを活用した構造

@layer reset, base, components, utilities;
@layer base.tokens, base.elements;
@layer components.base, components.variations, components.states;

@layer base.tokens {
  :root {
    --color-primary: #007bff;
    --font-family: 'Arial', sans-serif;
  }
}

@layer components.base {
  .button {
    font-family: var(--font-family);
    padding: 0.5rem 1rem;
  }
}

@layer components.variations {
  .button--primary {
    background: var(--color-primary);
  }
}

CSS Layersを使うべき?使わないべき?

使うことを推奨するケース

  • 新規プロジェクトで、サードパーティCSSを制御できる
  • チーム開発で、CSS構造の統一が重要
  • 大規模サイトで、CSS管理の複雑さに悩んでいる
  • デザインシステムを構築している

使わない方が良いケース

  • 既存のWordPressサイトで多数のプラグインを使用
  • プラグインCSSを制御できない環境
  • 小規模サイトで、そもそもCSS管理に問題がない
  • 学習コストをかけたくない場合

私の判断

今回のプロジェクトでは、プラグインの野蛮な * { margin: 0; padding: 0; } がすべてを台無しにしてしまうため、CSS Layersの使用を断念しました

現実的には、まだ多くのプロジェクトでCSS Layersを本格採用するには早すぎるかもしれません。特にWordPressなどのCMS環境では、プラグインエコシステムとの共存が大きな課題となります。

代替案:実用的なCSS管理手法

CSS Layersを使わない場合でも、以下の手法で構造的なCSS管理は可能です:

1. ITCSS(Inverted Triangle CSS)

settings/     → グローバル変数、設定
tools/        → ミックスイン、関数  
generic/      → リセット、normalize
elements/     → HTML要素の基本スタイル
objects/      → 装飾のないデザインパターン
components/   → 具体的なUIコンポーネント
utilities/    → ヘルパークラス

2. BEM + ユーティリティファースト

/* BEMでコンポーネント */
.card { }
.card__title { }
.card__content { }
.card--featured { }

/* ユーティリティで調整 */
.mt-4 { margin-top: 1rem; }
.text-center { text-align: center; }

3. CSS-in-JSソリューション

React/Vue環境であれば、styled-componentsやEmotion等を使用してスコープ化されたスタイルを使う。

まとめ

CSS Layersは理論的には素晴らしい機能で、CSS管理の未来を感じさせます。しかし、現実のWeb開発においては以下の課題があります:

良い点

  • 詳細度の問題を根本解決
  • 構造的なCSS管理が可能
  • チーム開発での保守性向上

課題

  • プラグインCSSとの共存問題
  • @importのパフォーマンス影響
  • 学習コストと移行コスト

現段階では、新規プロジェクトで環境を完全にコントロールできる場合にのみ推奨します。WordPressなどの既存システムでは、従来のCSS管理手法の方が現実的かもしれません。