# Características de estilos de SFC
# <style scoped>
Cuando una etiqueta <style>
tiene el atributo scoped
, sus CSS sólo serán aplicadas a elementos del componente actual. Este es similar a la encapsulación de estilos encontrados en DOM shadow. Viene con algunas advertencias, pero no necesita cualquier polyfill. Es realizado mediante utlizar PostCSS para transformar el siguiente:
<style scoped>
.example {
color: red;
}
</style>
<template>
<div class="example">hi</div>
</template>
2
3
4
5
6
7
8
9
al siguiente:
<style>
.example[data-v-f3f3eg9] {
color: red;
}
</style>
<template>
<div class="example" data-v-f3f3eg9>hi</div>
</template>
2
3
4
5
6
7
8
9
# Los Elementos Raíz de Componentes Hijos
Con scoped
, los estilos del componente padre no se filtrarán a componentes hijos. Sin embargo, el nodo raíz de un componente hijo será afectado por las CSS del alcance padre y las CSS del alcance hijo. Eso es a propósito para que el padre pueda aplicar estilos al elemento raíz del hijo para el propósito de layout.
# Selector Deep
Si quiere que un selector en estilos con alcance sea "profundo", p. ej. afectar componentes hijos, puede utilizar el pseudo-class :deep()
:
<style scoped>
.a :deep(.b) {
/* ... */
}
</style>
2
3
4
5
El arriba será compilado a:
.a[data-v-f3f3eg9] .b {
/* ... */
}
2
3
TIP
Los contenidos DOM creados por v-html
no son afectados por estilos con alcance, pero puede también aplicar estilos a ellos utilizando selectores profundos.
# Selector Slotted
Por defecto, los estilos con alcance no afectan a contenidos renderizados por <slot/>
, debido a que son considerados pertenecientes al componente padre que los pasen. Para orientar explícitamente los contenidos de slot, utilice el pseudo-class :slotted
:
<style scoped>
:slotted(div) {
color: red;
}
</style>
2
3
4
5
# Selector Global
Si quiere que se aplique solo una regla globalmente, puede utilizar el pseudo-class :global
en vez de crear otro <style>
(vea abajo):
<style scoped>
:global(.red) {
color: red;
}
</style>
2
3
4
5
# Mezclar Los Estilos Locales y Globales
Puede también incluir estilos tanto con alcance como sin alcance en el mismo componente:
<style>
/* estilos globales */
</style>
<style scoped>
/* estilos locales */
</style>
2
3
4
5
6
7
# Scoped Style Tips
Los estilos con alcance no elimina la necesidad de clases. Debido a la manera que utilizan los navegadores para renderizar varios selectores CSS,
p { color: red }
será muchas veces más lentos cuando se utilice con alcance (es decir, cuando está combinado con un selector de atributo). Si utiliza clases o ids en su lugar, tal como en.example { color: red }
, luego prácticamente elimina el impacto en el rendimiento.¡Tenga cuidado con selectores de descendientes en componentes recursivos! Para una regla CSS con el selector
.a .b
, si el elemento que coincide con.a
contiene un componente hijo recursivo, luego todos.b
en ese componente hijo se harán coincidir por la regla.
# <style module>
Una etiqueta <style module>
es compilada como módulos CSS (opens new window) y expuesta las clases CSS resultantes al componente como un objeto debajo la clave $style
:
<template>
<p :class="$style.red">
Este debe ser rojo
</p>
</template>
<style module>
.red {
color: red;
}
</style>
2
3
4
5
6
7
8
9
10
11
Las clases resultantes utilizan hash para evitar colisión, realiza el mismo efecto de CSS con alcance al componente actual solamente.
Refierase a la la especificación de módulos CSS (opens new window) para más detalles tal como excepciones globales (opens new window) y composición (opens new window).
# Personalizar el nombre de inyección
Puede personalizar la clave de la propiedad del objeto de clases inyectadas mediante darle un valor al atributo module
:
<template>
<p :class="classes.red">red</p>
</template>
<style module="classes">
.red {
color: red;
}
</style>
2
3
4
5
6
7
8
9
# Uso con API de Composición
Las clases inyectadas pueden ser accesadas en setup()
y <script setup>
mediante la API useCssModule
. Para bloques <style module>
con nombres de inyección personalizados, useCssModule
acepta el valor del atributo coincidente module
como su primer argumento:
// por defecto retorna clases para <style module>
useCssModule()
// nombrado, retorna clases para <style module="classes">
useCssModule('classes')
2
3
4
5
# CSS dinámico impulsado por estados
Las etiquetas <style>
soporta enlacer valores CSS a estados dinámicos de componentes utilizando la función CSS v-bind
:
<template>
<div class="text">hello</div>
</template>
<script>
export default {
data() {
return {
color: 'red'
}
}
}
</script>
<style>
.text {
color: v-bind(color);
}
</style>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
La sintaxis funciona con <script setup>
, y soporta expresiones JavaScript (debe encerrarse entre comillas):
<script setup>
const theme = {
color: 'red'
}
</script>
<template>
<p>hello</p>
</template>
<style scoped>
p {
color: v-bind('theme.color');
}
</style>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
El valor actual será compilado a una propiedad CSS personalizada, así que el CSS es todavía estático. la propiedad personalizada será aplicada al elemento raíz del componente mediante estilos en línea y actualizada reactivamente si el valor del fuente se cambie.