02 Capítulo 2 · Lección 5

Translate

Redactado por
Author Sebastian V.
Fecha de publicación

01/07/2024

Tiempo de lectura

7 min

Tema

CSS Transform

La solución elegante al problema de centrado

Durante años, centrar un elemento de tamaño desconocido en CSS fue uno de los mayores dolores de cabeza en el desarrollo frontend. Si no sabías exactamente cuántos píxeles medía el elemento, era prácticamente imposible centrarlo con precisión usando solo top y left.

Había que usar margin negativo, pero ese valor era fijo. Si el elemento cambiaba de tamaño por el contenido, el centrado se rompía. Flexbox resolvió muchos casos, pero no todos, especialmente en el posicionamiento absoluto.

La solución definitiva llegó con translate() y el uso estratégico de porcentajes.

Movimiento en dos ejes simultáneos

translate(x, y) es simplemente una versión combinada de translateX() y translateY() en una sola función. El primer valor controla el eje horizontal y el segundo el vertical:

> _
/* Equivalencias exactas */
transform: translate(50px, 30px);
/* = translateX(50px) translateY(30px) */

El truco del centrado perfecto

Ahora viene la técnica que todo desarrollador frontend debe memorizar. Es sencilla, pero cambia por completo la forma en que piensas sobre el posicionamiento:

Si pones un elemento en position: absolute con top: 50% y left: 50%, el navegador coloca la esquina superior izquierda del elemento exactamente en el centro de su contenedor. Eso no es lo que quieres.

Si añades transform: translate(-50%, -50%), el elemento se mueve hacia la izquierda un 50% de su propio ancho y hacia arriba un 50% de su propia altura. Como recordarás, los porcentajes en transform son relativos al propio elemento, no al padre. Esto lo coloca perfectamente centrado, sin importar cuánto mida.

> _
.elemento-centrado {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%); /* La clave */
}

Tooltips: el caso de uso más común

Los tooltips (las pequeñas burbujas de texto que aparecen al hacer hover sobre un icono) son probablemente el caso de uso más frecuente de esta técnica. El tooltip necesita aparecer centrado horizontalmente sobre su elemento padre, sin importar cuánto texto contenga. Si el texto cambia, el centrado debe mantenerse automáticamente.

La solución es colocar el tooltip con left: 50% y luego moverlo con translate(-50%, 0) para que su centro quede alineado con el centro del padre.

Diferencia clave con top y left

  • top/left: Mueven la posición del elemento en el flujo del documento, lo que puede afectar al layout. No son amigables para la GPU.
  • translate(): Mueve únicamente la representación visual del elemento, sin tocar el layout. La GPU lo maneja eficientemente.

Consejo profesional

translate(-50%, -50%) para centrar absolutamente es una técnica tan fundamental que debes tenerla memorizada. No es magia, es matemática: llevamos el elemento a la mitad del padre con top/left y luego lo retrocedemos la mitad de sí mismo con transform. Es el centrado CSS más robusto que existe fuera de Flexbox/Grid.

Tooltip centrado con Translate

> _
<div class="contenedor-centrado">
  <div class="tooltip-trigger">
    Pasa el ratón
    <div class="tooltip">¡Hola! Estoy perfectamente centrado.</div>
  </div>
</div>
> _
Pasa el ratón
¡Hola! Estoy perfectamente centrado.

Pasa el ratón sobre el botón. El tooltip aparece perfectamente centrado gracias a translate(-50%, 0), independientemente de cuánto texto contenga.

Errores comunes

01
Usar margin: auto para centrar elementos absolutos margin: auto no funciona en elementos con position: absolute a menos que definas todos los lados (top, right, bottom, left). translate(-50%, -50%) es mucho más predecible y poderoso.
02
Olvidar el segundo valor de translate() translate(50%) equivale a translate(50%, 0). Si escribes translate(50%, ) con una coma pero sin segundo valor, el CSS se invalida. Siempre pon ambos valores o usa translateX() / translateY().

Centra cualquier cosa

Crea un modal (ventana emergente) que aparezca perfectamente centrado en la pantalla usando position: fixed con top:50%, left:50% y transform: translate(-50%, -50%).

01 Crea un elemento con position: relative
02 Añade un hijo con position: absolute, left: 50%
03 Aplica transform: translate(-50%, -50%) al hijo
04 Observa cómo queda perfectamente centrado sin importar su tamaño