--- title: Scoped CSS Does Not Apply to Dynamically Added Content impact: HIGH impactDescription: Programmatically inserted DOM elements won't receive scoped style data attributes, causing styles to fail silently type: gotcha tags: [vue3, sfc, scoped-css, dynamic-content, v-html] --- # Scoped CSS Does Not Apply to Dynamically Added Content **Impact: HIGH** - Vue's scoped CSS works by adding data attributes to elements at compile time. Content added dynamically at runtime (via `v-html`, JavaScript DOM manipulation, or third-party libraries) won't have these attributes, so scoped styles won't apply. ## Task Checklist - [ ] For `v-html` content, use `:deep()` selectors or unscoped styles - [ ] Avoid programmatic DOM manipulation; prefer Vue's reactive template system - [ ] When DOM manipulation is unavoidable, use global styles with unique class prefixes - [ ] Consider CSS modules for content that mixes static and dynamic elements **Problematic Code:** ```vue ``` **Correct Code:** ```vue ``` ## Why This Happens Vue scoped CSS adds a unique data attribute (e.g., `data-v-7ba5bd90`) to: 1. All elements in the component's template (at compile time) 2. All CSS selectors ```html

This is dynamic content

``` ```css /* Generated scoped CSS */ .dynamic[data-v-7ba5bd90] { color: red; } /* ^ Won't match because the dynamic

doesn't have data-v-7ba5bd90 */ ``` ## Alternative: Global Styles with Unique Prefix ```vue ``` ## Programmatic DOM Manipulation When using third-party libraries that manipulate the DOM: ```vue ``` ## Best Practice: Prefer Reactive Templates Instead of dynamic HTML, use Vue's reactive system when possible: ```vue ``` ## Reference - [Vue.js Scoped CSS](https://vuejs.org/api/sfc-css-features.html#scoped-css) - [GitHub Issue: Scoped CSS not applied for programmatically added elements](https://github.com/vuejs/vue/issues/7649)