02 Capítulo 2 · Lección 10

Múltiples Transformaciones

Redactado por
Author Sebastian V.
Fecha de publicación

11/07/2024

Tiempo de lectura

8 min

Tema

CSS Transform

Cuando una sola transformación no es suficiente

Los diseñadores de interacción que trabajan en productos como Figma, Linear o Vercel saben que la diferencia entre una interfaz que se siente "bien" y una que se siente "premium" está en los detalles compuestos. No es solo que el botón crezca, sino que mientras crece también se eleva y su sombra se profundiza. No es solo que la tarjeta se eleve, sino que también rota levemente revelando un ángulo, como si la sostuvieras en la mano.

Para lograr esas sensaciones complejas necesitas combinar múltiples transformaciones en una sola propiedad. Y hay dos estrategias: combinarlas en el mismo elemento, o coordinarlas entre elementos diferentes.

Combinando en el mismo elemento

Como aprendimos en la lección de Sintaxis, encadenar múltiples funciones en una sola línea transform es tan sencillo como separarlas por espacios. El desafío es el orden.

El orden matemático en el que CSS aplica las transformaciones es de derecha a izquierda (aunque visualmente se lean de izquierda a derecha). Esto significa que en:

> _
transform: translateX(50px) rotate(45deg);

Primero se aplica el rotate(45deg) y luego el translateX(50px). Pero como el elemento ya fue rotado, su eje X ya no apunta a la derecha original de la pantalla, sino a la dirección en la que apunta el elemento rotado. Esto puede resultar en movimientos inesperados.

La convención estándar (la más predecible) es: primero traslaciones, luego rotaciones, luego escalas.

Coordinando múltiples elementos

La técnica que más eleva la calidad percibida de una interfaz es usar el hover de un elemento padre para activar transformaciones en múltiples elementos hijos, cada uno con su propia velocidad y movimiento. Un ejemplo perfecto son los botones de CTA (Call To Action) con ícono de flecha:

  • El contenedor del botón se eleva ligeramente: translateY(-4px).
  • La flecha interior se dispara hacia la derecha: translateX(6px).
  • Cada elemento tiene su propio transition-timing-function, haciendo que el movimiento compuesto se sienta coreografiado, no mecánico.

Resultados distintos según el orden

Para ilustrar la importancia del orden, imagina que quieres mover un elemento 100px y luego rotarlo 90 grados. El resultado de translateX(100px) rotate(90deg) es diferente al de rotate(90deg) translateX(100px). En el segundo caso, el elemento termina 100px más abajo (porque sus ejes fueron rotados antes de trasladarse).

No hay un "correcto" absoluto: hay el que produce el resultado que tú quieres. La práctica y la experimentación son la única forma de dominar esto.

Consejo profesional

Para transformaciones compuestas en múltiples hijos, un truco profesional es definir tiempos escalonados (stagger). El botón padre reacciona en 0.3s y la flecha interior reacciona en 0.25s pero con un delay de 0.05s. Este pequeño desfase hace que el movimiento se sienta 'vivo' y coreografiado en lugar de mecánico.

El botón CTA con flecha animada

> _
<div class="icono-contenedor">
  <div class="icono-cta">
    <svg class="icono-flecha" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
      <line x1="5" y1="12" x2="19" y2="12"/>
      <polyline points="12 5 19 12 12 19"/>
    </svg>
    Descubrir más
  </div>
</div>
> _
Descubrir más

Pasa el ratón sobre el botón. Dos transformaciones ocurren coordinadas: el contenedor sube y la flecha se dispara hacia adelante. Cada elemento tiene su propia curva de timing.

Errores comunes

01
Definir dos propiedades transform en el mismo elemento Si escribes transform: translateX(50px) en una línea y transform: rotate(45deg) en otra, el segundo sobreescribe al primero. Todas las funciones deben estar en una sola declaración transform.
02
Ignorar el impacto del orden Combinar funciones sin pensar en el orden puede producir animaciones con destinos inesperados. Si algo se mueve en una dirección extraña, prueba cambiando el orden de las funciones.

Coreografía de movimiento

Crea una tarjeta de perfil donde al hacer hover el avatar haga scale(1.1) y la información de texto se desplace ligeramente hacia la derecha con translateX(8px), dando sensación de expansión.

01 Crea un botón con un icono SVG de flecha dentro
02 Pon una transición en el botón (translateY) y otra en la flecha (translateX)
03 Activa ambas transformaciones en el :hover del botón padre
04 Experimenta con diferentes timing functions en cada elemento