@ryoppippi

TailwindCSS/UnoCSS + Svelte でDynamicな値を使いたい!

7 Jul 2024 ・ 3 min read


TL;DR

CSS Variable を​経由するのが​良さそう。

概要

この​記事に​あるように、​そのまま​変数を​含んだ​class名を​使うと、​TailwindCSS/UnoCSSでは​反映されない。

https://zenn.dev/utamono832/articles/9cb66f9e68a345

例えば

{@const margin = 50}

<div class={`m-${margin}`} />

この​コードに​対しては​CSSを​生成してくれない。

Svelte/SvelteKitの​場合、​class名の​一部に​含める​変数を​ {@const foo = 'bar'} としたとして​も​うまく​評価されないっぽい​(こういう​値は​ビルド時に​値は​Staticに​評価され、​埋め込まれるは​ずだが​…)。

Svelteの​preprocessorと​PostCSS/UnoCSSの​preprocessorの​順番が​原因かもしれない。 ともかく、​この​方​法では​うまく​いかない。

解決策

CSS Variableを​使うのが​良さそう。 以下に​例を​示しておく。 この​コードは​ UnoCSS を​使っているが、TailwindCSS でも​同様に​使えるはず。

{@const foo = 50}

<!-- css変数を経由することで、unocssのclassに値を渡すことができる -->
<div
    style:--foo='{foo}px'
    mb="[--foo]"
    />

Svelteの​Component内で​CSS Variableを​定義する​場合は、style:--foo='{bar}' と​いう​形で​指定する。 また、mb="[--bar]" と​いう​形を​使うと、​classから​生成される​CSSは​ --bar と​いう​CSS Variableを​参照するようになる。

これらを​組み合わせた​結果、

  • Svelteの​compilerに​よって、--foo と​いう​CSS Variableは​ビルド時に​ { --foo: 50px; } のような​Static な​CSSと​して​埋め込まれる。
  • UnoCSSの​preprocessorに​よって、mb="[--foo]" と​いう​class名から​ { margin-bottom: var(--foo); } のような​CSSが​生成される。

結果、mb-50 と​いう​class名を​使った​時と​等価な​CSSが​生成される。

まとめ

割と​直感に​反する​解決策だが、​これで​うまく​いった。 参考に​なれば​幸いです。

comment on bluesky / twitter
CC BY-NC-SA 4.0 2022-PRESENT © ryoppippi