--- title: Use Deep Selectors for Styling Child Component Elements impact: HIGH impactDescription: Scoped styles cannot target elements inside child components without deep selectors, leading to silently broken styles type: gotcha tags: [vue3, sfc, scoped-css, deep-selector, child-components] --- # Use Deep Selectors for Styling Child Component Elements **Impact: HIGH** - When using scoped CSS in Vue SFCs, styles do not penetrate into child components. Without using deep selectors (`:deep()`), your styles will silently fail to apply to elements rendered by child components or third-party libraries. ## Task Checklist - [ ] Use `:deep()` selector to style elements inside child components - [ ] Never use deprecated `>>>` or `/deep/` selectors (Vue 3 only supports `:deep()`) - [ ] Scope deep selectors to a parent class when possible to limit impact - [ ] Consider using unscoped styles or CSS modules for heavily nested styling **Problematic Code:** ```vue ``` **Correct Code:** ```vue ``` ## How Scoped CSS Works Vue scoped CSS adds a unique data attribute to all elements in the component's template and appends it to CSS selectors: ```vue
...
``` ```css /* Generated scoped CSS */ .container[data-v-7ba5bd90] .date-input[data-v-7ba5bd90] { ... } /* ^ This won't match because .date-input doesn't have the attribute */ ``` ## Vue 3 Deep Selector Syntax ```vue ``` ## Scoping Deep Selectors for Safety Always scope `:deep()` to a parent selector to limit its reach: ```vue ``` ## Child Component Root Element Exception Note: A child component's root element IS affected by parent scoped CSS. This is intentional for layout purposes: ```vue ``` ## Performance Consideration Using `:deep()` with element selectors can be slower: ```vue ``` ## Reference - [Vue.js Scoped CSS - Deep Selectors](https://vuejs.org/api/sfc-css-features.html#deep-selectors) - [Vue Loader Scoped CSS](https://vue-loader.vuejs.org/guide/scoped-css.html)