Estilos y CSS
Astro fue diseñado para que estilar y escribir CSS sea pan comido. Escribe tu propio CSS directamente dentro de un componente de Astro o importa tu biblioteca de CSS favorita como Tailwind. También es compatible con lenguajes de estilo avanzados como Sass y Less.
Estilando en Astro
Sección titulada «Estilando en Astro»Estilar un componente de Astro es tan fácil como agregar una etiqueta <style> a tu componente o plantilla de página. Cuando colocas una etiqueta <style> dentro de un componente de Astro, Astro detectará el CSS e incluirá tus estilos automáticamente.
<style> h1 { color: red; }</style>Estilos locales
Sección titulada «Estilos locales»Las reglas de CSS en Astro <style> tienen un alcance local de forma predeterminada. Los estilos con alcance local se compilan para que sólo se apliquen al HTML escrito dentro de ese mismo componente. El CSS escrito dentro de un componente de Astro se encapsula automáticamente dentro del mismo.
Este CSS:
<style> h1 { color: red; }
.text { color: blue; }</style>Se compila en esto:
<style> h1[data-astro-cid-hhnqfkh6] { color: red; } .text[data-astro-cid-hhnqfkh6] { color: blue; }</style>Los estilos locales no se filtran y no afectarán al resto de tu sitio web. En Astro, está bien usar selectores de baja especificidad como h1 {} o p {} porque se compilarán con alcance local en el resultado final.
Los estilos locales tampoco se aplicarán a otros componentes de Astro contenidos dentro del maquetado. Si necesitas estilar un componente hijo, considera envolver ese componente en un <div> (u otro elemento) que luego puedas estilar.
La especificidad de los estilos locales se conserva, lo que les permite convivir junto con otros archivos o librerías de CSS y, al mismo tiempo, conservar el encapsulamiento que impide que los estilos se filtren fuera del componente.
Estilos globales
Sección titulada «Estilos globales»Si bien recomendamos estilos locales para la mayoría de los componentes, eventualmente puedes encontrar una razón válida para escribir CSS global. Puedes desactivar el CSS con alcance local predeterminado con el atributo <style is:global>.
<style is:global> /* Global, entregada tal como está al navegador. Se aplica a todas las etiquetas <h1> de tu sitio web. */ h1 { color: red; }</style>También puedes mezclar reglas de CSS globales y locales en la misma etiqueta <style> usando el selector :global(). Esto se convierte en un patrón poderoso para aplicar estilos CSS a los elementos hijos de tu componente.
<style> /* Con alcance solo a este componente */ h1 { color: red; } /* Mixta: se aplica solo a los elementos `h1` hijos. */ article :global(h1) { color: blue; }</style><h1>Titulo</h1><article><slot /></article>Esta es una excelente manera de estilar cosas como artículos de blog o documentos con contenido basado en CMS donde el contenido vive fuera de Astro. Pero ten cuidado: los problemas relacionados a componentes cuyo estilo depende del componente padre pueden volverse difíciles de solucionar.
Los estilos locales deben usarse con la mayor frecuencia posible. Los estilos globales deben usarse solo cuando sea necesario.
Combinando clases con class:list
Sección titulada «Combinando clases con class:list»Si necesitas combinar clases sobre un elemento dinámicamente, puedes usar el atributo class:list en archivos .astro.
---const { isRed } = Astro.props;---<!-- Si `isRed` es verdadero, la clase será "box red". --><!-- Si `isRed` es falso, la clase será "box". --><div class:list={['box', { red: isRed }]}><slot /></div><style> .box { border: 1px solid blue; } .red { border-color: red; }</style>class:list.
Variables de CSS
Sección titulada «Variables de CSS»
Agregado en:
astro@0.21.0
La etiqueta <style> de Astro puede hacer referencia a cualquier variable CSS disponible en la página. También puedes pasar variables CSS directamente desde el frontmatter de tu componente usando la directiva define:vars.
---const foregroundColor = "rgb(221 243 228)";const backgroundColor = "rgb(24 121 78)";---<style define:vars={{ foregroundColor, backgroundColor }}> h1 { background-color: var(--backgroundColor); color: var(--foregroundColor); }</style><h1>Hola</h1>define:vars.
Pasando una class a un componente hijo
Sección titulada «Pasando una class a un componente hijo»En Astro, los atributos HTML tales como class no se pasan automáticamente a los componentes hijos.
En cambio, debes aceptar una prop class en el componente hijo y aplicársela al elemento raíz. Al desestructurar las props debes renombrarlo, porque class es una palabra clave (o reservada) en JavaScript.
Usando la estrategia por defecto de estilo con ámbito, también debes pasar el atributo data-astro-cid-*. Puedes hacer esto pasando el ...rest de las props al componente. Si has cambiado scopedStyleStrategy a 'class' o 'where', la prop ...rest no es necesaria.
---const { class: className, ...rest } = Astro.props;---<div class={className} {...rest}> <slot/></div>---import MyComponent from "../components/MyComponent.astro"---<style> .red { color: red; }</style><MyComponent class="red">¡Esto será rojo!</MyComponent>Debido a que el atributo data-astro-cid-* incluye al hijo en el alcance de su padre, es posible que los estilos se propaguen del padre al hijo. Para evitar que esto tenga efectos secundarios no deseados, asegúrate de usar nombres de clase únicos en el componente hijo.
Estilos en línea
Sección titulada «Estilos en línea»Puedes estilar elementos HTML en línea utilizando el atributo style. Esto puede ser un string CSS o un objeto de propiedades CSS.
// Estos son equivalentes:<p style={{ color: "brown", textDecoration: "underline" }}>My text</p><p style="color: brown; text-decoration: underline;">My text</p>Estilos externos
Sección titulada «Estilos externos»Hay dos formas de resolver hojas de estilo globales externas: la primera es usando una importación ESM para archivos ubicados dentro de src/, y la segunda es usando la URL absoluta para archivos ubicados en la carpeta public/, o alojados fuera de tu proyecto.
public/ o src/.
Importando una hoja de estilo local
Sección titulada «Importando una hoja de estilo local»Es posible que debas actualizar el archivo astro.config al importar CSS desde paquetes npm. Consulta la sección “importando hojas de estilo desde un paquete npm” a continuación.
Puedes importar hojas de estilo en el script de tu componente de Astro utilizando la sintaxis de importación ESM. Las importaciones de CSS funcionan como cualquier otra importación ESM en un componente de Astro, deben referenciarse usando la ruta relativa al componente y deben estar escritas en la parte superior del script de su componente, con cualquier otra importación.
---// Astro empaquetará y optimizará este CSS automáticamente// Esto también funciona para archivos de preprocesadores como .scss, .styl, etc.import '../styles/utils.css';---<html><!-- Tu página aquí --></html>Usar import con CSS a través de ESM es compatible con cualquier archivo JavaScript, incluidos los componentes JSX como React y Preact. Esto puede ser útil para escribir estilos granulares por componente para tus componentes de React.
Importando una hoja de estilos desde un paquete npm
Sección titulada «Importando una hoja de estilos desde un paquete npm»Es posible que también necesites cargar hojas de estilos desde un paquete npm externo. Esto es especialmente común para utilidades como Open Props. Si tu paquete recomienda usar una extensión de archivo (es decir, package-name/styles.css en lugar de package-name/styles), esto debería funcionar como cualquier hoja de estilo local:
---import 'package-name/styles.css';---<html><!-- Tu página aquí --></html>Si tu paquete no sugiere usar una extensión de archivo (es decir, package-name/styles), ¡primero deberás actualizar tu configuración de Astro!
Digamos que estás importando un archivo CSS desde package-name llamado normalize (con la extensión de archivo omitida). Para asegurarnos de que podamos prerenderizar tu página correctamente, agrega package-name al array vite.ssr.noExternal:
import { defineConfig } from 'astro/config';
export default defineConfig({ vite: { ssr: { noExternal: ['package-name'], } }})Esta es una configuración específica de Vite que no se relaciona con (ni requiere) Astro SSR.
Ahora, puedes importar package-name/normalize. Esto será incluido y optimizado por Astro como cualquier otra hoja de estilos local.
---import 'package-name/normalize';---<html><!-- Tu página aquí --></html>Carga una hoja de estilos a través de etiquetas de “link”
Sección titulada «Carga una hoja de estilos a través de etiquetas de “link”»También puedes usar la etiqueta <link> para cargar una hoja de estilos en la página. Esta deberá ser una ruta URL absoluta a un archivo CSS ubicado en la carpeta /public, o una URL a un sitio web externo. Los valores href relativos en <link> no son compatibles.
<head> <!-- Local: /public/styles/global.css --> <link rel="stylesheet" href="/styles/global.css" /> <!-- Externo --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs@1.24.1/themes/prism-tomorrow.css" /></head>Debido a que este método utiliza la carpeta public/, se salta el procesamiento, empaquetado y las optimizaciones de CSS que proporciona Astro. Si necesitas estas transformaciones, utiliza el método anterior importando una hoja de estilo local.
Orden de Cascada
Sección titulada «Orden de Cascada»En ocasiones, los componentes de Astro deberán evaluar múltiples fuentes de CSS. Por ejemplo, tu componente podría importar una hoja de estilos CSS, incluir su propia etiqueta <style>, y ser renderizado dentro de un layout que importa CSS.
Cuando se aplican reglas conflictivas de CSS a un mismo elemento, los navegadores usan primero la especificidad y después el orden de aparición para determinar qué valor mostrar.
Si una regla es más específica que otra, no importa dónde aparezca la regla de CSS, su valor tendrá prioridad:
<style> h1 { color: red } div > h1 { color: purple }</style><div> <h1> ¡Este encabezado será morado! </h1></div>Si dos reglas tienen la misma especificidad, entonces el orden de aparición es evaluado, y el último valor de la regla tomará prioridad:
<style> h1 { color: purple } h1 { color: red }</style><div> <h1> ¡Este encabezado será rojo! </h1></div>Las reglas de CSS de Astro son evaluadas en este orden de aparición:
- etiquetas
<link>dentro de la etiqueta head (prioridad más baja) - estilos importados
- estilos locales (prioridad más alta)
Estilos locales
Sección titulada «Estilos locales»Dependiendo del valor que elijas para scopedStyleStrategy (EN), los estilos con alcance (scoped styles) pueden o no aumentar la especificidad de la columna CLASS.
Sin embargo, los estilos con alcance siempre aparecerán al final en el orden de aparición. Por lo tanto, estos estilos tendrán prioridad sobre otros estilos con la misma especificidad. Por ejemplo, si importas una hoja de estilos que entra en conflicto con un estilo con alcance, se aplicará el valor del estilo con alcance:
h1 { color: purple;}---import "./hazlo-morado.css"---<style> h1 { color: red }</style><div> <h1> ¡Este encabezado será rojo! </h1></div>Los estilos con alcance serán sobrescritos si el estilo importado es más específico. El estilo con mayor especificidad tendrá prioridad sobre el estilo con alcance:
#intro { color: purple;}---import "./hazlo-morado.css"---<style> h1 { color: red }</style><div> <h1 id="intro"> ¡Este encabezado será morado! </h1></div>Orden de importación
Sección titulada «Orden de importación»Cuando importas múltiples hojas de estilo en un componente de Astro, las reglas de CSS son evaluadas en el orden en que son importadas. Una mayor especificidad siempre determinará qué estilos mostrar, no importa cuándo es evaluado el CSS. Pero, cuando haya estilos conflictivos que tengan la misma especificidad, el último estilo importado gana:
div > h1 { color: purple;}div > h1 { color: green;}---import "./hazlo-verde.css"import "./hazlo-morado.css"---<style> h1 { color: red }</style><div> <h1> ¡Este encabezado será morado! </h1></div>Mientras que las etiquetas <style> son locales y solo aplican al componente donde se las declara, puede “filtrarse” CSS importado a otros componentes. Al importar un componente se aplica cualquier CSS que este importe, incluso si el componente nunca es usado:
---import "./hazlo-morado.css"---<div> <h1>Yo importo CSS morado.</h1></div>---import "./hazlo-verde.css"import ComponenteMorado from "./ComponenteMorado.astro";---<style> h1 { color: red }</style><div> <h1> ¡Este encabezado será morado! </h1></div>Un patrón común en Astro es importar CSS global dentro de un componente Plantilla. Asegúrate de importar el componente Plantilla antes que otros imports de este modo sus estilos tendrán la importancia más baja.
Etiquetas link
Sección titulada «Etiquetas link»Las hojas de estilo cargadas mediante etiquetas link son evaluadas en orden, antes que cualquier otro estilo en un archivo de Astro. Por lo tanto, esos estilos tendrán menor importancia que las hojas de estilo importadas y los estilos locales:
---import "../components/hazlo-morado.css"---
<html lang="en"> <head> <meta charset="utf-8" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <meta name="viewport" content="width=device-width" /> <meta name="generator" content={Astro.generator} /> <title>Astro</title> <link rel="stylesheet" href="/styles/hazlo-azul.css" /> </head> <body> <div> <h1>Esto será morado</h1> </div> </body></html>