TechLead

Estilos en React

Modulos CSS, styled-components y Tailwind CSS

Formas de Estilizar en React

Hay varias formas de aplicar estilos en React. Cada enfoque tiene sus ventajas dependiendo del proyecto.

Estilos en Linea

function Componente() {
  const estilos = {
    backgroundColor: 'blue',
    color: 'white',
    padding: '10px 20px',
    borderRadius: '8px'
  };

  return (
    <div style={estilos}>
      <p style={{ fontSize: '16px', margin: 0 }}>
        Texto estilizado
      </p>
    </div>
  );
}

CSS Regular

/* styles.css */
.tarjeta {
  background: white;
  border-radius: 8px;
  padding: 20px;
  box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}

.tarjeta-titulo {
  font-size: 24px;
  font-weight: bold;
}

// Componente.jsx
import './styles.css';

function Tarjeta() {
  return (
    <div className="tarjeta">
      <h2 className="tarjeta-titulo">Titulo</h2>
    </div>
  );
}

Modulos CSS

/* Tarjeta.module.css */
.tarjeta {
  background: white;
  border-radius: 8px;
}

.titulo {
  font-size: 24px;
}

// Tarjeta.jsx
import styles from './Tarjeta.module.css';

function Tarjeta() {
  return (
    <div className={styles.tarjeta}>
      <h2 className={styles.titulo}>Titulo</h2>
    </div>
  );
}

// Multiples clases
<div className={`${styles.tarjeta} ${styles.activo}`}>

Tailwind CSS

function Tarjeta() {
  return (
    <div className="bg-white rounded-lg p-6 shadow-md hover:shadow-lg transition-shadow">
      <h2 className="text-2xl font-bold text-gray-800 mb-4">
        Titulo
      </h2>
      <p className="text-gray-600">
        Contenido de la tarjeta
      </p>
      <button className="mt-4 px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600">
        Accion
      </button>
    </div>
  );
}

Estilos Condicionales

// Con template literals
function Boton({ variante, deshabilitado }) {
  return (
    <button
      className={`btn btn-${variante} ${deshabilitado ? 'btn-deshabilitado' : ''}`}
      disabled={deshabilitado}
    >
      Click
    </button>
  );
}

// Con libreria clsx
import clsx from 'clsx';

function Boton({ primario, tamano, deshabilitado }) {
  return (
    <button
      className={clsx(
        'btn',
        primario && 'btn-primario',
        tamano === 'grande' && 'btn-lg',
        deshabilitado && 'btn-deshabilitado'
      )}
    >
      Click
    </button>
  );
}

Comparacion de Enfoques

  • Estilos en linea: Rapido para prototipos, no soporta pseudo-clases
  • CSS Regular: Simple, pero estilos globales pueden colisionar
  • Modulos CSS: Estilos con alcance local, buena DX
  • Tailwind: Desarrollo rapido, consistencia, pero clases largas