Chrome拡張機能のcontent scriptでdaisyUIを使う
Chrome拡張機能のcontent scriptでdaisyUIを使うには少々工夫が必要です。本記事ではその方法と実例を紹介します。
何が問題?
何も考えずにTailwind CSSやdaisyUIを入れると、意図しない箇所のスタイルに影響を与えてしまいます。
ここでは例としてexample.comを使います。通常は次のとおりです。

ここで、工夫無しにTailwind系のCSSを使ったcontent scriptを差し込むと次のようになります。

上下の黒い帯、文字の大きさ、色、余白などいろいろ変わってしまっていますね。
もちろん「スタイルの変更が目的」であれば問題ありません。しかし、独自のUIを差し込みたいだけの場合は問題になります。
まずセレクタをつける
Tailwindはブラウザ間の差異を無くすためにCSSをリセットしています。daisyUIであればデフォルトの背景色や文字色を変えます。
そこで、TailwindやdaisyUIで扱うCSSのセレクタにprefixをつけます。
postcss-prefix-selectorの追加
今回はpostcss-prefix-selectorを使いました。
module.exports = { plugins: { tailwindcss: {}, "postcss-prefix-selector": { prefix: "#crxNameHere", }, autoprefixer: {}, },};セレクタとしては.fooが#crxNameHere .fooになるイメージです。この場合、idcrxNameHereの要素より下の要素だけにTailwind CSSを適用できます。
prefixが適用できるように変更
実際にセレクタとしてprefixが含まれるようにいくつか変更します。
content scriptで、Tailwindを使いたい範囲のルートとなる要素にprefixを書きます。
<div id="crxNameHere" class="bg-base-100"> <h1 class="text-lg">Content Script</h1> <!-- ... -->
</div>PopupやOptionsも変えます。
<body id="crxNameHere"> <script type="module" src="./main.ts"></script></body>import "./app.css"; // tailwindのディレクティブを書いたCSSimport App from "./App.svelte";
const app = new App({ // biome-ignore lint/style/noNonNullAssertion: <explanation> target: document.getElementById("crxNameHere")!,});
export default app;Tailwindだけを使っているならここまでで完了です。
daisyUIを使う場合、まだcontent scriptで差し込む要素にテーマが反映されません。
この時点では次のようになります。

daisyUIのセレクタを変える
GitHubで実装(1、2)を見ると、セレクタに:rootやhtmlが使われています。
今回ルートとしたいのはpostcss-prefix-selectorで指定したセレクタ(#crxNameHere)です。このままでは#crxNameHere htmlのような無効な親子関係のセレクタになってしまいます。
transformの関数を追加
幸いにもpostcss-prefix-selectorでは「prefixを柔軟に変更できる関数」を用意できます。postcss.config.jsを次のように書き換えます。
function transformSelector(prefix, selector, prefixedSelector) { // daisyUI: src/base/colors.css if (selector.match(/:root/)) { return selector.replace(/:root/, prefix); }
// daisyUI: src/base/general.css if (selector.match(/html/)) { return selector.replace(/html/, prefix); }
return prefixedSelector;}
module.exports = { plugins: { tailwindcss: {}, "postcss-prefix-selector": { prefix: "#crxNameHere", transform: transformSelector, }, autoprefixer: {}, },};やっていることは単純で、セレクタの:rootやhtmlをprefixに置換します。
解決方法のまとめ
そんなわけでまとめです。
- セレクタにprefixをつけるように変換
- (daisyUIなら加えて)セレクタの
:rootやhtmlをprefixに置換
次の画像がcontent scriptで差し込む部分だけにdaisyUIを適用させた例です。

実例
今回実際にcontent scriptでdaisyUIを使っている例を用意しました。参考程度にどうぞ。
eetann/wxt-content-daisyui | GitHub
上記の例ではChrome拡張機能のフレームワークWXTを使っています。
サクッと作りたい時に、focusやクリックも統一感を持たせることができてdaisyUIは便利です。