CodeAventura
Astro
▸Estilos en Astro▸Estilos scoped por componente

Misión

●iniciando…
Astro
Preparando entorno

Esto solo ocurre la primera vez que abres el curso.

04 / 22Estilos scoped por componente
Anterior

Estilos scoped por componente

El problema clásico del CSS

Has trabajado con CSS y conoces el dolor: una regla escrita para .card en una página acaba pisando .card en otra. Soluciones históricas:

  • BEM y otras convenciones de nombres
  • CSS Modules, que añaden hashes a las clases
  • CSS-in-JS, que mete los estilos en JavaScript

Astro tiene una respuesta simple: si pones un bloque <style> dentro de un archivo .astro, esos estilos solo afectan a ese archivo.

¿Cómo funciona?

Astro añade un atributo único a los elementos del componente y lo usa para hacer scoping. Tú no ves nada de esto: escribes CSS normal.

El h1 solo se pone morado en este archivo. Si tienes otro .astro con un h1, no se verá afectado. Mágico, sin que tengas que pensar en colisiones.

Estilos globales (cuando los necesites)

A veces quieres un estilo que sí aplique a toda la página: tipografía base, colores de marca, reset. Tienes dos opciones:

1. Marca el bloque con is:global:

2. Importa un CSS desde el frontmatter:

Esa importación carga el archivo en todas las páginas que extiendan el layout que la incluye.

Variables CSS y define:vars

Astro tiene una directiva especial para pasar valores de JS a CSS:

Útil cuando un mismo componente recibe colores o tamaños como props.

Scoping y selectores compuestos

El scoping es por elemento, no por archivo. Si tu componente envuelve a otro, sus reglas no llegan a los hijos. Para que afecten a un descendiente, usa el modificador :global:

Tu desafío 🚀

Abre src/pages/index.astro. Tienes un <h1> y un <p>.

  1. Añade un bloque <style>...</style> (al final del archivo o donde te resulte natural)
  2. Dentro, escribe una regla para h1 con la propiedad color (ponle el color que más te guste)
  3. Bonus: añade reglas para el <p> y juega con font-size, letter-spacing...

Recuerda: lo que escribas aquí está encapsulado a este archivo. Si más tarde creamos otra página con su propio <h1>, no se va a teñir.