Saltar al contenido

CSS, de a poco

Curso de CSS

Transform y transiciones

Lección 13 de 37 · 4 min

Una caja se puede mover, rotar y escalar sin que el resto de la página se entere. Y con una línea más, ese cambio se anima en vez de saltar.

Mover, rotar y escalar

La propiedad transform recibe una o más funciones. Las tres de base son:

  1. MovertranslatetranslateX(24px) corre la caja 24px a la derecha; translate(24px, 8px) la mueve en los dos ejes.
  2. Rotarrotaterotate(45deg) la gira 45 grados en sentido horario. Un ángulo negativo gira al revés.
  3. Escalarscalescale(1.2) la hace un 20% más ancha y más alta, y scale(0.5) la deja a la mitad de cada lado.

Lo importante: la transformación no toca el layout. La caja sigue ocupando su lugar y las vecinas no se corren. En la demo, la ficha del medio se levanta del atril: su hueco punteado y las fichas vecinas se quedan quietos. La línea naranja mide cuánto la corre translateX.

transform-origin: centertranslateX(24px) rotate(30deg) scale(1.2)
transform-origin
ficha.css
.ficha {
transform: translateX(24px) rotate(30deg) scale(1.2);
transform-origin: center;
transition: transform 300ms cubic-bezier(0.22, 1, 0.36, 1);
}
ficha.html
<div
class="translate-x-6 rotate-30 scale-120 origin-center
transition-transform duration-300 ease-[cubic-bezier(0.22,1,0.36,1)]
motion-reduce:transition-none"
>
A
</div>

En la versión corta el orden importa. Cada función trabaja sobre los ejes que deja la anterior: con rotate(45deg) translateX(24px) la caja avanza en diagonal, no en horizontal. Por eso conviene escribirlas siempre en el mismo orden: mover, rotar, escalar.

Las mismas dos funciones en los dos órdenes. Con translateX(40px) rotate(45deg) la ficha avanza 40px en horizontal y después gira; con rotate(45deg) translateX(40px) gira primero y los mismos 40px la llevan en diagonal.

Ángulos y punto de origen

Los ángulos aceptan cuatro unidades. Una vuelta completa vale lo mismo en todas:

angulos.css
1turn = 360deg = 2π rad ≈ 6.2832rad = 400grad

En la práctica alcanza con deg y turn: un cuarto de vuelta es 90deg o 0.25turn. La rotación y la escala se hacen alrededor del punto de origen (transform-origin), que por defecto es el centro de la caja. Con top left la caja gira desde su esquina superior izquierda: el punto naranja lo marca.

La misma ficha rotada 30 grados desde tres puntos de origen. Desde el centro gira en su lugar; desde la esquina superior izquierda gira como una bisagra; desde la esquina inferior derecha gira desde abajo.

CSS también tiene translate, rotate y scale como propiedades sueltas. Se pueden cambiar de a una sin repetir las otras, y el navegador las aplica siempre en ese orden: mover, rotar, escalar.

ficha.css
.ficha {
translate: 24px 0;
rotate: 30deg;
scale: 1.2;
}

Transiciones

Una transición (transition) anima el cambio de una propiedad entre su valor viejo y el nuevo. Tiene cuatro partes:

  1. Propiedadtransition-propertyQué se anima, por ejemplo transform.
  2. Duracióntransition-durationEn s o ms. 1s es igual a 1000ms.
  3. Curvatransition-timing-functionCómo se reparte la velocidad. linear va parejo; ease, el valor por defecto, arranca suave, acelera y frena despacio. cubic-bezier(0.22, 1, 0.36, 1) sale rápido y se asienta despacio: va bien para algo que se mueve.
  4. Retardotransition-delayCuánto espera antes de arrancar.

Animá transform y opacity: el navegador las cambia sin recalcular el layout. La ficha se pinta en una capa propia, encima de la página, y se mueve sola; animar width o top obliga a recalcular el layout en cada cuadro, y se nota.

La ficha A levantada sobre una capa propia, encima del atril. Está movida, rotada y escalada con transform, que el navegador compone sin recalcular el layout. En el atril quedan las fichas M y R y el hueco punteado de la A: el layout no cambió.

Y respetá a quien pide menos movimiento desde su sistema:

ficha.css
.ficha {
transition: transform 300ms ease-out;
}
@media (prefers-reduced-motion: reduce) {
.ficha {
transition: none;
}
}

En Tailwind

En Tailwind v4, translate-x-*, rotate-* y scale-* no escriben transform: usan las propiedades sueltas translate, rotate y scale. Como el navegador las aplica en ese orden, el resultado es el mismo que mover, rotar y escalar en el atajo.

CSSTailwind
translate: 24px 0translate-x-6
rotate: 30degrotate-30 · -rotate-30
scale: 1.2scale-120
transform-origin: top leftorigin-top-left
transition-property: transformtransition-transform
transition-duration: 300msduration-300 · delay-150
cubic-bezier(0.22, 1, 0.36, 1)ease-[cubic-bezier(0.22,1,0.36,1)]
prefers-reduced-motion: reducemotion-reduce:transition-none
boton.html
<button
class="transition-transform duration-300 ease-out
hover:-translate-y-1 hover:scale-105
motion-reduce:transition-none"
>
Guardar
</button>