Tailwind で任意の値(数値)を使えるクラス名に変数を用いることは現状実質不可

前提

JIT で入ったこのあたりの記法です。

v2.tailwindcss.com

<!-- Sizes and positioning -->
<img class="absolute w-[762px] h-[918px] top-[-325px] right-[62px] md:top-[-400px] md:right-[80px]" src="/crazy-background-image.png">

<!-- Colors -->
<button class="bg-[#1da1f1]">Share on Twitter</button>

<!-- Complex grids -->
<div class="grid-cols-[1fr,700px,2fr]">
  <!-- ... -->
</div>

変数を使いたくなる

例えば以下のようにクラスを指定したくてもこれは実質できません*1

const tekitou = 123
const widthClassName = `w-[${tekitou}px]`
const imgTag = `<img class="${widthClassName}" ...>`

冒頭のページの Dynamic values に説明があるように「完全なタグ」を変数に入れる必要があります。上記の例で言えば w-[123px] を変数に入れる必要があります。変数展開してはいけません。

となると

したがって、冒頭のタイプの記法で変数で出し分けたいという場合には、予め使うことが分かっているもののなかから選択的に選ぶということになるかと思います。ユーザからパラメータで任意の数値を渡してもらい、それを利用する、ということは実質できません。

実質実質と言っているのは、一応抜け道があるからです。

tailwind.config.jssafelist というプロパティが設定できます。そこにたとえば ['w-[1px]', 'w-[2px]', 'w-[3px]', ...] のように考えうる数値を具体的に一つ一つ設定すればいいです。ただ、たとえば 1 から 1000 までの 1000個 の値を羅列するというのはちょっと無理やり過ぎます*2。正規表現を使えばいい、と思うでしょうが使えないのです。

多くの場合がそうであるように、なにか無理やりなことをする必要がある時は、そもそも方針が違ってたり別の実現方法があります。例えば上記の場合なら単に style="width: 123px" でもいけるはずです*3

*1:2022/12/23現在

*2:テキストを機械的に生成すれば記述すること自体は難しくない

*3:だめかもしれない場合もある

Powered by はてなブログ