En esta página

Colores y fondos en CSS

10 min lectura TextoCap. 4 — Estilos visuales

Sistemas de color en CSS

CSS ofrece multiples formas de definir colores. Cada una tiene sus ventajas segun el caso de uso.

Formatos tradicionales

Formato Ejemplo Uso tipico
Nombre red, blue Prototipado rápido
Hexadecimal #ff5500 Copiar de Figma/Photoshop
RGB rgb(255 85 0) Cuando necesitas transparencia
HSL hsl(20 100% 50%) Manipular tono facilmente

El formato moderno: oklch

oklch (Oklab Lightness Chroma Hue) es el formato recomendado para diseño moderno:

color: oklch(70% 0.2 30);
/*          L    C   H
    L = Lightness (0% negro, 100% blanco)
    C = Chroma (0 gris, 0.4 saturado)
    H = Hue (angulo del circulo cromatico)
*/

Ventajas sobre HSL:

  • Gradientes más naturales: sin la banda gris que aparece con HSL
  • Perceptualmente uniforme: L=50% realmente se ve como 50% de brillo
  • Fácil crear paletas: cambia solo L para obtener variantes claras y oscuras del mismo tono

Transparencia en cualquier formato

Agrega un cuarto valor con / para la opacidad:

color: rgb(255 0 0 / 50%);
color: oklch(65% 0.2 25 / 80%);
color: #ff000080; /* 80 hex = 50% */

Gradientes

Gradiente lineal

.fondo {
  background: linear-gradient(135deg, #ff530f, #e6286a);
}

El primer argumento es la dirección: un angulo (135deg) o palabras clave (to right, to bottom left).

Gradiente radial

.fondo {
  background: radial-gradient(circle at top right, #ffc400, transparent 70%);
}

Gradiente conico

.reloj {
  background: conic-gradient(from 0deg, #ff530f, #e6286a, #b056ff, #ff530f);
  border-radius: 50%;
}

Gradiente de texto

Un efecto visual popular es aplicar un gradiente al texto:

.texto-gradiente {
  background: linear-gradient(90deg, #ff530f, #e6286a);
  background-clip: text;
  color: transparent;
}

Fondos

background-image con overlay

Para asegurar legibilidad del texto sobre imagenes, usa un gradiente como overlay:

.hero {
  background:
    linear-gradient(to bottom, rgb(0 0 0 / 60%), rgb(0 0 0 / 30%)),
    url("/img/hero.jpg") center / cover no-repeat;
}

Multiples fondos

CSS permite apilar multiples imagenes de fondo. Se renderizan en orden: la primera encima, la última al fondo.

.decorativo {
  background:
    url("patrón.svg") repeat,
    linear-gradient(135deg, #f0f0f0, #e0e0e0);
}

background-clip y background-origin

background-clip controla hasta donde se extiende el fondo:

  • border-box (defecto): hasta el borde
  • padding-box: hasta el padding
  • content-box: solo el area de contenido
  • text: solo el texto (para gradientes de texto)

Tema oscuro con prefers-color-scheme

Usa custom properties para crear un tema oscuro automático:

:root {
  --bg: oklch(98% 0 0);
  --text: oklch(15% 0 0);
}

@media (prefers-color-scheme: dark) {
  :root {
    --bg: oklch(12% 0 0);
    --text: oklch(92% 0 0);
  }
}

color-mix(): mezclar colores en CSS

La función color-mix() permite mezclar dos colores sin preprocesadores:

.hover {
  /* 80% del color primario + 20% de negro */
  background: color-mix(in oklch, var(--brand-primary) 80%, black);
}

Con colores y fondos dominados, en la siguiente leccion anadiremos movimiento a tus interfaces con transiciones y animaciones CSS.

Práctica

  1. Crea una paleta con oklch: Define una paleta de 5 colores en :root usando oklch(). Genera variantes claras y oscuras del mismo tono cambiando solo el valor de lightness.
  2. Implementa un tema oscuro automatico: Usa @media (prefers-color-scheme: dark) junto con custom properties para redefinir los colores de fondo y texto automaticamente.
  3. Aplica un gradiente de texto: Crea un titulo con gradiente usando background: linear-gradient(...), background-clip: text y color: transparent.
Por que oklch?
oklch produce gradientes perceptualmente uniformes (sin la zona gris que aparece con rgb/hsl). Ademas, al cambiar solo el primer valor (lightness), puedes generar toda una paleta coherente a partir de un solo tono.
Contraste y accesibilidad
El texto debe tener un ratio de contraste mínimo de 4.5:1 contra su fondo (WCAG AA). Usa herramientas como el inspector de DevTools o webaim.org/resources/contrastchecker para verificar.
:root {
  /* Paleta con oklch (mejor para diseño) */
  --brand-primary: oklch(75% 0.18 85);
  --brand-accent: oklch(65% 0.22 25);
  --text-primary: oklch(15% 0.01 260);
  --text-secondary: oklch(45% 0.01 260);
  --surface: oklch(98% 0.005 260);
  --surface-hover: oklch(95% 0.005 260);
}

/* Tema oscuro automático */
@media (prefers-color-scheme: dark) {
  :root {
    --text-primary: oklch(95% 0.01 260);
    --text-secondary: oklch(70% 0.01 260);
    --surface: oklch(15% 0.01 260);
    --surface-hover: oklch(20% 0.01 260);
  }
}

/* Gradiente moderno para CTA */
.boton-cta {
  background: linear-gradient(135deg,
    oklch(65% 0.25 25),
    oklch(55% 0.22 340)
  );
  color: white;
  border: none;
  padding: 0.75rem 2rem;
  border-radius: 8px;
}

/* Transparencia con oklch */
.glass {
  background: oklch(98% 0.005 260 / 80%);
  backdrop-filter: blur(12px);
  border: 1px solid oklch(0% 0 0 / 8%);
}
/* Imagen de fondo con overlay */
.hero {
  background:
    linear-gradient(to bottom,
      rgb(0 0 0 / 60%),
      rgb(0 0 0 / 30%)
    ),
    url("/img/hero.jpg") center / cover no-repeat;
  color: white;
  min-height: 60vh;
  display: grid;
  place-items: center;
}

/* Patron geometrico puro CSS */
.patrón {
  background-color: #f0f0f0;
  background-image:
    linear-gradient(45deg, #ddd 25%, transparent 25%),
    linear-gradient(-45deg, #ddd 25%, transparent 25%),
    linear-gradient(45deg, transparent 75%, #ddd 75%),
    linear-gradient(-45deg, transparent 75%, #ddd 75%);
  background-size: 20px 20px;
  background-position: 0 0, 0 10px, 10px -10px, -10px 0;
}

/* Gradiente de texto */
.texto-gradiente {
  background: linear-gradient(90deg, #ff530f, #e6286a);
  background-clip: text;
  -webkit-background-clip: text;
  color: transparent;
}