Rotaciones con CSS3: guía práctica para girar elementos en 2D y 3D

- 👤 Andrés Cruz

🇺🇸 In english

Rotaciones con CSS3: guía práctica para girar elementos en 2D y 3D

Uno de los aspectos más interesantes de CSS3 es la del uso de las transformaciones, ya que, varias de ellas te permiten hacer operaciones en 3D y conocer el potencial de las tecnologías web.

Lo primero que probé fue la rotación. Me sorprendió lo sencillo que era girar cualquier elemento HTML y también lo fácil que era que algo saliera raro si no entendías el origen de la transformación. En este artículo te muestro cómo rotar elementos con CSS3, cuándo usar cada tipo de rotación y cómo evitar errores comunes.

En este post, veremos como realizar rotaciones sobre cualquier elementos HTML empleando la propiedad transform de CSS3.

Qué es la rotación en CSS y para qué sirve

Las rotaciones en CSS permiten girar elementos en dos o tres dimensiones utilizando la propiedad transform. Es una de las transformaciones más útiles para animaciones, micro-interacciones, loaders, tarjetas “flip”, efectos hover y componentes interactivos.

En mi caso, siempre empiezo explicando rotate() porque es la más intuitiva: le dices cuántos grados y CSS hace el resto.

Cómo funciona transform y las funciones rotate()

La propiedad transform en CSS3 permite aplicar transformaciones 2D y 3D a los elementos HTML en una página web; en esta entrada nos interesa aprender a realizar una de estas transformaciones, que son las rotaciones; las propiedades posibles a emplear son las siguientes:

  • rotate(ángulo): Define una rotación en su espacio 2D.
  • rotate3d(x,y,z,ángulo): Define una rotación 3D en todos los ejes.
  • rotateX(ángulo): Define una rotación 3D alrededor del eje de las X.
  • rotateY(ángulo): Define una rotación 3D alrededor del eje de las Y.
  • rotateZ(ángulo): Define una rotación 3D alrededor del eje de las Z.

La sintaxis básica:

.elemento {
 transform: rotate(45deg);
}
  • Un valor positivo gira en sentido horario.
  • Un valor negativo gira en sentido antihorario.

Consideraciones

  • El ángulo debe de ser definido en grados (deg por sus siglas en inglés).
  • Es recomendable utilizar los prefijos de los navegadores web para garantizar su compatibilidad.
  • Con todas las propiedades vistas anteriormente es posible definir las rotaciones en un espacio 2D y 3D según un punto de origen definido por la propiedad transform-origin.

Definiendo una regla en CSS para las transformaciones

div
{
  transform:rotate(7deg);
  -ms-transform:rotate(7deg); /* IE 9 en adelante*/
  -webkit-transform:rotate(7deg); /* Opera, Chrome, y Safari */
}

Es importante aclarar que las transformaciones o la propiedad de transform ya se ha estandarizado en los navegadores modernos y por lo tanto, no hace falta agregar los prefijos de -ms o -webkit, por nombrar algunos.

Rotaciones 2D: rotate() y rotateZ()

Si solo necesitas un giro plano (como una brújula, un icono que rota o un loader sencillo), usa rotate().

Sentido horario y antihorario:

.caja-horaria { transform: rotate(30deg); }
.caja-antihoraria { transform: rotate(-30deg); }

Rotar un elemento 45°:

.caja {
 width: 120px;
 height: 120px;
 background: #ddd;
 transform: rotate(45deg);
}

Este giro se hace sobre el centro del elemento salvo que se indique lo contrario (más adelante hablamos de transform-origin, que es clave).

Rotaciones 3D: rotateX(), rotateY() y rotate3d()

Aquí empieza lo divertido. Las rotaciones tridimensionales dan profundidad, ideales para tarjetas flip, efectos de “perspectiva” o UI más dinámica.

Cuándo usar cada eje

  • rotateX() → gira hacia adelante/atrás (efecto de levantar)
  • rotateY() → gira hacia los lados (como una puerta)
  • rotateZ() → equivalente a rotate(), giro plano
  • rotate3d(x, y, z, ángulo) → giro avanzado combinando ejes

Caso práctico: rotaciones combinadas

.tarjeta {
 transform: rotateX(30deg) rotateY(20deg);
}

Cuando probé rotaciones 3D por primera vez, noté que algunas parecían “aplastadas”. Eso pasa porque no hay una perspectiva definida. Si quieres que se vean realistas:

.contenedor {
 perspective: 800px;
}

El papel de transform-origin: por qué tus rotaciones a veces se ven mal

Cuando empieces a realizar tus pruebas con las transformaciones, notarás, que, aunque rotaras bien, el resultado podía ser extraño si el origen no estaba bien configurado.

Cambiar el centro de giro

.caja {
 transform-origin: top left;
 transform: rotate(45deg);
}

Valores válidos:

  • Palabras clave: top, bottom, left, right, center
  • Porcentajes: 25% 75%
  • Valores absolutos: 20px 30px

Ejemplos con top/left/center:

  • top left → el giro parece salir desde la esquina
  • center (por defecto) → ideal para iconos o loaders
  • bottom → útil para elementos con pivot fijo (agujas, puertas, etc.)

Ejemplos de rotaciones sobre elementos

En todos los ejemplos se aplicarán rotaciones a los div contenedores de las imágenes desde los 0 grados a los 360 grados en un ciclo infinito con ayuda de un poco de JavaScript.

rotate(angulo):

Con la propiedad rotate es posible definir las rotaciones en un espacio 2D; según el signo (positivo o negativo) del ángulo especificado puede ocurrir una de las siguientes condiciones:

  • Sentido Horario o hacia la derecha si el ángulo es positivo.
  • Sentido Antihorario o hacia la izquierda si el ángulo es negativo.

Primero veremos un ejemplo de lo anterior; básicamente consiste en aplicar las rotaciones de un par de imágenes en sentido horario cuando el grado es positivo y en sentido antihorario en caso contrarío:

  • Rotaciones horarias con un grado positivo:

    Rotaciones Horarias

    logo html5

    rotate(267deg)
  • Rotaciones antihorarias con un grado negativo:

    Rotaciones Antihorarias

    rotate(-267deg)

rotateX(ángulo), rotateY(ángulo) y rotateZ(ángulo):

Cómo pudieron haberse dado cuenta, el nombre de la propiedad indica el eje afectado por la rotaciones:

  • Rotación en el eje X

    Rotación en el eje X

    logo html5

    rotateX(267deg)
  • Rotación en el eje Y

    Rotación en el eje Y

    rotateY(267deg)
  • Rotación en el eje Z 

     

    Rotación en el eje Z



     

    rotateZ(267deg)

rotate3d(ángulo)

Ahora aplicaremos la rotación en los tres ejes con una sola propiedad:

Rotación en los ejes X, Y y Z 

 

Rotación en los ejes X, Y y Z



 

rotate3d(1,2,2,267deg)

Si quisiéramos que el elemento sólo rotará en el eje de las X con la propiedad rotate3d() podríamos hacer lo siguiente:

rotateX(angulo) es equivalente a rotate3d(1, 0, 0, ángulo).

Componente Flip Card (HTML + CSS)

Este es uno de los usos más elegantes de las rotaciones 3D. Es perfecto para portafolios, tarjetas de producto o UI con información “por detrás”.

Cuando enseñaba este efecto, siempre explicaba que la clave era combinar rotateY() con backface-visibility: hidden para evitar el efecto espejo.

<div class="flip-card">
 <div class="flip-card-inner">
   <div class="flip-card-front">
     Front
   </div>
   <div class="flip-card-back">
     Back
   </div>
 </div>
</div>
.flip-card {
 width: 200px;
 height: 260px;
 perspective: 1000px;
}
.flip-card-inner {
 width: 100%;
 height: 100%;
 transition: transform 0.8s;
 transform-style: preserve-3d;
}
.flip-card:hover .flip-card-inner {
 transform: rotateY(180deg);
}
.flip-card-front,
.flip-card-back {
 position: absolute;
 width: 100%;
 height: 100%;
 backface-visibility: hidden;
 display: flex;
 justify-content: center;
 align-items: center;
 font-size: 1.4rem;
 font-weight: bold;
 color: #fff;
 border-radius: 10px;
}
.flip-card-front {
 background: #4a90e2;
}
.flip-card-back {
 background: #50c878;
 transform: rotateY(180deg);
}

Resultado esperado:

  • La tarjeta gira al pasar el mouse.
  • El frontal y la parte trasera se alinean perfectamente gracias a preserve-3d.
  • El giro es suave gracias a la transición.

Loader rotatorio: 3 ejemplos (simple, doble y 3D)

Aquí tienes tres loaders listos para copiar y pegar.

Cuando yo hacía demos de animación, estos eran mis clásicos porque son simples y muy visuales.

1. Loader rotatorio simple (solo rotate())

<div class="loader-simple"></div>
.loader-simple {
 width: 40px;
 height: 40px;
 border: 4px solid #ddd;
 border-top-color: #4a90e2;
 border-radius: 50%;
 animation: spin 1s linear infinite;
}
@keyframes spin {
 to { transform: rotate(360deg); }
}

2. Loader doble (dos anillos rotando en sentidos opuestos)
 

<div class="loader-dual">
 <div></div>
 <div></div>
</div>
CSS
.loader-dual {
 position: relative;
 width: 50px;
 height: 50px;
}
.loader-dual div {
 position: absolute;
 inset: 0;
 border: 4px solid transparent;
 border-radius: 50%;
 animation: giro-dual 1.2s linear infinite;
}
.loader-dual div:nth-child(1) {
 border-top-color: #e24a4a;
}
.loader-dual div:nth-child(2) {
 border-bottom-color: #4a90e2;
 animation-direction: reverse;
}
@keyframes giro-dual {
 to { transform: rotate(360deg); }
}

Este se ve más profesional porque combina dos rotaciones contrapuestas.

3. Loader 3D (rotateX / rotateY con perspectiva)
 

<div class="loader-3d"></div>
.loader-3d {
 width: 40px;
 height: 40px;
 border: 4px solid #4a90e2;
 border-radius: 50%;
 animation: giro3d 1.4s ease-in-out infinite;
 transform-style: preserve-3d;
}
@keyframes giro3d {
 0%   { transform: rotateX(0) rotateY(0); }
 50%  { transform: rotateX(180deg) rotateY(0); }
 100% { transform: rotateX(180deg) rotateY(180deg); }
}

El resultado es un efecto tipo “globo terráqueo” girando sobre dos ejes. Si le añades perspectiva a un contenedor padre, el efecto se vuelve todavía más realista.

Animar una rotación: de 0° a 360°

Si quieres un loader o un giro infinito, basta con CSS.

Animación con CSS puro (keyframes)

rotando {
 animation: giro 3s linear infinite;
}
@keyframes giro {
 from { transform: rotate(0deg); }
 to { transform: rotate(360deg); }
}

En mis primeros experimentos usaba JavaScript para esto, pero hoy CSS es totalmente suficiente para la mayoría de las cosas.

Alternativa con JavaScript para ciclos infinitos

let grados = 0;
setInterval(() => {
 grados++;
 elemento.style.transform = `rotate(${grados}deg)`;
}, 10);

Rotar solo la imagen de fondo (técnica del pseudoelemento)

CSS no permite rotar la imagen de fondo directamente.

La solución es usar un pseudoelemento.

.caja {
 position: relative;
 overflow: hidden;
}
.caja::before {
 content: "";
 position: absolute;
 inset: -50%;
 background: url('imagen.jpg') center/cover no-repeat;
 transform: rotate(45deg);
 z-index: -1;
}

Evitar que el contenido rote

Si rotas un contenedor completo, el fondo también gira.

Para revertirlo:

.caja {
 transform: rotate(30deg);
}
.caja::before {
 transform: rotate(-30deg);
}

Errores frecuentes y cómo solucionarlos

  • Elementos que se “aplastan”
    • Esto pasa mucho al usar rotateX o rotateY sin perspectiva.
      Solución: aplicar perspective.
  • Cuando la rotación no se nota o desaparece
    • Puede estar girando fuera del viewport.
      Solución: aumentar width/height o usar overflow: visible.
  • Problemas de solapamiento
    • Las rotaciones 2D no ocupan más espacio; pueden chocar con otros elementos.
      Solución: margenes extra o contenedores más amplios.

Compatibilidad y uso de prefijos para navegadores

Aunque hoy casi no los necesitas, en proyectos legacy sigue siendo importante incluirlos.
Recuerdo que cuando aplicaba rotaciones en sitios antiguos, el prefijo -ms- era obligatorio para que todo funcionara en IE9.

.elemento {
 transform: rotate(45deg);
}

Los navegadores modernos (Chrome, Firefox, Safari, Edge) funcionan sin prefijos.

Elementos reversibles con estilo 3D en CSS

Elementos reversibles con estilo 3D en CSS

A lo largo del tiempo, hemos visto muchas cosas que podemos hacer con CSS; los selectores, animaciones y transiciones son algunos de los muchos componentes que muchas veces se encuentran presentes en las entradas anteriores sobre CSS, y esto es debido en gran parte a su versatilidad, fácil uso y por el gran efecto visual que se logra; esta entrada no será una excepción y veremos como hacer que un elemento sea reversible empleando las transiciones en CSS y las animaciones en CSS como un componente clave para la reversibilidad de los elementos HTML:

2
1

Posiciona el cursor encima del contenedor de color verde.

El código HTML base que emplearemos para mostrar todos los ejemplos es el siguiente:

<div class="reversible reversibleImagen"> <div id="atras"><span>1</span> </div> <div id="adelante"><span>2</span> </div> </div>

Tenemos dos divs que llamaremos adelante y atras respectivamente dentro de un bloque u otro div llamado reversible; la idea general es localizar ambos divs internos (adelante y atras) en una misma posición y rotar a su padre (reverso) para mostrar los divs de adelante a atrás y viceversa.

Antes de mostrar el CSS explicaremos las partes más importantes que debe de formar parte el CSS para hacer que un elemento sea reversible; veamos:

  • La propiedad perspectiva en CSS
    • La perspectiva en CSS agrega un factor de profundidad (Z) en los elementos HTML que es esencial para visualizar correctamente nuestro ejemplo; aunque ya existe una entrada en la que hablamos sobre la propiedad perspectiva en CSS más en detalle: Entendiendo la propiedad perspective (perspectiva) en CSS; esta propiedad será aplicado al padre del elemento reverso (que es el que rota).
  • La propiedad transform-style en CSS
    • Determina que los hijos del elemento asignado puedan ser visto en el espacio 3D ( preserve-3d) o no (flat).
  • La propiedad backface-visibility en CSS
    • Esta propiedad indica que si un elemento visto por su reverso (girado 180 grados) o -por detrás- debe ser visible (por defecto) o no; para nuestro ejemplo nos interesa que no sea visible debido a que al reverso de un elemento se encuentra otro elemento (adelante y atras).

Finalmente, el CSS:

.reversible{
    transform-style : preserve-3d;
    transition : transform 3s ease;
    margin: 0 auto;
    width : 200px;
    height : 200px;
}
.reversible:hover{
    -webkit-transform : rotateY(180deg);
    transform : rotateY(180deg);
}
.reversible div{
    position : absolute;
    top : 300px;
    width : 200px;
    height : 200px;
    backface-visibility : hidden;
    border:3px solid #000000;
}
.reversible div span{
    font-size: 180px;
    display:block;
    text-align:center;
    color:#FFF;
}
.reversible div img{
    width:200px;
    height:200px;
    object-fit: none;
}
.example1, .example2{
    -webkit-perspective : 500px;
    perspective : 500px;
}
#atras{
    background : #00FF00;
    transform : rotateY( 180deg );
}
#adelante{
    background : #FF0000;
}

La razón de estas líneas:

#atras{
    /*Otras propiedades y valores*/
    transform : rotateY( 180deg );
}

Es para mostrar el div atrás, producto del efecto que tendría la propiedad backface-visibility sobre el div:

2
1

Animaciones y los elementos reversibles

Como comentamos al inicio de esta entrada, también es posible emplear las animaciones para crear elementos reversibles como el siguiente:

2
1

Para ello empleamos las siguientes líneas de código CSS:

@-webkit-keyframes reverso {
    0%{
    transform : rotateY(0deg);
}
50%{
    transform : rotateY(180deg);
}
100%{
    transform : rotateY(0deg);
}
}
@keyframes reverso {
    0%{
    transform : rotateY(0deg);
}
100%{
    transform : rotateY(180deg);
}
}
.reversibleImagen{
    animation: reverso 5s infinite;
}

Inclusive, poniéndonos un poquito más creativos, podemos agregarles imágenes a los divs internos (adelante y atras) en conjunto con la propiedad object-fit tratado anteriormente en: La propiedad object-fit en CSS para ajustar la imagen al contenedor:

Preguntas frecuentes

  • ¿Cómo rotar un elemento con CSS?
    • Con transform: rotate(ángulo).
  • ¿Cómo hacer una rotación infinita?
    • Con una animación CSS (@keyframes rotate).
  • ¿Cómo rotar solo la imagen de fondo?
    • Usando un pseudoelemento ::before o ::after.
  • ¿Por qué mi elemento se deforma al girar?
    • Falta de perspectiva en rotaciones 3D.
  • ¿Puedo combinar varias transformaciones?
    • Sí: transform: rotate(45deg) scale(1.2) translateX(10px);

Conclusión

Las rotaciones con CSS3 son una herramienta poderosa y flexible que puedes usar para animaciones, efectos visuales y componentes interactivos. Desde giros simples con rotate() hasta rotaciones avanzadas con rotate3d(), la clave está en entender el origen (transform-origin) y cómo influye en el resultado.

Cuando empecé a enseñar esto, siempre recomendaba lo mismo: empieza por las rotaciones 2D, juega con valores positivos y negativos, y luego prueba el 3D con perspectiva. En pocos minutos tendrás efectos profesionales sin una sola línea de JavaScript.

Acepto recibir anuncios de interes sobre este Blog.

Aprende a aplicar rotaciones con CSS3 en 2D y 3D: rotate(), rotateX(), rotateY(), flip cards, loaders animados y técnicas para girar fondos con pseudoelementos. Guía práctica y ejemplos.

| 👤 Andrés Cruz

🇺🇸 In english