PR

Tailwind CSSが効かない理由を暴く【カスケードレイヤー】

HTML/CSSを学ぶ

こんにちは。特にLPのコーディング時に多いのですが、「だいたい見た目は一緒だけど一部だけ違う」要素って時々ありますよね。こういう時に通常のCSSに加えてTailwind CSSでその差分を指定する使い方をよくします。

<head>
  <link rel="stylesheet" href="./resources/styles/style.css" />
  <link rel="stylesheet" href="./resources/styles/utility.css" />
</head>

<body>
  <div class="Box"></div>
  <div class="Box mt-4"></div>
</body>

こういう使い方をすると、「クラスを書いたのにTailwindが効かない」「読み込み順を変えても直らない」ということがよく起きます。原因の9割は Cascade Layer(カスケードレイヤー)による優先度の設定です。

この記事ではTailwindと通常のCSSを組み合わせて使うときの正しい指定方法を解説します。

正しく設定ができていて、意図通りにプロパティが生成されていることを前提とします。Tailwind CSSの使い方を確認したい場合はこちらをご覧ください。

結論

  • 必ず自作CSS→Tailwind CSSに順でファイルを読み込む
<head>
  <link rel="stylesheet" href="./resources/styles/style.css" /> <!-- 自作 -->
  <link rel="stylesheet" href="./resources/styles/utility.css" /> <!-- Tailwind -->
</head>
  • 無名でも構わないので自作CSSの内容を@layerルールでレイヤー化する←本記事で解説
/* 自作CSS */
@layer main {
  body {
    /* 省略 */
  }
  
  .Container {
    /* 省略 */
  }
  
  .
  .
  .
}

これで問題なくTailwindで生成したプロパティが適用されるようになります。

Cascade Layerとは

CSSは基本的に後に書いた方が勝ちます。同じ要素に複数の場所からプロパティを指定された時、どれを優先して適用するかを定義するアルゴリズムのことをカスケード(Cascade)と呼びます。ちなみにCSSはCascading Style Sheetの略です。

このルールに、CSS Level 5 で追加された カスケードレイヤーシステムにより“レイヤー順” という新しい優先度が挟まるようになりました。

次のように、@layerルールを用いて記述します。

@layer main {
  .Sample {
    margin-top: 32px;
  }
}

@layer utility {
  .mt-4 {
    margin-top: 16px;
  }
}

レイヤー内は従来通りの優先度で判断され、レイヤー同士は後から書いたほうが優先される形になります。

またレイヤー順を明示することも可能です。後ろに書かれたものほど優先されます。

@layer utility main

もしこのように書けば、ファイル上の順番はmain→utilityでもmainが優先されるようになります。

さて、レイヤー同士の優先度はシンプルで非常にわかりやすいですね。問題はレイヤーが指定されていないCSSです。unlayered styleとも呼ばれますが、なんとこれは常にレイヤー指定されているCSSより優先度が高くなってしまうのです。

上の例だと、

  • レイヤーが指定されていないCSS
  • main
  • utility

となってしまい、レイヤー付きの順番をどう変えようがレイヤーのないCSSに負けてしまいます。

Tailwindが自動で生成する4つのレイヤー

Tailwindはビルド時に次の4つのレイヤーを自動で出力します。

レイヤー名内容生成例
themeカスタムプロパティ系--color-red-500: oklch(...);
baseリセットCSS(preflight)html { font-family: ... }
components.btn, .card など再利用パーツ.btn { @apply ... }
utilities.p-4, .text-center などのユーティリティ.p-4 { padding: 1rem }

TailwindによるCSSは全てなんらかのレイヤーに含まれるため、通常CSSに負けるという落とし穴があります。だから効かなかったんですね。

解決策

というわけで、レイヤー指定されていないCSSが何かと扱いにくいのでまずは自作CSSにレイヤーを指定しましょう。無名レイヤーでも構いません。

@layer main {
  // ここに自作CSS
}

// もしくは無名でもいい
@layer {
  // ここに自作CSS
}

この上で自作CSS→Tailwindの順番でファイルを読み込んでください。

<link rel="stylesheet" href="./resources/styles/style.css" />
<link rel="stylesheet" href="./resources/styles/utility.css" />

これでOKです。

まとめ

ということでTailwind CSSが効かない原因を解説しました。ほとんどカスケードレイヤーの解説になりましたが、仕組みを理解して適切に使えるようになりましょう。

この記事を書いた人
小林 秀樹

Web制作フリーランス9年目|ディレクター・フロントエンドエンジニア
「世界一初心者に優しい」→セカヤサ。

コーポレートサイトやLP、メディア立ち上げまで幅広く対応。コーディングを軸に、UX設計・SEOライティング・サイト運用まで一貫対応。

法律系オウンドメディア立ち上げ支援では、特定のキーワードでのSEO1位を実現し問い合わせ獲得に貢献。また大手専門学校サイトの大規模リニューアル(100ページ超)でのディレクションと実装の両面の経験あり。

最近では、AIツールによる自社サービスUI制作や、ChatGPTを活用した記事執筆フローの構築など、AI時代に対応した制作手法の実践にも注力している。

zenn:
https://zenn.dev/hideki_climax

制作実績:
https://tan-band-c66.notion.site/37abe7077b184b338fd8f53f6873ca1d

小林 秀樹をフォローする
HTML/CSSを学ぶ
スポンサーリンク
シェアする
小林 秀樹をフォローする

コメント

タイトルとURLをコピーしました