などの疑問や悩みを解決してまいります。
場合によってはscoped
オプションが追加されているstyle
タグ内でCSSを記述し、子コンポーネントファイルにもそのCSSを反映させたいなんてこともあるかと思います。
「子コンポーネントファイルにCSS書けばいいじゃん」との声も聞こえてきそうですが、例えばVuetifyやElement+のようなUIライブラリからコンポーネントを持ってくるときにオプションだけでは実現しきれないときはCSSを使用しますが、scoped
があると子コンポーネントに対してCSS指定することができないです。
こういう時に使用できるのが:deep
セレクターです。
今回はこの:deep
セレクターについて解説していきます。
:deepセレクターとは
冒頭でも軽く触れていますが、:deep
セレクターはscoped
が指定されているファイルの子コンポーネントファイルにもCSSを適用することができるようになります。
そもそもstyle
タグにscoped
オプションを追加すると、その中で記述したCSSはそのファイル内限定で使用することができ、その他ファイルには影響を及ぼさなくなります。
<style scoped>
div {
width: 45%;
}
</style>
そこで:deep
セレクターを追記することで、追加されたCSSは子コンポーネントにも適用されることになります。
<style scoped>
:deep(div) {
width: 45%;
}
</style>
Vue.js3になってから書き方が変更になった
Vue.js2のときは上記で解説した記述方法ではなく、以下の書き方でした。
<style scoped>
::v-deep {
div {
width: 45%;
}
}
</style>
::v-deep
で{}で囲んで、その中にCSSを記述するような形だったんですね!UIライブラリ使用時に活躍する
:deep
セレクターはscoped
が指定されていても、子コンポーネントにもそのCSSを反映することができるものと説明いたしました。
しかし、それなら子コンポーネントファイルに直接記述してしまえばわざわざ使用することもありません。
よく使われるのがVuetifyやElement+のようなUIライブラリです。
子コンポーネントファイルを用意することなくコンポーネントタグを記述したら表示させることができるため、直接子コンポーネントファイル記述することができません。
この持ってきたコンポーネントタグに対して、scoped
が指定されているstyle
タグ内にCSSを記述し、反映させたい場合に使用することが多くなるかと思います。