できない.dev

Tailwind CSS の任意値 (arbitrary value) が反映されない

w-[123px] のような任意値は完全文字列として静的解析されないと出力されない。
値部分を変数で組み立てる、content 設定にファイルが無い、値内にスペースがある、のいずれかが原因。
完全文字列で書きスペースは _ で代用する。

公開: 更新:

実行例あり(2026-08-26 に実環境で検証)

要約

Tailwind の JIT スキャナは、ソース上で完全な文字列として出現したクラス名だけを CSS に出力する。
任意値 w-[123px] は通常クラスと同じ規則に従い、加えて括弧・スペース・引用符のエスケープが必要。w-[${size}] のような実行時補完は検出されず、content に含まれないファイルに書いた任意値も拾われない。

よくある原因

  1. 値部分を変数で組み立てている: テンプレートリテラル `text-[${size}]` は静的解析に乗らない。
    Tailwind は完全文字列を要求する。
  2. content の対象外: .mdx / .svelte / apps/web/** のような追加パスを tailwind.config.jscontent に書いていない。
    スキャンされないファイルのクラスは拾われない。
  3. 値内のスペース: grid-cols-[1fr 2fr] のような半角スペースは CSS クラス名区切りと衝突する。_ で置換する規約がある(grid-cols-[1fr_2fr])。
  4. 特殊文字: before:content-['→'] のようにシングルクオートを含む値はそのまま書ける。
    バックスラッシュは \\ でエスケープが必要。

解決策

1. 完全文字列で書く

// NG: スキャンで検出されない
<div className={`w-[${width}px]`}>...</div>
 
// OK
const widthClass = width === "narrow" ? "w-[120px]" : "w-[240px]";
<div className={widthClass}>...</div>

任意値ガイド(新しいタブで開く) の通り、完全クラス名を変数で切り替えるのが基本。

2. スペースは _ で置換

<div class="grid-cols-[1fr_2fr_minmax(0,3fr)]">...</div>
<div class="bg-[url('/hero_bg.png')]">...</div>

_ は Tailwind が CSS 出力時に自動でスペースに戻す。
逆に値の中に意図的に _ を書きたいなら \_ でエスケープする。

3. content 設定を見直す

// tailwind.config.js
module.exports = {
  content: [
    "./src/**/*.{ts,tsx}",
    "./src/**/*.mdx",
    "./node_modules/@my-org/ui/dist/**/*.js",
  ],
};

新しい拡張子や外部パッケージのクラスを使うなら明示的に追加する。

4. CSS 変数で完全に動的な値を渡す

<div
  style={{ "--w": `${width}px` } as React.CSSProperties}
  className="w-[var(--w)]"
>
  ...
</div>

幅・色・サイズが完全に実行時依存なら、クラス名側を固定して値を CSS 変数で渡す。

実行例

テンプレートリテラルで組み立てた w-[${width}px] とスペース入りの grid-cols-[1fr 2fr] を置いたままビルドすると、Tailwind は No utility classes were detected と警告し、出力 CSS を 123px1fr で grep しても 1 件も見つからなかった。
クラス名を完全な文字列に直し、値の中のスペースを _ に置き換えて再ビルドすると、.w-\[123px\].grid-cols-\[1fr_2fr\] が出力に現れ、_ は宣言側ではスペースに戻っている。

$ npx tailwindcss -i src/input.css -o out.css
Browserslist: caniuse-lite is outdated. Please run:
  npx update-browserslist-db@latest
  Why you should do it regularly: https://github.com/browserslist/update-db#readme
 
Rebuilding...
 
warn - No utility classes were detected in your source files. If this is unexpected, double-check the `content` option in your Tailwind CSS configuration.
warn - https://tailwindcss.com/docs/content-configuration
 
Done in 83ms.
$ grep -c 123px out.css
0
$ grep -c 1fr out.css
0
どちらも 0 = 完全文字列として出現していないため JIT が検出できていない
$ npx tailwindcss -i src/input.css -o out.css
Browserslist: caniuse-lite is outdated. Please run:
  npx update-browserslist-db@latest
  Why you should do it regularly: https://github.com/browserslist/update-db#readme
 
Rebuilding...
 
Done in 83ms.
$ grep -A2 -F .w-\[123px\] out.css
.w-\[123px\] {
  width: 123px;
}
$ grep -A2 -F .grid-cols-\[1fr_2fr\] out.css
.grid-cols-\[1fr_2fr\] {
  grid-template-columns: 1fr 2fr;
}
_ は出力時にスペースへ戻る

— 2026-08-26 時点の出力

検証環境

検証日
実行環境
node:20Debian GNU/Linux 12 (bookworm)
バージョン
  • Node.js 20.20.2
  • npm 10.8.2
  • Python 3.11.2
  • Git 2.39.5

この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。

この記事は役立ちましたか?