Vuejs
Tutorial Vuejs: Estilización de componentes
Vue: estilización de componentes - Aprende a aplicar estilos en línea, clases CSS dinámicas, estilos scoped y CSS Modules para modularidad y código reutilizable.
Aprende Vuejs GRATIS y certifícateIntroducción a la Estilización en Vue.js
Vue.js permite una estilización flexible y potente de los componentes mediante varias técnicas que se adaptan a las necesidades de cada proyecto. La estilización en Vue puede realizarse utilizando estilos en línea, clases CSS dinámicas y estilos scoped, entre otros. Cada una de estas técnicas tiene sus propias ventajas y casos de uso específicos.
Para comenzar, es importante entender que Vue permite definir estilos directamente dentro de los componentes. Esto se puede hacer en la sección <style>
de un componente de archivo .vue
. Esta sección puede incluir CSS estándar, preprocesadores como SCSS o LESS, o incluso CSS-in-JS a través de bibliotecas adicionales.
Un ejemplo básico de un componente Vue con estilos incluidos sería el siguiente:
<template>
<div class="my-component">
<p class="text">Hola, Vue!</p>
</div>
</template>
<script>
export default {
name: 'MyComponent'
}
</script>
<style>
.my-component {
background-color: #f0f0f0;
padding: 20px;
}
.text {
color: #333;
font-size: 16px;
}
</style>
En este ejemplo:
- La sección
<template>
define la estructura HTML del componente. - La sección
<script>
contiene la lógica del componente. - La sección
<style>
incluye los estilos CSS específicos del componente.
Además de los estilos scoped, Vue permite el uso de clases dinámicas y vinculaciones de estilos en línea para una mayor flexibilidad. Esto se realiza mediante el uso de la directiva :class
y :style
respectivamente.
Por ejemplo, para aplicar clases dinámicas:
<template>
<div :class="{ active: isActive, 'text-large': isLarge }">
Dinamismo en clases
</div>
</template>
<script>
export default {
data() {
return {
isActive: true,
isLarge: false
}
}
}
</script>
<style scoped>
.active {
background-color: blue;
}
.text-large {
font-size: 24px;
}
</style>
En este caso:
- La clase
active
se aplicará siisActive
estrue
. - La clase
text-large
se aplicará siisLarge
estrue
.
Para estilos en línea dinámicos:
<template>
<div :style="{ color: activeColor, fontSize: fontSize + 'px' }">
Estilos en línea dinámicos
</div>
</template>
<script>
export default {
data() {
return {
activeColor: 'red',
fontSize: 14
}
}
}
</script>
Aquí, se aplican estilos en línea basados en los valores de activeColor
y fontSize
.
Estas técnicas proporcionan una base sólida para la estilización de componentes en Vue.js, permitiendo una alta modularidad y reutilización de código.
Estilos en línea
En Vue.js, los estilos en línea se pueden aplicar directamente a los elementos del DOM utilizando la directiva :style
. Esta directiva permite vincular un objeto de estilos a un elemento, proporcionando una forma flexible y dinámica de aplicar CSS. Los estilos en línea son útiles cuando se necesita cambiar los estilos de un elemento en respuesta a cambios en los datos del componente.
Para aplicar estilos en línea, se puede utilizar un objeto de JavaScript que representa los estilos CSS. Cada propiedad del objeto corresponde a una propiedad CSS, y su valor puede ser una cadena o una expresión que se evalúa.
Ejemplo básico de estilos en línea:
<template>
<div :style="{ color: textColor, fontSize: fontSize + 'px' }">
Texto con estilos en línea
</div>
</template>
<script>
export default {
data() {
return {
textColor: 'blue',
fontSize: 18
}
}
}
</script>
En este ejemplo, el color del texto y el tamaño de la fuente se definen dinámicamente a través de las propiedades textColor
y fontSize
del objeto data
. La directiva :style
se utiliza para vincular estos valores al estilo del elemento <div>
.
Además de los objetos de estilo, Vue también permite el uso de arrays para combinar múltiples objetos de estilo. Esto es útil cuando se desea aplicar múltiples conjuntos de estilos condicionalmente.
Ejemplo de uso de arrays de estilos:
<template>
<div :style="[baseStyles, additionalStyles]">
Texto con estilos combinados
</div>
</template>
<script>
export default {
data() {
return {
baseStyles: {
color: 'black',
fontSize: '16px'
},
additionalStyles: {
backgroundColor: 'yellow',
padding: '10px'
}
}
}
}
</script>
En este caso, se combinan los estilos definidos en baseStyles
y additionalStyles
. Vue se encarga de fusionar estos objetos y aplicar los estilos resultantes al elemento.
Para estilos más complejos, también es posible utilizar funciones que devuelvan objetos de estilo. Esto permite calcular los estilos en función de las propiedades reactivas del componente.
Ejemplo de estilos en línea con funciones:
<template>
<div :style="computedStyles">
Texto con estilos calculados
</div>
</template>
<script>
export default {
data() {
return {
isActive: true,
baseSize: 14
}
},
computed: {
computedStyles() {
return {
color: this.isActive ? 'green' : 'red',
fontSize: (this.baseSize + 2) + 'px'
}
}
}
}
</script>
En este ejemplo, la propiedad computedStyles
es una función que devuelve un objeto de estilo basado en las propiedades isActive
y baseSize
. La directiva :style
vincula este objeto al elemento.
Es importante tener en cuenta que, aunque los estilos en línea son una herramienta poderosa, deben utilizarse con moderación. El uso excesivo de estilos en línea puede dificultar el mantenimiento del código y la separación de preocupaciones en la aplicación. Para estilos complejos y reutilizables, es preferible utilizar clases CSS y módulos de estilo.
Clases CSS dinámicas, computed
En Vue.js, las clases CSS dinámicas se pueden gestionar de manera eficiente utilizando propiedades computadas (computed
). Esto permite que las clases CSS se apliquen de forma condicional y reactiva, mejorando la modularidad y mantenibilidad del código.
Para aplicar clases CSS dinámicas, Vue proporciona la directiva :class
, que permite enlazar un objeto o una función que retorna un objeto con las clases CSS que se deben aplicar a un elemento. Las propiedades computadas se utilizan para calcular estos objetos de clases de manera reactiva.
Ejemplo básico de clases CSS dinámicas con propiedades computadas:
<template>
<div :class="computedClasses">
Contenido con clases dinámicas
</div>
</template>
<script>
export default {
data() {
return {
isActive: true,
hasError: false
}
},
computed: {
computedClasses() {
return {
active: this.isActive,
'error-state': this.hasError
}
}
}
}
</script>
<style scoped>
.active {
background-color: green;
}
.error-state {
border: 1px solid red;
}
</style>
En este ejemplo, la propiedad computada computedClasses
retorna un objeto donde las claves son nombres de clases CSS y los valores son expresiones booleanas. La clase active
se aplicará si isActive
es true
, y la clase error-state
se aplicará si hasError
es true
.
Además de objetos, también se pueden utilizar arrays para combinar múltiples clases dinámicas:
<template>
<div :class="combinedClasses">
Contenido con clases combinadas
</div>
</template>
<script>
export default {
data() {
return {
isActive: true,
hasError: false
}
},
computed: {
combinedClasses() {
let classes = ['base-class'];
if (this.isActive) classes.push('active');
if (this.hasError) classes.push('error-state');
return classes;
}
}
}
</script>
<style scoped>
.base-class {
padding: 10px;
}
.active {
background-color: green;
}
.error-state {
border: 1px solid red;
}
</style>
En este caso, la propiedad computada combinedClasses
retorna un array de clases. La clase base-class
siempre se aplicará, mientras que active
y error-state
se aplicarán condicionalmente.
Para casos más complejos, se pueden combinar objetos y arrays para obtener una mayor flexibilidad en la aplicación de clases dinámicas:
<template>
<div :class="[baseClass, dynamicClasses]">
Contenido con clases dinámicas complejas
</div>
</template>
<script>
export default {
data() {
return {
baseClass: 'base-class',
isActive: true,
hasError: false
}
},
computed: {
dynamicClasses() {
return {
active: this.isActive,
'error-state': this.hasError
}
}
}
}
</script>
<style scoped>
.base-class {
padding: 10px;
}
.active {
background-color: green;
}
.error-state {
border: 1px solid red;
}
</style>
En este ejemplo, se combinan un string (baseClass
) y un objeto (dynamicClasses
) en la directiva :class
. Esto permite una gran flexibilidad en la gestión de clases CSS, aplicando tanto clases estáticas como dinámicas en un solo elemento.
El uso de clases CSS dinámicas a través de propiedades computadas en Vue.js facilita la creación de interfaces de usuario reactivas y modulares, permitiendo un control preciso sobre la presentación basada en el estado del componente.
Estilos scoped
En Vue.js, los estilos scoped permiten aplicar CSS de manera específica a un componente, evitando que estos estilos afecten a otros componentes de la aplicación. Esto se logra añadiendo el atributo scoped
a la etiqueta <style>
dentro del componente .vue
. Cuando se utiliza scoped
, Vue añade automáticamente atributos de data a los elementos del componente y a las reglas CSS, asegurando que los estilos se apliquen solo dentro del ámbito del componente.
Ejemplo básico de un componente con estilos scoped:
<template>
<div class="container">
<p class="text">Este es un componente con estilos scoped</p>
</div>
</template>
<script>
export default {
name: 'ScopedComponent'
}
</script>
<style scoped>
.container {
background-color: lightblue;
padding: 20px;
}
.text {
color: darkblue;
font-size: 18px;
}
</style>
En este ejemplo:
- La sección
<template>
define la estructura HTML del componente. - La sección
<script>
contiene la lógica del componente. - La sección
<style scoped>
incluye los estilos CSS específicos del componente. La palabra clavescoped
asegura que los estilos se apliquen solo a este componente, evitando conflictos con otros estilos en la aplicación.
El uso de estilos scoped es particularmente útil en aplicaciones grandes donde los componentes pueden compartir nombres de clases similares. Sin embargo, hay algunas consideraciones y limitaciones a tener en cuenta:
- Limitaciones en el alcance de los estilos: Los estilos scoped solo afectan a los elementos del componente donde están definidos. No se aplican a elementos hijos que están fuera del ámbito del componente, como los elementos de otros componentes hijos.
- Selección de elementos hijos: Para aplicar estilos a elementos hijos de otros componentes, se puede utilizar un selector profundo, que en Vue.js se representa con
>>>
o:deep()
. Este selector permite apuntar a elementos hijos dentro de un componente hijo.
Ejemplo de uso del selector profundo:
<!-- Componente Hijo -->
<template>
<p class="child-element">Hola mundo</p>
</template>
- Con:
>>>
<!-- Componente Padre -->
<template>
<div class="parent">
<ChildComponent />
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue'
export default {
components: {
ChildComponent
}
}
</script>
<style scoped>
.parent >>> .child-element {
color: red;
}
</style>
- Con:
deep()
<template>
<div class="parent">
<MiComponente />
</div>
</template>
<script>
import MiComponente from './components/mi-componente.vue';
export default {
components: {
MiComponente
}
}
</script>
<style scoped>
:deep(.child-element) {
color: red;
}
</style>
En este ejemplo, el selector >>>
o :deep()
se utiliza para aplicar estilos a .child-element
dentro de ChildComponent
.
- Uso de preprocesadores: Los estilos scoped funcionan bien con preprocesadores como SCSS o LESS. Simplemente se necesita asegurar que el atributo
scoped
se añade a la etiqueta<style>
.
Ejemplo con SCSS:
<template>
<div class="box">
<p class="text">Texto con SCSS scoped</p>
</div>
</template>
<script>
export default {
name: 'ScopedSCSSComponent'
}
</script>
<style scoped lang="scss">
.box {
background-color: #f9f9f9;
padding: 15px;
.text {
color: #333;
font-size: 16px;
}
}
</style>
En este caso, el preprocesador SCSS se utiliza para anidar reglas CSS dentro del componente, y los estilos scoped siguen aplicándose correctamente.
- Compatibilidad con bibliotecas de terceros: Cuando se utilizan bibliotecas de terceros que aplican sus propios estilos, es posible que los estilos scoped no sean suficientes para aislar completamente los estilos del componente. En estos casos, puede ser útil combinar estilos scoped con otras técnicas como CSS Modules o estilos en línea para asegurar un aislamiento completo.
En resumen, los estilos scoped en Vue.js proporcionan una forma efectiva de aplicar CSS de manera específica a componentes individuales, evitando conflictos de estilos y mejorando el mantenimiento de la aplicación. Aunque tienen algunas limitaciones, su uso en combinación con otras técnicas de estilización puede resultar en una solución robusta y flexible para la mayoría de los casos.
Introducción y uso de CSS Modules
CSS Modules es una técnica que permite la encapsulación de estilos en componentes de Vue.js, asegurando que los estilos definidos en un componente no afecten a otros componentes. Los CSS Modules funcionan generando nombres de clase únicos que se aplican a los elementos del componente, evitando conflictos de estilos y mejorando la mantenibilidad del código.
Para utilizar CSS Modules en un componente Vue, es necesario configurar el entorno de construcción para que soporte esta funcionalidad. En la mayoría de los casos, esto implica utilizar herramientas como vue-loader
en combinación con un gestor de paquetes como Webpack.
Ejemplo de configuración en vue.config.js
:
module.exports = {
css: {
modules: {
localIdentName: '[name]__[local]___[hash:base64:5]'
}
}
}
En este ejemplo, la opción localIdentName
define el formato de los nombres de clase generados. Esto permite personalizar cómo se crean los nombres de clase únicos.
Una vez configurado el entorno, se pueden definir y utilizar CSS Modules en un componente Vue de la siguiente manera:
<template>
<div :class="$style.container">
<p :class="$style.text">Este es un componente con CSS Modules</p>
</div>
</template>
<script>
export default {
name: 'CSSModulesComponent'
}
</script>
<style module>
.container {
background-color: lightgreen;
padding: 20px;
}
.text {
color: darkgreen;
font-size: 18px;
}
</style>
En este ejemplo:
- La sección
<template>
utiliza la directiva:class
para vincular las clases CSS generadas a los elementos del componente. - La sección
<style module>
define los estilos CSS. La palabra clavemodule
indica que estos estilos se gestionan como CSS Modules.
El uso de $style
en la plantilla permite acceder a los nombres de clase generados de manera única, asegurando que no haya conflictos con otros componentes.
CSS Modules también soporta el uso de preprocesadores como SCSS o LESS. Para utilizar un preprocesador, simplemente se especifica la opción lang
en la etiqueta <style>
.
Ejemplo con SCSS:
<template>
<div :class="$style.box">
<p :class="$style.text">Texto con SCSS y CSS Modules</p>
</div>
</template>
<script>
export default {
name: 'CSSModulesSCSSComponent'
}
</script>
<style module lang="scss">
.box {
background-color: #e0e0e0;
padding: 15px;
.text {
color: #444;
font-size: 16px;
}
}
</style>
En este caso, los estilos definidos en SCSS se gestionan como CSS Modules, manteniendo la encapsulación de los estilos.
Además de las clases, también es posible utilizar CSS Modules para definir animaciones y otros estilos complejos. Esto se realiza de la misma manera, asegurando que los nombres de las animaciones sean únicos.
Ejemplo de animaciones con CSS Modules:
<template>
<div :class="$style.container">
<p :class="$style.text">Texto con animación</p>
</div>
</template>
<script>
export default {
name: 'CSSModulesAnimationComponent'
}
</script>
<style module>
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.container {
animation: fadeIn 2s ease-in;
}
.text {
color: navy;
font-size: 20px;
}
</style>
En este ejemplo, la animación fadeIn
se define y utiliza dentro del componente, asegurando que no haya conflictos con otras animaciones en la aplicación.
El uso de CSS Modules en Vue.js proporciona una forma robusta de gestionar los estilos de manera encapsulada, mejorando la modularidad y evitando conflictos de estilos en aplicaciones complejas.
Ejercicios de esta lección Estilización de componentes
Evalúa tus conocimientos de esta lección Estilización de componentes con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.
Solicitud HTTP con Axios
Estilización de componentes en Vue.js
Comunicación de componentes con props
Uso de hooks de ciclo de vida en Vue
Introducción a los componentes
Introducción a Vue
Navegación programática y redirección
Uso de la directiva v-if en Vuejs
Crear componente Composition API
Realizar una solicitud GET con Fetch API en Vue
Uso avanzado de los composables
Galería de imágenes con navegación y rutas
Uso de rutas anidadas y dinámicas
Definición y manejo de rutas en Vue
Uso de la directiva v-for en Vuejs
Manejo de eventos con v-on
Crear un componente con Options API en Vue
Creación de rutas con Vue Router
Uso básico de los composables
Binding bidireccional con v-model y defineModel
Instalación y configuración
Lista de tareas básica en Vuejs
Uso de provide e inject
Gestión de tareas con estado global y API
Introducción a la sintaxis de plantillas
Implementar reactividad con ref y reactive
Componente Vue con Suspense
Evaluación test de conocimientos Vuejs
Todas las lecciones de Vuejs
Accede a todas las lecciones de Vuejs y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Introducción A Vue Y Su Ecosistema
Introducción Y Entorno
Instalar Y Configurar Vue Con Vite
Introducción Y Entorno
Introducción A La Sintaxis De Plantillas
Componentes
Introducción A Componentes
Componentes
Componentes Con Options Api
Componentes
Componentes Con Composition Api
Componentes
Renderizado Condicional Con V-if
Componentes
Renderizado Iterativo Con V-for
Componentes
Props Y Comunicación Entre Componentes
Componentes
Manejo De Eventos En Vue Con V-on
Componentes
Binding Bidireccional Con V-model Y Definemodel
Componentes
Estilización De Componentes
Componentes
Reactividad Con Ref Y Reactive
Composición Y Reactividad
Ciclo De Vida Con Composition Api
Composición Y Reactividad
Composition Api: Provide E Inject
Composición Y Reactividad
Introducción A Los Composables
Composición Y Reactividad
Uso Avanzado De Composables
Composición Y Reactividad
Introducción A Vue Router
Navegación Y Enrutamiento
Definición Y Manejo De Rutas
Navegación Y Enrutamiento
Rutas Anidadas Y Dinámicas
Navegación Y Enrutamiento
Navegación Programática Y Redirección
Navegación Y Enrutamiento
Solicitudes Http Con Fetch Api
Interacción Http Con Apis De Backend
Solicitudes Http Con Axios
Interacción Http Con Apis De Backend
Introducción A Suspense
Interacción Http Con Apis De Backend
Evaluación Test De Conocimientos Vuejs
Evaluación
Certificados de superación de Vuejs
Supera todos los ejercicios de programación del curso de Vuejs y obtén certificados de superación para mejorar tu currículum y tu empleabilidad.
En esta lección
Objetivos de aprendizaje de esta lección
- Aplicar estilos en línea dinámicos a componentes Vue.js.
- Utilizar clases CSS dinámicas mediante propiedades computadas (
computed
) en Vue.js. - Implementar estilos scoped para asegurar la modularidad y evitar conflictos de estilos.
- Introducir y gestionar CSS Modules en componentes Vue.js.
- Configurar el entorno de construcción para soportar CSS Modules.