Guías Detalladas
Componentes

Estilos en componentes

TIP: Esta guía asume que ya has leído la Guía de Fundamentos. Léela primero si eres nuevo en Angular.

Los componentes pueden incluir opcionalmente estilos CSS que se aplican al DOM de ese componente:

@Component({  selector: 'profile-photo',  template: `<img src="profile-photo.jpg" alt="Tu foto de perfil">`,  styles: ` img { border-radius: 50%; } `,})export class ProfilePhoto { }

También puedes elegir escribir tus estilos en archivos separados:

@Component({  selector: 'profile-photo',  templateUrl: 'profile-photo.html',  styleUrl: 'profile-photo.css',})export class ProfilePhoto { }

Cuando Angular compila tu componente, estos estilos se emiten junto con la salida JavaScript de tu componente. Esto significa que los estilos del componente participan en el sistema de módulos de JavaScript. Cuando renderizas un componente Angular, el framework incluye automáticamente sus estilos asociados, incluso cuando se carga un componente de forma diferida.

Angular funciona con cualquier herramienta que genere CSS, incluyendo Sass, less, y stylus.

Alcance de estilos

Cada componente tiene una configuración de encapsulación de vista que determina cómo el framework delimita el alcance de los estilos de un componente. Hay tres modos de encapsulación de vista: Emulated, ShadowDom, y None. Puedes especificar el modo en el decorador @Component:

@Component({  ...,  encapsulation: ViewEncapsulation.None,})export class ProfilePhoto { }

ViewEncapsulation.Emulated

Por defecto, Angular usa encapsulación emulada para que los estilos de un componente solo se apliquen a elementos definidos en la plantilla de ese componente. En este modo, el framework genera un atributo HTML único para cada instancia del componente, añade ese atributo a los elementos en la plantilla del componente, e inserta ese atributo en los selectores CSS definidos en los estilos de tu componente.

Este modo asegura que los estilos de un componente no se filtren y afecten otros componentes. Sin embargo, los estilos globales definidos fuera de un componente aún puede afectar elementos dentro de un componente con encapsulación emulada.

En modo emulado, Angular admite las pseudo-clases :host y :host-context() sin usar Shadow DOM. Durante la compilación, el framework transforma estas pseudo-clases en atributos para que no cumpla con las reglas de estas pseudo-clases nativas en tiempo de ejecución (ej. compatibilidad del navegador, especificidad). El modo de encapsulación emulada de Angular no admite ninguna otra pseudo-clase relacionada con Shadow DOM, como ::shadow o ::part.

::ng-deep

El modo de encapsulación emulada de Angular admite una pseudo-clase personalizada, ::ng-deep. Aplicar esta pseudo-clase a una regla CSS deshabilita la encapsulación para esa regla, convirtiéndola efectivamente en un estilo global. El equipo de Angular desaconseja fuertemente el uso nuevo de ::ng-deep. Estas APIs permanecen exclusivamente para compatibilidad hacia atrás.

ViewEncapsulation.ShadowDom

Este modo delimita el alcance de los estilos dentro de un componente usando la API estándar web de Shadow DOM. Al habilitar este modo, Angular adjunta un shadow root (raíz de sombra) al elemento host del componente y renderiza la plantilla y los estilos del componente en el árbol de sombra (shadow tree) correspondiente.

Este modo garantiza estrictamente que solo los estilos de ese componente se apliquen a elementos en la plantilla del componente. Los estilos globales no pueden afectar a elementos en un árbol de sombra y los estilos dentro del árbol de sombra no pueden afectar a elementos fuera de ese árbol de sombra.

Habilitar la encapsulación ShadowDom, sin embargo, impacta más que el alcance de estilos. Renderizar el componente en un árbol de sombra afecta la propagación de eventos, la interacción con la API <slot>, y cómo las herramientas de desarrollador del navegador muestran elementos. Siempre entiende las implicaciones completas de usar Shadow DOM en tu aplicación antes de habilitar esta opción.

ViewEncapsulation.None

Este modo deshabilita toda la encapsulación de estilos para el componente. Cualquier estilo asociado con el componente se comporta como estilos globales.

NOTA: En los modos Emulated y ShadowDom, Angular no garantiza al 100% que los estilos de tu componente siempre sobrescriban los estilos que vienen de fuera. Se asume que estos estilos tienen la misma especificidad que los estilos de tu componente en caso de colisión.

Definir estilos en plantillas

Puedes usar el elemento <style> en la plantilla de un componente para definir estilos adicionales. El modo de encapsulación de vista del componente se aplica a los estilos definidos de esta manera.

Angular no admite enlaces dentro de elementos de estilo.

Referenciar archivos de estilo externos

Las plantillas de componentes pueden usar el elemento <link> para referenciar archivos CSS. Además, tu CSS puede usar la regla at @import para referenciar archivos CSS. Angular trata estas referencias como estilos externos. Los estilos externos no se ven afectados por la encapsulación de vista emulada.