En React, existen varias maneras de aplicar estilos a los componentes. Esta guía cubre las opciones más actualizadas y efectivas, desde el uso de CSS tradicional hasta técnicas avanzadas como CSS Modules y Styled Components.
CSS Global (Archivo CSS Importado)Esta es la forma más básica de agregar CSS en un proyecto React. Se recomienda para estilos globales o cuando recién estás comenzando con React.
CSSCrea un archivo con extensión .css en tu proyecto. Por ejemplo: App.css.
body {
font-family: Arial, sans-serif;
}
.header {
background-color: #282c34;
padding: 20px;
color: white;
} CSS en el Componente PrincipalImporta el archivo en tu componente o archivo principal:
import './App.css';
function App() {
return (
<div>
<h1 className="header">Bienvenido a React</h1>
</div>
);
}
export default App; className en lugar de class?En React, se usa className en lugar de class, ya que class es una palabra reservada en JavaScript.
Al aplicar una clase a un elemento en React, debes usar el atributo className:
<h1 className="header">Bienvenido a React</h1> En tu archivo CSS, puedes aplicar estilos a través de distintos selectores:
Selector de Clase (.header): Estiliza elementos específicos usando una clase. Aplícalo en React con className.
.header {
background-color: #282c34;
color: white;
} Selector de ID (#unique): Los estilos con ID son únicos para un elemento.
Aplica este selector en tu componente usando el atributo id.
#unique {
color: green;
}
<h2 id="unique">Soy un subtítulo único</h2> Selector de Etiqueta (p): Aplica estilos a todos los elementos de un tipo específico. Por ejemplo, todos los párrafos (<p>).
p {
font-size: 16px;
color: #333;
}
<p>Este es un párrafo estilizado con CSS.</p> CSS en Línea (Inline Styles)Los estilos en línea se aplican directamente al componente usando un objeto en formato JavaScript. Es útil para estilos dinámicos o específicos.
<p>En este contexto, el objeto { color: 'red' } se aplica directamente al elemento <p> como estilo en línea:
<p style={{ color: 'red' }}>Me han cambiado el color.</p> <h1>Puedes especificar directamente el color del texto utilizando la propiedad color.
function Titulo() {
return <h1 style={{ color: 'blue', fontSize: '24px' }}>Bienvenido a React</h1>;
} En este escenario, el botón cambia de color de fondo y texto dependiendo de si el estado isPrimary es verdadero o falso.
Al hacer clic en el botón, su estado se alterna, cambiando su apariencia.
import React, { useState } from 'react';
function Boton() {
const [isPrimary, setIsPrimary] = useState(true);
return (
<button
style={{
backgroundColor: isPrimary ? 'blue' : 'gray',
color: 'white',
padding: '10px 20px',
border: 'none',
borderRadius: '5px',
}}
onClick={() => setIsPrimary(!isPrimary)}
>
{isPrimary ? 'Primario' : 'Secundario'}
</button>
);
} Este ejemplo muestra cómo aplicar estilos condicionales a un componente en función de sus propiedades (props).
El estilo del texto cambia según el valor de la propiedad importante.
function Mensaje({ importante }) {
return (
<p
style={{
fontWeight: importante ? 'bold' : 'normal',
color: importante ? 'red' : 'black',
}}
>
{importante ? 'Este es un mensaje importante.' : 'Este es un mensaje común.'}
</p>
);
} // Componente Button
function Button() {
// Declarando un objeto con propiedades CSS en formato JavaScript
const buttonStyle = {
backgroundColor: 'blue',
color: 'white',
padding: '10px',
borderRadius: '5px'
};
return <button style={buttonStyle}>Clic aquí</button>;
}
export default Button; CSS Modules (Modularización de CSS)CSS Modules permiten importar estilos como módulos únicos, lo que ayuda a evitar conflictos de nombres. Cada clase se hace única para el componente donde se importa.
CSS ModuleNombra el archivo con la extensión .module.css. Por ejemplo: Button.module.css.
/* Button.module.css */
.button {
background-color: green;
color: white;
padding: 10px;
border-radius: 5px;
} CSS Module en el Componente// Button.js
import styles from './Button.module.css';
function Button() {
return <button className={styles.button}>Clic aquí</button>;
}
export default Button; styles.button en CSS Modules?CSS Modules te permite crear estilos que están localizados por defecto, lo que significa que los nombres de clase en un archivo CSS Module se convierten en identificadores únicos al importarlos en un componente.
Esto evita problemas de colisión de estilos y permite que diferentes componentes usen clases con el mismo nombre sin interferir entre sí.
styles.buttonimport styles from './Button.module.css'; styles se convierte en un objeto que contiene todos los selectores de clase del archivo Button.module.css como propiedades.
Cada clase del CSS Module se mapea a una propiedad única de styles.
Al usar styles.button, estás accediendo a la clase .button definida en Button.module.css, pero con un nombre de clase único que React genera automáticamente al compilar el proyecto.
Esto hace que puedas usar la clase .button en diferentes componentes sin preocuparte de que los estilos se sobrescriban.
De esta forma, la clase aplicada en el HTML se verá algo así como Button_button__3Kj3H en lugar de solo button, asegurando que sea única en el DOM y evitando conflictos de estilos entre componentes.
Styled Components (CSS-in-JS)Styled Components es una librería popular para agregar CSS directamente en los componentes, usando JavaScript.
Los estilos se aplican en un entorno modular y permite definir estilos con props dinámicos.
Primero, instala la librería con:
npm install styled-components // Button.js
import styled from 'styled-components';
const Button = styled.button`
background-color: purple;
color: white;
padding: 10px;
border-radius: 5px;
&:hover {
background-color: darkblue;
}
`;
function App() {
return <Button>Clic aquí</Button>;
}
export default App; Aquí, styled.button define un componente de botón que lleva los estilos aplicados directamente.
Los estilos se escriben usando Template Literals con comillas invertidas (**) en lugar de las llaves **` habituales en JavaScript, permitiendo incluir CSS directamente.
Emotion es una alternativa similar a Styled Components que también permite estilos CSS con JavaScript.
Su ventaja es su flexibilidad y rendimiento.
npm install @emotion/react @emotion/styled /** @jsxImportSource @emotion/react */
import styled from '@emotion/styled';
const Button = styled.button`
background-color: #ff6600;
color: white;
padding: 10px;
border-radius: 5px;
&:hover {
background-color: #cc5200;
}
`;
function App() {
return <Button>Click Aquí</Button>;
}
export default App; Declaración @jsxImportSource @emotion/react:
/** @jsxImportSource @emotion/react */ Este comentario al inicio indica a React que use @emotion/react como fuente para el procesamiento JSX, habilitando características avanzadas de Emotion como el uso de CSS-in-JS.
Importación de @emotion/styled:
import styled from '@emotion/styled'; @emotion/styled permite definir componentes estilizados mediante una sintaxis similar a Styled Components.
Al importar styled de Emotion, puedes crear componentes de React con estilos encapsulados.
Creación del Componente Button con @emotion/styled:
const Button = styled.button`
background-color: #ff6600;
color: white;
padding: 10px;
border-radius: 5px;
`; Aquí, styled.button define un componente Button estilizado con propiedades CSS aplicadas directamente.
Los estilos se escriben usando Template Literals (comillas invertidas “)