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ón | Hace | Ejemplo |
|---|---|---|
translate(x, y) | mueve | translate(20px, -10px), translate(-50%, -50%) |
translateX(x) / translateY(y) | mueve en un eje | translateY(-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 eje | scaleX(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) | inclina | skewX(-15deg) |
matrix(a, b, c, d, e, f) | todo lo anterior en una matriz, sobre todo lo que devuelve el navegador | |
none | sin 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 propiedadesrotate,scaleytranslate. - Transformar un elemento inline. Un
<span>o un<a>simples ignorantransform. Hazloinline-block. - Esperar que los vecinos se muevan. Las transformaciones nunca cambian el layout. Para hacer espacio, cambia
width,marginogap. - Orden de funciones incorrecto.
rotate()antes detranslate()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 paraz-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.