Next.js ofrece múltiples formas de manejar estilos CSS. Esta guía te explica cada método con ejemplos prácticos y cuándo usar cada uno.
Los estilos son las reglas CSS que definen cómo se ve tu aplicación web. Next.js te permite usar CSS de diferentes maneras, desde archivos CSS tradicionales hasta soluciones más modernas como CSS Modules.
El CSS básico es la forma tradicional de escribir estilos usando archivos .css normales.
/* Estilos globales para toda la aplicación */
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
background-color: #f5f5f5;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
.button {
background-color: #0070f3;
color: white;
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
}
.button:hover {
background-color: #0051cc;
} import '../styles/globals.css'
export default function App({ Component, pageProps }) {
return <Component {...pageProps} />
} import styles from './Header.module.css'
export default function Header() {
return (
<header className={styles.header}>
<h1 className={styles.title}>Mi Sitio Web</h1>
</header>
)
} _app.js_app.jsstyles/
├── globals.css # Estilos globales
├── Home.module.css # CSS Module para página Home
└── components/
├── Header.module.css # CSS Module para Header
└── Footer.module.css # CSS Module para Footer
} Los estilos globales afectan a toda tu aplicación. Se usan para resetear CSS, definir fuentes, colores principales, etc.
/* Reset básico */
* {
box-sizing: border-box;
}
html, body {
padding: 0;
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, sans-serif;
}
/* Variables CSS para colores */
:root {
--primary-color: #0070f3;
--secondary-color: #666;
--background-color: #fafafa;
--text-color: #333;
}
/* Clases utilitarias globales */
.text-center {
text-align: center;
}
.mt-4 {
margin-top: 1rem;
}
.mb-4 {
margin-bottom: 1rem;
}
/* Estilos para enlaces */
a {
color: var(--primary-color);
text-decoration: none;
}
a:hover {
text-decoration: underline;
} import '../styles/globals.css'
export default function App({ Component, pageProps }) {
return <Component {...pageProps} />
} Los CSS Modules son archivos CSS que se procesan automáticamente para crear nombres de clase únicos. Esto evita conflictos entre estilos de diferentes componentes.
.card {
background: white;
border-radius: 8px;
padding: 20px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
margin-bottom: 20px;
}
.title {
color: #333;
font-size: 1.5rem;
margin-bottom: 10px;
}
.description {
color: #666;
line-height: 1.6;
}
.button {
background: #0070f3;
color: white;
border: none;
padding: 10px 15px;
border-radius: 4px;
cursor: pointer;
margin-top: 15px;
}
.button:hover {
background: #0051cc;
}
/* Modificador para card destacada */
.cardFeatured {
border: 2px solid #0070f3;
background: #f0f8ff;
} import styles from './Card.module.css'
export default function Card({ title, description, featured = false }) {
// Combinar clases condicionalmente
const cardClass = featured
? `${styles.card} ${styles.cardFeatured}`
: styles.card
return (
<div className={cardClass}>
<h3 className={styles.title}>{title}</h3>
<p className={styles.description}>{description}</p>
<button className={styles.button}>
Leer más
</button>
</div>
)
} import Card from '../components/Card'
export default function Home() {
return (
<div className="container">
<h1>Mi Blog</h1>
<Card
title="Artículo Destacado"
description="Este es un artículo muy importante que queremos resaltar."
featured={true}
/>
<Card
title="Artículo Normal"
description="Este es un artículo regular de nuestro blog."
/>
<Card
title="Otro Artículo"
description="Más contenido interesante para nuestros lectores."
/>
</div>
)
} | Método | Cuándo usar | Ventajas | Desventajas |
|---|---|---|---|
| CSS Global | Estilos base, reset, variables | Simple, familiar | Puede causar conflictos |
| CSS Modules | Componentes específicos | Sin conflictos, mantenible | Más archivos |
| Styled JSX | Estilos dinámicos | CSS en JS, dinámico | Curva de aprendizaje |
| Tailwind CSS | Desarrollo rápido | Utilitario, consistente | Clases largas |
Para proyectos pequeños a medianos:
// 1. Usa CSS global para estilos base
// styles/globals.css - Variables, reset, utilidades
// 2. Usa CSS Modules para componentes
// components/Button.module.css - Estilos específicos Estructura recomendada:
styles/
├── globals.css # Estilos globales
├── variables.css # Variables CSS
└── components/
├── Button.module.css # Estilos del botón
├── Card.module.css # Estilos de la tarjeta
└── Header.module.css # Estilos del header /* Variables globales */
:root {
--primary: #0070f3;
--secondary: #666;
--success: #28a745;
--danger: #dc3545;
--background: #fafafa;
--text: #333;
}
/* Reset y base */
* { box-sizing: border-box; }
body {
font-family: system-ui, sans-serif;
background: var(--background);
color: var(--text);
}
/* Utilidades */
.container { max-width: 1200px; margin: 0 auto; padding: 0 20px; }
.text-center { text-align: center; }
.mt-4 { margin-top: 1rem; } .layout {
min-height: 100vh;
display: flex;
flex-direction: column;
}
.header {
background: white;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
padding: 1rem 0;
}
.main {
flex: 1;
padding: 2rem 0;
}
.footer {
background: #333;
color: white;
padding: 2rem 0;
text-align: center;
} import styles from './Layout.module.css'
export default function Layout({ children }) {
return (
<div className={styles.layout}>
<header className={styles.header}>
<div className="container">
<h1>Mi Sitio Web</h1>
</div>
</header>
<main className={styles.main}>
<div className="container">
{children}
</div>
</main>
<footer className={styles.footer}>
<div className="container">
<p>© 2024 Mi Sitio Web</p>
</div>
</footer>
</div>
)
}