Tailwindで「親要素に特定のクラスがあるときのみ適用される」ユーティリティクラスをつくる
実現したいこと
warm-theme:bg-red-400
のように書くことで、親要素に.warm-theme
があるときのみbg-red-400
が適用されるようにしたい。こうすると、同じマークアップでスタイルのみを切り替えることができたりする。
<!-- 親要素にwarm-themeがある場合 -->
<div class="warm-theme">
<div class="bg-blue-300 warm-theme:bg-red-400 w-20 h-20">A</div>
</div>
<!-- 親要素にwarm-themeがない場合 -->
<div>
<div class="bg-blue-300 warm-theme:bg-red-400 w-20 h-20">B</div>
</div>
環境
- Tailwind 2.0.2
- Tailwind プレイグラウンド (https://play.tailwindcss.com/)
TL;DL
tailwind.config.js
const plugin = require('tailwindcss/plugin')
module.exports = {
variants: {
extend: {
backgroundColor: ['warm-theme'],
},
},
plugins: [
plugin(({ addVariant }) => {
addVariant('warm-theme', ({ modifySelectors, separator }) => {
modifySelectors(({ className }) => {
return `.warm-theme .warm-theme${separator}${className}`
})
})
}),
],
}
解説
const plugin = require('tailwindcss/plugin')
module.exports = {
variants: {
extend: {
backgroundColor: ['warm-theme'],
},
},
plugins: [
plugin(({ addVariant }) => {
addVariant('warm-theme', ({ modifySelectors, separator }) => {
modifySelectors(({ className }) => {
return `.warm-theme .warm-theme${separator}${className}`
})
})
}),
],
}
解説
Tailwindではhorver:bg-red-400
とすることで、hover時にのみbg-red-400が適用される。このhover:
の部分をvariant と呼ぶ。(参考: https://tailwindcss.com/docs/configuring-variants )
標準では、hoverの他にfocus, activeなどがある。
variantは自分で独自のものを作ることができる。
公式ドキュメントのCreating your configuration fileを参考にすると以下のようにかける
// ...略..
plugin(({ addVariant }) => {
addVariant('warm-theme', ({ modifySelectors, separator }) => {
modifySelectors(({ className }) => {
return `.warm-theme .warm-theme${separator}${className}`
})
})
}),
- classNameは
warm-theme:bg-red-400
と書いた場合は、bg-red-400のことを指す。 - separatorは
:
のこと。 - modifySelectorsの部分は
warm-theme:bg-red-400
というクラスから.warm-theme .warm-theme:bg-red-400
というCSSセレクタを生成する。
上記のconfigにより、一例として以下のようなCSSが生成される。
.warm-theme .warm-theme:bg-red-400 {
--tw-bg-opacity: 1;
background-color: rgba(248, 113, 113, var(--tw-bg-opacity));
}
なお、自作したvariantを適用するためには、以下のようにvariants.extend
に追加する。
// ...略..
variants: {
extend: {
backgroundColor: ['warm-theme'],
},
},
ちなみにこの状態だと、bg-*
のユーティリティクラスにしか使えない。テキストの色でも使いたい場合は、textColor: ['warm-theme']
を追加する必要がある。適当にすべてのユーティリティクラスを対象にしてしまうと生成されるCSS量が多くなりすぎるので注意。
最後に
Tailwindプレイグラウンドは、VSCodeライクなエディタで、tailwind.config.jsをいじりながら試せるため非常に便利。
お試しあれ。
Author And Source
この問題について(Tailwindで「親要素に特定のクラスがあるときのみ適用される」ユーティリティクラスをつくる), 我々は、より多くの情報をここで見つけました https://qiita.com/kiyoshiro/items/0c4f21f9f099bc9dd0d4著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .