Generador CSS · 2D y 3D
Generador de transform CSS
Desplaza, escala, gira e inclina un elemento y mira el resultado al instante. Con el punto de origen marcado sobre la silueta original —lo que casi nadie explica— y la perspectiva 3D en su sitio: el contenedor padre.
Vista previa
CSS generado
¿Buscas otra propiedad? Todos los generadores están en código web.
El orden de las funciones no es decorativo
El navegador lee la lista de transform de izquierda a derecha, y cada
función deja transformado el sistema de coordenadas que usará la siguiente. Por eso
translateX(100px) rotate(45deg) mueve el elemento 100 píxeles a la derecha
y luego lo gira sobre sí mismo, mientras que rotate(45deg) translateX(100px)
inclina primero los ejes y hace que esos 100 píxeles se recorran en diagonal. Mismas dos
funciones, dos posiciones finales completamente distintas.
Este generador siempre escribe en un orden fijo: desplazamiento, giro, inclinación y escala. No es capricho. Al poner el desplazamiento primero, el elemento se mueve por los ejes de la pantalla, que es lo que casi siempre esperas; si lo dejaras para el final, cada giro previo cambiaría la dirección del movimiento y tendrías que calcular de cabeza hacia dónde acaba yendo. Si necesitas el efecto órbita —girar alrededor de un punto lejano— es justo al revés: pon primero el giro y después el desplazamiento.
transform-origin: el alfiler sobre el que pivota todo
Todas las funciones de transform, menos las de desplazamiento, necesitan un
punto fijo de referencia. Ese punto es transform-origin y por defecto vale
50% 50%: el centro exacto del elemento. Cámbialo y cambia el gesto entero
sin tocar ni un grado.
Un rotate(15deg) con origen 50% 50% es una tarjeta ligeramente
torcida. El mismo giro con origen 0% 100% es una puerta con bisagra en la
esquina inferior izquierda. Un scaleX(1.4) con origen al centro crece hacia
los dos lados; con origen 0% 50% crece solo hacia la derecha, que es el truco
detrás de las barras de progreso y los subrayados que se despliegan al pasar el ratón.
Los porcentajes se miden sobre el tamaño del propio elemento, así que también admite
palabras clave (top left equivale a 0% 0%) y medidas absolutas
en píxeles. En 3D acepta un tercer valor, la profundidad, que siempre va en píxeles.
Enciende «mostrar guías» en el panel de la derecha: el punto ámbar marca dónde está clavado el alfiler y la silueta discontinua es la posición original del elemento. Mover el origen y ver cómo cambia el mismo giro es la forma rápida de entenderlo.
Qué hace perspective y dónde se declara
perspective es la distancia entre el ojo del espectador y el plano de la
pantalla. Sin ella, un rotateY(45deg) se ve como un simple aplastamiento
horizontal, porque el navegador dibuja la escena en proyección plana. Con ella, el lado
que se aleja se hace más pequeño y aparece la sensación de profundidad. Valores bajos
(200–400 px) ponen el ojo muy cerca y exageran el efecto; valores altos (1200 px o más)
lo dejan sutil y elegante. Para interfaces, entre 600 y 1000 px suele funcionar.
La trampa: la propiedad se declara en el contenedor padre, no en el
elemento que gira. Si la escribes junto al transform, no pasa absolutamente
nada, y ese es el motivo número uno de «no me funciona la perspectiva». Existe también la
función perspective(), que sí va dentro del propio
transform y debe ser el primer valor de la lista; la diferencia es que
entonces cada elemento tiene su propio punto de fuga, en vez de compartir una escena
común. Si vas a animar varias tarjetas como si estuvieran en la misma habitación, usa la
propiedad en el padre. Y si quieres mover el punto de fuga fuera del centro, ahí está
perspective-origin.
Por qué transform y opacity son las dos propiedades baratas de animar
Para pintar un fotograma, el navegador recorre cuatro fases: calcula estilos, calcula la
disposición (layout), pinta los píxeles y compone las capas. Cuando animas
width, top, left o margin, obligas a
rehacer la disposición completa: mover una caja puede desplazar a todas sus vecinas, así
que el navegador vuelve a medir y a repintar en cada fotograma. A 60 fotogramas por
segundo tienes 16 milisegundos para todo, y ahí es donde aparece el tirón.
transform y opacity se saltan las fases caras: el elemento ya
está pintado en su capa y la tarjeta gráfica se limita a colocarlo movido, girado o más
transparente. Por eso la regla práctica es traducir el efecto a estas dos propiedades
siempre que puedas: en vez de animar left, anima translateX; en
vez de width, un scaleX con el origen bien puesto; en vez de
height: 0, un scaleY desde el borde superior. Si necesitas
avisar al navegador de que algo va a moverse, will-change: transform ayuda,
pero úsalo con cuentagotas: cada capa extra consume memoria de vídeo.
Cuando toque decidir el color y el ritmo del movimiento, el generador de degradados te da el fondo, en colores en vivo compruebas que el contraste aguanta, y la guía de teoría del color explica por qué unas combinaciones se sienten estables y otras no.
Preguntas frecuentes
¿Por qué cambia el resultado si cambio el orden de las funciones en transform?
Porque cada función transforma el sistema de coordenadas que usará la siguiente. El
navegador las aplica de izquierda a derecha: en translateX(100px) rotate(45deg)
el elemento se mueve 100 píxeles a la derecha y luego gira sobre sí mismo, mientras que en
rotate(45deg) translateX(100px) primero se inclinan los ejes y esos 100
píxeles se recorren en diagonal. Mismo par de funciones, dos posiciones finales distintas.
¿Qué hace exactamente transform-origin?
Define el punto fijo alrededor del cual gira, escala o se inclina el elemento. Su valor
por defecto es 50% 50%, el centro de la caja. Si lo cambias a
0% 100% el elemento pivota sobre su esquina inferior izquierda, como una
puerta con bisagra. Los porcentajes se miden sobre el tamaño del propio elemento, y
también admite palabras clave como top left o medidas absolutas en píxeles.
¿Dónde se declara perspective y por qué parece que no funciona?
La propiedad perspective se declara en el contenedor padre, no en el elemento
que gira. Si la pones en el mismo elemento que lleva el transform no pasa
nada, y por eso parece que no funciona. La alternativa es usarla como función dentro del
propio transform, escribiendo perspective(800px) como primer
valor de la lista, aunque en ese caso cada elemento tiene su propio punto de fuga en lugar
de compartir una escena común.
¿Por qué conviene animar transform y opacity en vez de top, left o width?
Porque transform y opacity se resuelven en la fase de
composición, que se ejecuta en la tarjeta gráfica y no obliga al navegador a recalcular la
posición del resto de la página. Cambiar top, left,
width o margin dispara un reflow: el navegador vuelve a
medir la disposición completa y a repintar en cada fotograma, y ahí es donde se pierden
los 60 fotogramas por segundo.