Стилизация динамически сгенерированного контента при использовании scoped CSS требует особого подхода, так как Vue добавляет атрибуты только к элементам шаблона.
Для доступа к динамически созданным элементам внутри scoped стилей:
<template>
<div class="dynamic-content" v-html="rawHTML"></div>
</template>
<style scoped>
.dynamic-content :deep(p) {
margin-bottom: 1rem;
line-height: 1.6;
}
.dynamic-content :deep(a) {
color: var(--primary-color);
}
</style>
Комбинация scoped и глобальных стилей через уникальный класс:
<template>
<div class="dynamic-content-wrapper">
<div class="dynamic-content" v-html="rawHTML"></div>
</div>
</template>
<style scoped>
/* Стили для обертки */
.dynamic-content-wrapper {
padding: 1rem;
}
</style>
<style>
/* Глобальные стили, ограниченные уникальным классом */
.dynamic-content-wrapper .dynamic-content p {
font-size: 16px;
}
</style>
Использование CSS-переменных, которые наследуются:
<template>
<div class="dynamic-parent">
<div v-html="content"></div>
</div>
</template>
<style scoped>
.dynamic-parent {
--dynamic-text-color: #333;
--dynamic-link-color: #42b983;
}
</style>
<style>
.dynamic-parent a {
color: var(--dynamic-link-color);
}
.dynamic-parent p {
color: var(--dynamic-text-color);
}
</style>
<template>
<article class="markdown-body" v-html="compiledMarkdown"></article>
</template>
<style scoped>
.markdown-body :deep(h1) {
font-size: 2rem;
border-bottom: 1px solid #eee;
}
</style>
<template>
<component :is="currentComponent" class="dynamic-component" />
</template>
<style scoped>
.dynamic-component :deep(.inner-element) {
padding: 1rem;
}
</style>
Проблема: Динамически добавленные классы не получают scoped атрибутов
Решение: Используйте префиксы или BEM-методологию
Проблема: Стили не применяются к порталам (teleport)
Решение: Либо глобальные стили, либо передача классов через props
<teleport to="body">
<div :class="[$style.modal, 'global-modal-class']">
<!— содержимое —>
</div>
</teleport>