Mastering Deep Selectors (>>>) and :deep() in Vue: Styling Child Components from Parent! 🚀
Dharmendra Kumar

Dharmendra Kumar @dharamgfx

About: ⚡I’m a curious coder who loves building things! Whether it’s creating beautiful website designs or making sure the behind-the-scenes stuff runs smoothly, I’m all in. Let’s turn code into magic! ⚡

Location:
Bihar- Bettiah
Joined:
May 19, 2024

Mastering Deep Selectors (>>>) and :deep() in Vue: Styling Child Components from Parent! 🚀

Publish Date: Sep 18 '24
8 2

When working with scoped CSS in Vue, applying styles from a parent to a child component can be tricky. Vue offers two powerful tools to help with this: the deep selector (>>>) and the :deep() pseudo-class. Both allow you to penetrate scoped CSS boundaries, but which one should you use? Let’s explore both with examples and compare them!


🛠 1. Using the Deep Selector (>>>)

As we discussed earlier, the deep selector is a special way to apply styles from a parent component to a child component while keeping the scoped attribute in place.

Example:

<!-- ParentComponent.vue -->
<template>
  <div class="parent-container">
    <ChildComponent />
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  components: {
    ChildComponent
  }
}
</script>

<style scoped>
/* Scoped styles apply only to the parent */
.parent-container {
  background-color: lightblue;
}

/* Deep selector to apply styles to a child component */
>>> .child-text {
  color: red;
}
</style>
Enter fullscreen mode Exit fullscreen mode

In this example, the deep selector (>>>) allows us to style the .child-text class inside the child component, even though both components have scoped styles.


🛠 2. Using the :deep() Pseudo-Class

Vue 3 introduced a new and more semantic way of applying deep styles using the :deep() pseudo-class. This is the recommended way moving forward.

Example:

<!-- ParentComponent.vue -->
<template>
  <div class="parent-container">
    <ChildComponent />
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  components: {
    ChildComponent
  }
}
</script>

<style scoped>
/* Scoped styles apply only to the parent */
.parent-container {
  background-color: lightblue;
}

/* :deep() to apply styles to a child component */
:deep(.child-text) {
  color: red;
}
</style>
Enter fullscreen mode Exit fullscreen mode

With :deep(), you get the same result as using >>>, but the syntax is more future-proof and aligns with modern CSS practices.


🔍 Which Is Better: >>> or :deep()?

  • Vue 3 Compatibility:

    In Vue 3, the :deep() pseudo-class is the preferred method and will likely become the standard. It’s more semantic and readable than the >>> operator, which may feel a bit hacky.

  • Vue 2 Compatibility:

    If you’re using Vue 2, you’ll need to stick with >>>, as :deep() is not supported in Vue 2 by default. However, with Vue-loader updates, :deep() can also be used in Vue 2 if configured properly.


💡 Recommendation

  • If you're working in Vue 3, it's best to use :deep() as it’s more readable, modern, and future-compatible.
  • If you're using Vue 2, the deep selector (>>>) is a reliable option. However, if your project will upgrade to Vue 3, start using :deep() to future-proof your styles.

🔧 Bonus: Combining :deep() with Inline Styles

You can also use :deep() for inline styles if necessary:

<style scoped>
/* :deep() with dynamic style binding */
:deep(.child-text) {
  font-size: 20px;
  color: v-bind('textColor'); /* Example of using Vue dynamic styling */
}
</style>
Enter fullscreen mode Exit fullscreen mode

This ensures the child component gets the style, even when you bind data to the CSS dynamically!


🎯 Conclusion

Both >>> and :deep() selectors allow you to control the styles of child components while maintaining scoped styles. If you're using Vue 3, it's better to adopt the :deep() pseudo-class for a more modern, clean, and future-proof approach. However, >>> remains effective and reliable, especially in older Vue 2 projects.


Happy styling! 🎨

Comments 2 total

  • Jon Randy 🎖️
    Jon Randy 🎖️Sep 18, 2024

    This is out of date. It is recommended to use :deep(

    • Dharmendra Kumar
      Dharmendra KumarSep 18, 2024

      Thank you for pointing that out! 🙌 I’ve updated the documentation to reflect the latest recommendation of using :deep() instead of the older >>> syntax. Your feedback helps keep the content accurate and up-to-date. If you have any more suggestions or questions, feel free to let me know! 😊

Add comment