In this post, we will learn how to add CSS style using deep selectors in v-html in Vue.
Table of Contents
In Vue, when you apply scoped CSS to a component’s DOM element, a unique attribute (eg data-v-f3r4fkdd) is added to it and then the css rules are appended to that attribute.
.parent-class .child-class { /* ... */ }
will be compiled into:
.parent-class .child-class[data-v-f3r4fkdd] { /* ... */ }
However, when you use the v-html
directive in Vue, vue-loader does not assign any attribute to the component element in the v-html’s markup. This makes the HTML markup out of the scope of the component. And that is why the v-html style does not work as usual.
So how can you add style to a v-html markup in a component?
The answer to this problem is by using the Deep selectors ( >>>
or ::v-deep
). Using the Deep Selectors you can target a child element of a parent component with a unique attribute.
Let’s check how to do it with an example.
Suppose you have a component with v-html
directive and you want to change the color and font size of the paragraph text.
<div id="app" class="main-wrapper">
<div v-html="content"></div>
</div>
</template>
<script>
export default {
name: "App",
data() {
return {
content:
"<h1>Heading</h1><p>Lorem Ipsum is simply dummy text.</p>",
};
},
};
</script>
Deep Selectors in Vue 2
So to change the color of the paragraph text, you can use >>> combinator or ::v-deep with sass
<style scoped>
.main-wrapper >>> p {
color: red;
}
</style>
If you are using sass to style v-html
then, you have to use ::v-deep
syntax.
<style scoped>
.main-wrapper::v-deep p {
color: red;
}
</style>
or you can also use /deep/
syntax. However, this syntax is now deprecated in Vue 2.7.
<style scoped>
.main-wrapper /deep/ p {
color: red;
}
</style>
The above code will be compiled into:
.main-wrapper[data-v-f3f3egdr] p{color:red}
While using the deep selector syntax make sure that your component is scoped
.
Using Deep Selectors in Vue 3
If you are using Vue 3, then you can use :deep
selector.
.main-wrapper:deep(p){
color: red;
}
The above syntax also works in Vue 2.7.
Note:
In Vue3,
::v-deep
is deprecated, so you have to use:deep(:child-class)
instead.The
>>>
and/deep/
syntax is also deprecated in Vue 3.
Demo Code: