Menu

Transform en CSS: translate, scale, skew y transform-origin

La propiedad transform mueve, escala, rota e inclina un elemento sin cambiar el layout a su alrededor. Aprende todas las funciones de transform, por qué importa el orden de las funciones, transform-origin, las propiedades separadas translate, scale y rotate, y el truco de centrado translate(-50%, -50%).

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Qué hace transform

transform cambia cómo se dibuja un elemento: movido, escalado, girado o inclinado. Los contornos punteados de abajo muestran dónde estaría cada caja sin su transformación:

translate(20px, 10px) mueve la caja azul 20px a lo largo y 10px hacia abajo. scale(1.3) hace la verde un 30% más grande alrededor de su centro. rotate(20deg) gira la ámbar en el sentido de las agujas del reloj, y skewX(-20deg) inclina la oscura. En todos los casos, el hueco punteado, que es el espacio que ocupa el elemento en el layout, se queda exactamente donde estaba.

Funciones de transform

FunciónHaceEjemplo
translate(x, y)muevetranslate(20px, -10px), translate(-50%, -50%)
translateX(x) / translateY(y)mueve en un ejetranslateY(-4px)
scale(s) / scale(x, y)cambia el tamaño (1 = original, 0.5 = la mitad, negativo refleja)scale(1.1), scale(-1, 1)
scaleX(s) / scaleY(s)cambia el tamaño en un ejescaleX(0.5)
rotate(angle)gira en el sentido de las agujas del reloj (negativo = en sentido contrario)rotate(45deg), rotate(0.25turn)
skew(x, y) / skewX(a) / skewY(a)inclinaskewX(-15deg)
matrix(a, b, c, d, e, f)todo lo anterior en una matriz, sobre todo lo que devuelve el navegador
nonesin transformación

Los porcentajes en translate() son relativos al tamaño propio del elemento, no al de su padre. La rotación tiene su propia página con grados, vueltas y giro continuo: rotar con CSS.

Playground de transform

Mueve los controles deslizantes. La primera línea es el valor de transform que armaste; la segunda es la matriz que calculó el navegador a partir de él, que es lo que devuelve getComputedStyle para cualquier transformación:

Las transformaciones no mueven el layout

Un elemento transformado se dibuja en otro lugar, pero la página se acomoda como si no estuviera transformado. Sus vecinos mantienen sus posiciones. Eso es lo que hace que las transformaciones sean buenas para efectos hover y animaciones: nada a su alrededor se vuelve a acomodar.

Las dos cajas del medio se ven 1.5 veces más grandes. La escalada se superpone a sus vecinas y C se queda en su sitio; la que se agrandó con width y height empuja a C 40px más allá.

Varias transformaciones y su orden

Pon varias funciones en un solo transform, separadas por espacios. El orden cambia el resultado porque, leídas de izquierda a derecha, cada función trabaja en el sistema de coordenadas que dejaron las funciones anteriores:

La caja azul se movió 120px en línea recta y luego se giró en su lugar. La caja verde se giró primero, así que su "eje x" apunta en diagonal, y translateX(120px) la mueve por la diagonal. Las mismas funciones, otro lugar.

La otra trampa: una segunda declaración transform reemplaza a la primera. Si una tarjeta tiene transform: rotate(-2deg) y su regla de hover dice transform: scale(1.05), la rotación desaparece en hover. Repite las dos (rotate(-2deg) scale(1.05)) o usa las propiedades individuales de abajo.

transform-origin

Escalar, girar e inclinar ocurren alrededor de un punto fijo, el origen de la transformación, que por defecto es el centro. Cámbialo con palabras clave, longitudes o porcentajes:

Las tres cajas giran 25 grados. La primera pivota sobre su centro, la segunda mantiene su esquina superior izquierda fija en la esquina del hueco y la tercera su esquina inferior derecha. Un menú desplegable que crece desde su botón usa transform-origin: top con scale().

Las propiedades translate, scale y rotate

Los navegadores modernos también tienen tres propiedades separadas que hacen lo mismo que las funciones, pero que se pueden definir y animar de forma independiente:

.card {
  rotate: -2deg;
  transition: scale 0.2s ease-out;
}
.card:hover {
  scale: 1.05;   /* the rotation stays, because it is a different property */
}

Siempre se combinan como si estuvieran escritas transform: translate(...) rotate(...) scale(...) delante de cualquier valor de transform, sin importar el orden en que las declares. Fíjate en la sintaxis: translate: 10px 20px y scale: 1.2 llevan los valores sin los paréntesis de la función.

Centrar con translate(-50%, -50%)

Como los porcentajes de translate() se refieren al tamaño propio del elemento, top: 50%; left: 50%; transform: translate(-50%, -50%) centra en su padre un elemento con posición absoluta de cualquier tamaño. La página de cómo centrar un div lo compara con flexbox y grid.

Errores comunes

  • Dos declaraciones transform. La posterior gana por completo. Combina las funciones, o usa las propiedades rotate, scale y translate.
  • Transformar un elemento inline. Un <span> o un <a> simples ignoran transform. Hazlo inline-block.
  • Esperar que los vecinos se muevan. Las transformaciones nunca cambian el layout. Para hacer espacio, cambia width, margin o gap.
  • Orden de funciones incorrecto. rotate() antes de translate() mueve a lo largo del eje girado.
  • Sorpresas con hijos con position: fixed. Un elemento transformado se convierte en el bloque contenedor de los descendientes con posición fija, así que un encabezado fijo dentro de él se desplaza con él. También crea un nuevo contexto de apilamiento para z-index.

Preguntas frecuentes

¿Qué hace transform en CSS?

Cambia cómo se dibuja un elemento: movido (translate), cambiado de tamaño (scale), girado (rotate) o inclinado (skew). El elemento conserva su lugar original en el layout, así que los elementos que lo rodean no se mueven.

¿Cómo aplico varias transformaciones en CSS?

Enuméralas en un solo valor de transform separadas por espacios: transform: translateX(50px) rotate(20deg) scale(1.2);. Escribir una segunda declaración transform reemplaza a la primera en lugar de sumarse a ella.

¿Importa el orden de las funciones de transform?

Sí. Leídas de izquierda a derecha, cada función trabaja en los ejes que dejaron las anteriores, así que rotate(45deg) translateX(100px) mueve el elemento a lo largo de un eje girado, mientras que translateX(100px) rotate(45deg) lo mueve en línea recta y después lo gira.

¿Qué es transform-origin?

El punto fijo alrededor del cual se escala, se gira y se inclina. El valor por defecto es el centro (50% 50%). transform-origin: top left hace que un elemento crezca desde su esquina superior izquierda, o gire alrededor de ella.

¿Por qué transform no funciona en mi span?

Las transformaciones no se aplican a elementos inline no reemplazados, como un <span> o un <a> simples. Dale al elemento display: inline-block o block y la transformación funciona.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR