Vue.js

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ícate

Introducció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á si isActive es true.
  • La clase text-large se aplicará si isLarge es true.

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 clave scoped 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:

  1. 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.
  2. 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>
  1. 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>
  1. 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.

  1. 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.

  1. 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 clave module 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.

Aprende Vuejs GRATIS online

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.

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

Vue.js

Introducción Y Entorno

Instalar Y Configurar Vue Con Vite

Vue.js

Introducción Y Entorno

Introducción A La Sintaxis De Plantillas

Vue.js

Componentes

Introducción A Componentes

Vue.js

Componentes

Componentes Con Options Api

Vue.js

Componentes

Componentes Con Composition Api

Vue.js

Componentes

Renderizado Condicional Con V-if

Vue.js

Componentes

Renderizado Iterativo Con V-for

Vue.js

Componentes

Props Y Comunicación Entre Componentes

Vue.js

Componentes

Manejo De Eventos En Vue Con V-on

Vue.js

Componentes

Binding Bidireccional Con V-model Y Definemodel

Vue.js

Componentes

Estilización De Componentes

Vue.js

Componentes

Reactividad Con Ref Y Reactive

Vue.js

Composición Y Reactividad

Ciclo De Vida Con Composition Api

Vue.js

Composición Y Reactividad

Composition Api: Provide E Inject

Vue.js

Composición Y Reactividad

Introducción A Los Composables

Vue.js

Composición Y Reactividad

Uso Avanzado De Composables

Vue.js

Composición Y Reactividad

Introducción A Vue Router

Vue.js

Navegación Y Enrutamiento

Definición Y Manejo De Rutas

Vue.js

Navegación Y Enrutamiento

Rutas Anidadas Y Dinámicas

Vue.js

Navegación Y Enrutamiento

Navegación Programática Y Redirección

Vue.js

Navegación Y Enrutamiento

Solicitudes Http Con Fetch Api

Vue.js

Interacción Http Con Apis De Backend

Solicitudes Http Con Axios

Vue.js

Interacción Http Con Apis De Backend

Introducción A Suspense

Vue.js

Interacción Http Con Apis De Backend

Evaluación Test De Conocimientos Vuejs

Vue.js

Evaluación

Accede GRATIS a Vuejs y certifícate

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

  1. Aplicar estilos en línea dinámicos a componentes Vue.js.
  2. Utilizar clases CSS dinámicas mediante propiedades computadas (computed) en Vue.js.
  3. Implementar estilos scoped para asegurar la modularidad y evitar conflictos de estilos.
  4. Introducir y gestionar CSS Modules en componentes Vue.js.
  5. Configurar el entorno de construcción para soportar CSS Modules.