Skip to content

3. Colores y Unidades

Los colores y unidades son fundamentales en CSS. Dominar estos conceptos te permitirá crear diseños precisos, escalables y visualmente atractivos.


CSS ofrece múltiples formas de definir colores. Cada sistema tiene sus ventajas según el contexto.

CSS tiene 140 nombres de colores predefinidos. Son fáciles de recordar pero limitados.

.elemento {
color: red;
background-color: blue;
border-color: green;
}
/* Colores comunes */
.texto-negro { color: black; }
.texto-blanco { color: white; }
.fondo-gris { background-color: gray; }
.borde-azul { border: 2px solid navy; }
/* Colores primarios */
red /* 🔴 Rojo */
blue /* 🔵 Azul */
yellow /* 🟡 Amarillo */
green /* 🟢 Verde */
/* Colores neutros */
black /* ⚫ Negro */
white /* ⚪ Blanco */
gray /* ⚪ Gris */
silver /* 🔘 Plateado */

El formato más popular en diseño web. Usa 6 dígitos hexadecimales (0-9, A-F).

/* Formato: #RRGGBB */
.elemento {
color: #FF0000; /* Rojo puro */
background: #00FF00; /* Verde puro */
border-color: #0000FF; /* Azul puro */
}
/* Formato corto: #RGB (cuando los pares son iguales) */
.elemento {
color: #F00; /* = #FF0000 */
background: #0F0; /* = #00FF00 */
border-color: #00F; /* = #0000FF */
}
  1. Primer par (RR) - Cantidad de rojo (00-FF)
  2. Segundo par (GG) - Cantidad de verde (00-FF)
  3. Tercer par (BB) - Cantidad de azul (00-FF)
#FF0000 /* 🔴 Rojo puro (255, 0, 0) */
#00FF00 /* 🟢 Verde puro (0, 255, 0) */
#0000FF /* 🔵 Azul puro (0, 0, 255) */
#FFFF00 /* 🟡 Amarillo (255, 255, 0) */
#FF00FF /* 🟣 Magenta (255, 0, 255) */
#00FFFF /* 🔵 Cyan (0, 255, 255) */
#000000 /* ⚫ Negro (0, 0, 0) */
#FFFFFF /* ⚪ Blanco (255, 255, 255) */

Define colores mediante valores de rojo, verde y azul (0-255).

/* Sintaxis: rgb(rojo, verde, azul) */
.elemento {
color: rgb(255, 0, 0); /* Rojo */
background: rgb(0, 255, 0); /* Verde */
border-color: rgb(0, 0, 255); /* Azul */
}
/* Valores intermedios */
.gris {
color: rgb(128, 128, 128); /* Gris medio */
}
.naranja {
color: rgb(255, 165, 0); /* Naranja */
}
.morado {
color: rgb(128, 0, 128); /* Morado */
}
/* HEX → RGB */
#FF0000 = rgb(255, 0, 0) /* Rojo */
#00FF00 = rgb(0, 255, 0) /* Verde */
#0000FF = rgb(0, 0, 255) /* Azul */
#3498db = rgb(52, 152, 219) /* Azul brillante */
#2ecc71 = rgb(46, 204, 113) /* Verde esmeralda */
#e74c3c = rgb(231, 76, 60) /* Rojo coral */

Define colores mediante tono, saturación y luminosidad. Más intuitivo para diseñadores.

/* Sintaxis: hsl(tono, saturación%, luminosidad%) */
.elemento {
color: hsl(0, 100%, 50%); /* Rojo */
background: hsl(120, 100%, 50%); /* Verde */
border-color: hsl(240, 100%, 50%); /* Azul */
}
  1. Hue (Tono) 0-360°

    • 0° = Rojo 🔴
    • 120° = Verde 🟢
    • 240° = Azul 🔵
    • 360° = Rojo nuevamente (círculo completo)
  2. Saturation (Saturación) 0-100%

    • 0% = Gris (sin color)
    • 100% = Color puro (máxima intensidad)
  3. Lightness (Luminosidad) 0-100%

    • 0% = Negro
    • 50% = Color normal
    • 100% = Blanco
/* Colores primarios y secundarios */
hsl(0, 100%, 50%) /* 🔴 Rojo */
hsl(30, 100%, 50%) /* 🟠 Naranja */
hsl(60, 100%, 50%) /* 🟡 Amarillo */
hsl(120, 100%, 50%) /* 🟢 Verde */
hsl(180, 100%, 50%) /* 🔵 Cyan */
hsl(240, 100%, 50%) /* 🔵 Azul */
hsl(300, 100%, 50%) /* 🟣 Magenta */

La transparencia permite que los elementos se vean a través de otros, creando efectos visuales sofisticados.

Añade un cuarto valor para la transparencia (0-1).

/* Sintaxis: rgba(rojo, verde, azul, alpha) */
.elemento {
background: rgba(255, 0, 0, 1); /* Rojo opaco (100%) */
background: rgba(255, 0, 0, 0.8); /* Rojo 80% opaco */
background: rgba(255, 0, 0, 0.5); /* Rojo 50% opaco */
background: rgba(255, 0, 0, 0.2); /* Rojo 20% opaco */
background: rgba(255, 0, 0, 0); /* Rojo transparente (0%) */
}
/* Superposición oscura sobre imagen */
.hero {
position: relative;
background-image: url('fondo.jpg');
}
.hero::before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5); /* Negro 50% */
}
/* Superposición de color */
.overlay-azul::before {
background: rgba(52, 152, 219, 0.7); /* Azul 70% */
}

HSL con canal de transparencia.

/* Sintaxis: hsla(tono, saturación%, luminosidad%, alpha) */
.elemento {
background: hsla(210, 100%, 50%, 1); /* Azul opaco */
background: hsla(210, 100%, 50%, 0.8); /* Azul 80% */
background: hsla(210, 100%, 50%, 0.5); /* Azul 50% */
background: hsla(210, 100%, 50%, 0.2); /* Azul 20% */
}
/* Crear paleta con transparencias */
:root {
--azul-solido: hsla(210, 80%, 50%, 1);
--azul-medio: hsla(210, 80%, 50%, 0.5);
--azul-suave: hsla(210, 80%, 50%, 0.1);
}

Formato moderno: #RRGGBBAA (los últimos 2 dígitos son el alpha).

/* Formato: #RRGGBBAA */
.elemento {
background: #FF0000FF; /* Rojo 100% opaco */
background: #FF0000CC; /* Rojo 80% opaco */
background: #FF000080; /* Rojo 50% opaco */
background: #FF000033; /* Rojo 20% opaco */
background: #FF000000; /* Rojo 0% (transparente) */
}
/* Valores comunes de alpha en HEX */
/* FF = 100% | CC = 80% | 99 = 60% | 80 = 50% | 66 = 40% | 33 = 20% | 00 = 0% */

Afecta la transparencia de todo el elemento (incluido su contenido).

/* Sintaxis: opacity: 0 a 1 */
.elemento {
opacity: 1; /* 100% opaco (normal) */
opacity: 0.8; /* 80% opaco */
opacity: 0.5; /* 50% opaco */
opacity: 0.2; /* 20% opaco */
opacity: 0; /* 0% (invisible) */
}
/* opacity: Afecta TODO (contenido + fondo) */
.caja-opacity {
background: rgb(255, 0, 0);
opacity: 0.5; /* ⚠️ El texto también será transparente */
}
/* rgba: Solo afecta el fondo */
.caja-rgba {
background: rgba(255, 0, 0, 0.5); /* ✅ Solo el fondo es transparente */
color: black; /* El texto permanece opaco */
}

Las unidades definen tamaños, espacios y dimensiones. Se dividen en absolutas y relativas.

Tienen un tamaño fijo que no cambia según el contexto.

/* px - Píxel (unidad más común) */
.elemento {
width: 300px;
height: 200px;
font-size: 16px;
padding: 20px;
margin: 10px;
border: 2px solid black;
}
/* ✅ Bueno para: */
/* - Bordes precisos */
/* - Sombras */
/* - Elementos de tamaño fijo */
.borde { border: 1px solid #ddd; }
.sombra { box-shadow: 0 2px 4px rgba(0,0,0,0.1); }

Su tamaño depende de otro valor (elemento padre, viewport, fuente base).

em - Relativo al tamaño de fuente del elemento padre

Section titled “em - Relativo al tamaño de fuente del elemento padre”
/* 1em = tamaño de fuente del padre */
.padre {
font-size: 16px;
}
.hijo {
font-size: 2em; /* 2 × 16px = 32px */
padding: 1em; /* 1 × 32px = 32px (usa su propia fuente) */
margin: 0.5em; /* 0.5 × 32px = 16px */
}
body {
font-size: 16px; /* Base */
}
h1 {
font-size: 2.5em; /* 2.5 × 16px = 40px */
margin-bottom: 0.5em; /* 0.5 × 40px = 20px */
}
p {
font-size: 1em; /* 1 × 16px = 16px */
line-height: 1.5em; /* 1.5 × 16px = 24px */
margin-bottom: 1em; /* 1 × 16px = 16px */
}

rem - Relativo al tamaño de fuente del elemento raíz (<html>)

Section titled “rem - Relativo al tamaño de fuente del elemento raíz (<html>)”
/* 1rem = tamaño de fuente del <html> */
html {
font-size: 16px; /* Base (por defecto en navegadores) */
}
.elemento {
font-size: 2rem; /* 2 × 16px = 32px */
padding: 1rem; /* 1 × 16px = 16px */
margin: 0.5rem; /* 0.5 × 16px = 8px */
}
/* ✅ rem NO se multiplica en anidamiento */
html {
font-size: 16px;
}
.nivel-1 { font-size: 1.5rem; } /* 24px */
.nivel-2 { font-size: 1.5rem; } /* 24px (no 36px) */
.nivel-3 { font-size: 1.5rem; } /* 24px (no 54px) */
/* Siempre relativo a html, no al padre */
/* % - Relativo al tamaño del padre */
.padre {
width: 1000px;
height: 500px;
}
.hijo {
width: 50%; /* 50% de 1000px = 500px */
height: 80%; /* 80% de 500px = 400px */
font-size: 120%; /* 120% del font-size del padre */
}
/* Layout de 2 columnas */
.contenedor {
width: 100%;
max-width: 1200px;
}
.columna-izquierda {
width: 30%;
float: left;
}
.columna-derecha {
width: 70%;
float: left;
}
/* Layout de 3 columnas iguales */
.columna {
width: 33.333%;
float: left;
}
/* vw - Viewport Width (ancho de la ventana) */
/* vh - Viewport Height (alto de la ventana) */
/* 1vw = 1% del ancho del viewport */
/* 1vh = 1% del alto del viewport */
.elemento {
width: 50vw; /* 50% del ancho de la ventana */
height: 100vh; /* 100% del alto de la ventana */
font-size: 5vw; /* 5% del ancho de la ventana */
}
/* Sección hero que ocupa toda la pantalla */
.hero {
width: 100vw;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background-image: url('fondo.jpg');
background-size: cover;
}
.hero h1 {
font-size: 8vw; /* Título que escala con la ventana */
color: white;
}
/* vmin - El menor entre vw y vh */
.elemento {
width: 50vmin; /* 50% del lado más pequeño del viewport */
}
/* vmax - El mayor entre vw y vh */
.elemento {
width: 50vmax; /* 50% del lado más grande del viewport */
}
/* ch - Ancho del carácter "0" en la fuente actual */
.input {
width: 20ch; /* Ancho de 20 caracteres */
}
/* ex - Altura de la letra "x" en la fuente actual */
.elemento {
height: 10ex;
}
UnidadTipoRelativo aUso recomendado
pxAbsolutaFijoBordes, sombras, detalles precisos
emRelativaFuente del padreEspaciados proporcionales al texto
remRelativaFuente del <html>Tamaños de fuente, espaciados generales ⭐
%RelativaElemento padreAnchos, layouts fluidos
vwRelativaAncho del viewportElementos full-width, tipografía fluida
vhRelativaAlto del viewportSecciones full-height, heros

Las variables CSS permiten almacenar valores reutilizables. Se definen con -- y se usan con var().

/* Definir variables en :root (disponibles globalmente) */
:root {
--color-primario: #3498db;
--color-secundario: #2ecc71;
--color-acento: #e74c3c;
--fuente-principal: 'Arial', sans-serif;
--fuente-titulos: 'Georgia', serif;
--espaciado-sm: 0.5rem;
--espaciado-md: 1rem;
--espaciado-lg: 2rem;
}
/* Usar variables con var() */
.elemento {
color: var(--color-primario);
font-family: var(--fuente-principal);
padding: var(--espaciado-md);
}
:root {
/* Colores de marca */
--color-primario: #3498db;
--color-secundario: #2ecc71;
--color-acento: #e74c3c;
--color-advertencia: #f39c12;
--color-exito: #27ae60;
--color-peligro: #c0392b;
/* Colores neutros */
--color-texto: #2c3e50;
--color-texto-claro: #7f8c8d;
--color-fondo: #ffffff;
--color-fondo-alt: #f8f9fa;
--color-borde: #dee2e6;
/* Grises */
--gris-100: #f8f9fa;
--gris-200: #e9ecef;
--gris-300: #dee2e6;
--gris-400: #ced4da;
--gris-500: #adb5bd;
--gris-600: #6c757d;
--gris-700: #495057;
--gris-800: #343a40;
--gris-900: #212529;
}
/* Uso */
.boton-primario {
background: var(--color-primario);
color: white;
}
.texto-secundario {
color: var(--color-texto-claro);
}
/* Sintaxis: var(--variable, valor-por-defecto) */
.elemento {
color: var(--color-personalizado, #3498db);
/* Si --color-personalizado no existe, usa #3498db */
padding: var(--espaciado-custom, 1rem);
font-size: var(--texto-custom, 16px);
}
/* Variables globales */
:root {
--color-primario: #3498db;
}
/* Variables específicas de un componente */
.tarjeta {
--color-fondo: #f8f9fa;
--padding: 2rem;
background: var(--color-fondo);
padding: var(--padding);
}
/* Variables que cambian según el estado */
.boton {
--color-boton: #3498db;
background: var(--color-boton);
}
.boton:hover {
--color-boton: #2980b9; /* Cambia el valor de la variable */
}
:root {
--color-fondo: #ffffff;
--color-texto: #2c3e50;
--color-borde: #dee2e6;
--color-tarjeta: #f8f9fa;
}
body {
background: var(--color-fondo);
color: var(--color-texto);
}
.tarjeta {
background: var(--color-tarjeta);
border: 1px solid var(--color-borde);
}
:root {
--base: 16px;
--multiplicador: 1.5;
}
.elemento {
/* Usar calc() con variables */
font-size: calc(var(--base) * var(--multiplicador)); /* 24px */
padding: calc(var(--base) / 2); /* 8px */
margin: calc(var(--base) * 2); /* 32px */
}
/* Espaciado dinámico */
:root {
--espaciado-base: 1rem;
}
.pequeno { padding: calc(var(--espaciado-base) * 0.5); } /* 0.5rem */
.normal { padding: var(--espaciado-base); } /* 1rem */
.grande { padding: calc(var(--espaciado-base) * 2); } /* 2rem */

🐝