Teoría del Color

Opacidad, transparencia y canales alfa explicados

9 min de lectura

Opacidad, transparencia y alfa son tres términos que diseñadores y desarrolladores usan indistintamente, pero describen conceptos relacionados aunque distintos que se comportan de forma diferente en la práctica. Confundirlos genera bugs en CSS, transparencia heredada inesperada e imágenes que se ven bien en un contexto pero mal en otro. Esta guía desenreda la terminología y explica exactamente cómo funciona cada mecanismo, cuándo usar cuál y cuáles son las implicaciones de rendimiento para interfaces complejas y con capas.

¿Qué es la opacidad?

La opacidad describe qué tan opaco —qué tan visualmente sólido— es algo. Se expresa típicamente como un valor de 0 a 1, donde: - 0 = completamente transparente (invisible) - 1 = completamente opaco (totalmente visible) - 0.5 = 50% visible, 50% transparente

La opacidad es una propiedad de un objeto renderizado, no del color en sí. Cuando dices "este elemento tiene 50% de opacidad", quieres decir que el elemento completo —incluyendo todos sus hijos, bordes, fondos y texto— se renderiza al 50% de visibilidad.

Esta distinción es enormemente importante en CSS.

Opacity vs visibility vs display

Tres propiedades CSS pueden ocultar un elemento, pero solo una lo hace mediante la transparencia:

  • opacity: 0 — el elemento es invisible pero sigue ocupando espacio y responde a eventos
  • visibility: hidden — el elemento es invisible y ocupa espacio, pero NO responde a eventos
  • display: none — el elemento se elimina completamente del layout

Para propósitos de animación, opacity es la propiedad a usar. Está acelerada por hardware en todos los navegadores modernos y no dispara el recalculo del layout, lo que la convierte en la opción de mejor rendimiento para animaciones de fundido.

Canales alfa en imágenes

En los formatos de imagen rasterizada, el canal alfa es un cuarto canal de datos junto al rojo, verde y azul. Mientras los canales RGB definen el color, el canal alfa define la opacidad de cada píxel de forma independiente.

El valor alfa de un píxel determina cuánto del fondo se muestra a través de esa ubicación específica. Así es como funcionan los logos PNG transparentes: los píxeles del logo son completamente opacos (alfa = 255), mientras el área circundante es completamente transparente (alfa = 0), permitiendo que aparezca lo que hay detrás de la imagen.

Soporte de canal alfa por formato

No todos los formatos de imagen admiten un canal alfa:

Formato Soporte alfa Notas
PNG Sí (8 bits) Sin pérdida, ampliamente usado para logos e iconos
WebP Con o sin pérdida con alfa, excelente compresión
AVIF Mejor compresión, soporte de navegador creciente
SVG Sí (vía opacity/CSS) Vectorial — escala sin pérdida de calidad
JPEG No Los datos alfa se descartan; el fondo se vuelve blanco o negro
GIF Binario (0 o 1) Un píxel es completamente transparente o completamente opaco

Cuando se crea un JPEG desde una imagen con transparencia, el canal alfa se compone sobre un color de fondo (típicamente blanco) antes de la codificación. Por eso guardar un PNG transparente como JPEG produce un fondo blanco o negro: el formato no tiene mecanismo para almacenar transparencia parcial.

Alfa en edición de imágenes

En herramientas como Photoshop, Figma o Affinity Photo, el canal alfa se visualiza como un patrón de tablero de ajedrez: la forma convencional de representar "ningún color aquí". Al exportar, las áreas del tablero se convierten en píxeles transparentes en el archivo de salida, visibles solo en formatos que admiten alfa.

Un error común en el flujo de trabajo: diseñar un logo sobre un fondo de color, exportar como PNG y descubrir que el fondo está incrustado. La solución es asegurarse de que la capa de fondo esté oculta o eliminada antes de exportar, dejando solo los píxeles con canal alfa.

La propiedad CSS opacity vs rgba/hsla

Aquí es donde muchos desarrolladores cometen errores que llevan a comportamientos inesperados. CSS proporciona dos formas fundamentalmente diferentes de lograr efectos de transparencia, y se comportan de manera muy diferente.

La propiedad CSS opacity

.element {
  opacity: 0.5;
}

Esto se aplica a todo el elemento y todos sus descendientes. Si un elemento padre tiene opacity: 0.5 y un hijo tiene opacity: 0.8, la opacidad efectiva del hijo es 0.5 × 0.8 = 0.4. La opacidad es multiplicativa, no aditiva.

Esto tiene una implicación importante: no puedes hacer a un hijo más opaco que su padre. Si una tarjeta tiene opacity: 0.5, cada texto, imagen y decoración dentro de ella también estará al 50% de opacidad como máximo, independientemente de cualquier valor de opacidad establecido en los hijos.

Crea un contexto de apilamiento: Un elemento con opacity menor que 1 crea un nuevo contexto de apilamiento, lo que puede afectar el comportamiento de capas del z-index.

rgba() — Alfa en el valor de color

.element {
  background-color: rgba(59, 130, 246, 0.5);  /* Azul al 50% de opacidad */
  color: rgba(0, 0, 0, 1);                     /* El texto permanece completamente opaco */
}

Con rgba() (rojo, verde, azul, alfa), solo la propiedad CSS específica que usa ese color se vuelve semitransparente. El elemento en sí permanece a opacidad completa. Los elementos hijos no se ven afectados.

Este es el enfoque correcto cuando quieres: - Un fondo semitransparente mientras el texto permanece completamente opaco - Un borde parcialmente transparente - Una sombra translúcida

/* Correcto: el fondo es transparente, el texto no */
.card {
  background-color: rgba(255, 255, 255, 0.15);
  color: #FFFFFF;  /* Siempre completamente opaco */
}

/* Incorrecto: toda la tarjeta, incluido el texto, se vuelve semitransparente */
.card {
  background-color: #FFFFFF;
  opacity: 0.15;  /* Esto hace que el texto sea casi invisible también */
}

hsla() — HSL con alfa

background-color: hsla(210, 100%, 56%, 0.7);

hsla() funciona de forma idéntica a rgba() pero usa el modelo de color HSL para la definición del color. El parámetro alfa (el cuarto valor, 0-1) se comporta exactamente igual que en rgba(). Para diseñadores que piensan en términos de tono, saturación y luminosidad, hsla() suele producir resultados más intuitivos al ajustar la transparencia para variantes de color.

CSS moderno: la sintaxis /

CSS Color Level 4 introdujo una sintaxis más limpia usando barra diagonal para indicar el alfa en cualquier función de color:

background-color: rgb(59 130 246 / 0.5);   /* Igual que rgba(59, 130, 246, 0.5) */
background-color: hsl(210 100% 56% / 0.7); /* Igual que hsla(210, 100%, 56%, 0.7) */
background-color: oklch(0.6 0.2 250 / 0.8);/* OKLCH con alfa */

Esta es la sintaxis moderna preferida y es compatible con todos los navegadores actuales. También funciona con hex:

background-color: #3B82F680;  /* Hex con alfa de 2 dígitos (80 hex = 50% de opacidad) */

El valor alfa en hex funciona en una escala de 0-255 codificada como dos dígitos hexadecimales: - FF = 100% opaco - 80 = ~50% opaco - 40 = ~25% opaco - 00 = completamente transparente

Usa el Conversor de color para convertir cualquier color hex a su equivalente rgba con el valor alfa de tu elección.

Capas con transparencia

Las capas transparentes son una técnica fundamental para crear profundidad, overlays y efectos tintados en el diseño de interfaces. Entender cómo se componen es esencial para predecir el resultado.

Composición alfa simple

Cuando se coloca una capa de primer plano semitransparente sobre un fondo, el color final del píxel es:

resultado = primer plano × alfa + fondo × (1 - alfa)

Para un primer plano blanco (#FFFFFF) al 20% de opacidad sobre un fondo azul (#1D4ED8 / #1D4ED8): - Resultado ≈ 80% azul + 20% blanco = un azul ligeramente aclarado, aproximadamente #4A71DF

Este modelo de mezcla significa que puedes usar overlays de blanco o negro semitransparentes para aclarar u oscurecer sistemáticamente cualquier color base sin cambiar su tono: una técnica muy usada en la generación de paletas tonales.

Patrones prácticos de overlay

Los overlays de oscurecimiento se usan comúnmente en imágenes hero para mejorar la legibilidad del texto:

.hero {
  position: relative;
}

.hero::after {
  content: '';
  position: absolute;
  inset: 0;
  background-color: rgba(0, 0, 0, 0.5);  /* Overlay negro al 50% */
}

Los overlays tintados desplazan la temperatura de color de una imagen:

/* Efecto sepia cálido */
.photo-overlay {
  background-color: rgba(180, 100, 30, 0.3);
  mix-blend-mode: multiply;
}

Efecto de vidrio esmerilado (glassmorphism):

.glass-card {
  background-color: rgba(255, 255, 255, 0.1);
  backdrop-filter: blur(16px);
  border: 1px solid rgba(255, 255, 255, 0.2);
}

Múltiples capas alfa

Al apilar múltiples capas transparentes, el resultado final depende del orden de composición. Cada capa se compone sobre el resultado de todas las capas inferiores. Una pila de diez capas al 10% de opacidad no equivale al 100% de opacidad: la cobertura efectiva crece logarítmicamente:

  • 1 capa al 10%: 10% de cobertura
  • 2 capas al 10%: 19% de cobertura (10% + 90%×10%)
  • 5 capas al 10%: 41% de cobertura
  • 10 capas al 10%: 65% de cobertura

Esto importa al construir efectos de animación en capas: apilar fotogramas translúcidos para crear un efecto de desenfoque de movimiento no acumulará linealmente hasta alcanzar la opacidad completa.

Consideraciones de rendimiento para overlays

No todas las técnicas de transparencia son iguales desde el punto de vista del rendimiento del renderizado.

Rápido: opacity y fondos rgba

  • La propiedad CSS opacity y los colores de fondo rgba()/hsla() se componen en la GPU en todos los navegadores modernos
  • Los elementos con opacity < 1 se promueven a su propia capa del compositor, lo que elimina el costo de pintado por CPU por fotograma
  • Para animaciones de fundido de entrada/salida, las transiciones de opacity están entre las animaciones CSS más económicas posibles
/* Fundido acelerado por GPU */
.element {
  transition: opacity 0.3s ease;
}

Costoso: backdrop-filter

backdrop-filter: blur() —usado en glassmorphism— requiere que el navegador lea todos los píxeles detrás del elemento, aplique el filtro de desenfoque y luego renderice el resultado. Esto es significativamente más intensivo en GPU que un fondo transparente simple.

Límites prácticos: Limita backdrop-filter: blur() a un número reducido de elementos por viewport (típicamente 2-4 como máximo). En hardware móvil de gama media, muchos elementos de vidrio esmerilado simultáneos pueden causar caídas visibles en la tasa de fotogramas.

Mitigación: Para dispositivos de bajo rendimiento, detecta la preferencia y usa un fallback:

@media (prefers-reduced-motion: reduce) {
  .glass-card {
    background-color: rgba(20, 20, 30, 0.9);  /* Fallback opaco */
    backdrop-filter: none;
  }
}

Muy costoso: mix-blend-mode

mix-blend-mode requiere que el navegador componga un elemento contra todas las capas debajo de él usando una fórmula de mezcla específica. Cuando se usa en elementos que se superponen con muchas capas de fondo variadas, el costo de composición es alto.

Usa mix-blend-mode con moderación: para elementos decorativos o overlays de fondo fijo, no para elementos que se desplazan sobre contenido complejo y variado.

La pista will-change

Para elementos que animarán su opacidad, will-change: opacity indica al navegador que promueva previamente el elemento a una capa del compositor antes de que comience la animación:

.modal {
  will-change: opacity;
  opacity: 0;
  transition: opacity 0.3s ease;
}

.modal.visible {
  opacity: 1;
}

Usa esta pista con moderación: promover demasiados elementos con will-change puede degradar el rendimiento al agotar la memoria de la GPU.

Conclusiones clave

  • La opacidad (0-1) describe qué tan opaco es un elemento. La propiedad CSS opacity se aplica a todo el elemento y todos sus descendientes: los hijos no pueden anularla.
  • Los canales alfa en las imágenes son un cuarto canal de datos (junto al RGB) que define la transparencia por píxel. PNG, WebP, AVIF y SVG admiten alfa; JPEG y GIF no (o solo alfa binario).
  • rgba() y hsla() aplican transparencia a propiedades CSS individuales (fondo, borde, sombra) sin afectar a los elementos hijos: úsalos cuando quieras un fondo transparente pero texto completamente opaco.
  • El CSS moderno usa la sintaxis / para alfa en cualquier función de color: rgb(59 130 246 / 0.5), oklch(0.6 0.2 250 / 0.8).
  • Las capas con transparencia siguen la composición alfa: resultado = primer plano × alfa + fondo × (1 − alfa). Las capas apiladas no se acumulan linealmente hasta alcanzar la opacidad completa.
  • Para el rendimiento: opacity y los fondos rgba() están acelerados por GPU y son económicos; backdrop-filter: blur() es costoso; mix-blend-mode sobre contenido en scroll es muy costoso.
  • Usa el Conversor de color para convertir cualquier color hex al formato rgba y calcular el valor alfa exacto que necesitas para cualquier nivel de transparencia.

Colores relacionados

Marcas relacionadas

Herramientas relacionadas