Las transformaciones CSS nos permiten transformar los objetos que se encuentren tanto en un espacio bidimensional como tridimensional. Estas transformaciones permiten mover los objetos por los ejes X, Z e Y, rotarlos o cambiar la escala de los mismos. Si ademas añadimos la propiedad perspective pasaríamos a tener una transformación tridimensional.
Antes de lanzarnos a crear nuestros efectos 3D vamos a ver como están dispuestos los ejes X, Z, e Y, algo fundamental a la hora de situar cualquier elemento y moverlo por la pantalla.
Como podemos observar a la hora de realizar un efecto tridimensional el eje Z es el mas importante puesto que al combinarlo con la propiedad perspective, nos da la profundidad en el plano, es decir nos permite hacer que los objetos se acerquen o se alejen. Con los otros dos ejes definiremos los desplazamientos laterales y verticales dentro de este escenario 3D.
A continuación muestro la diferencia entre un escenario 2D y uno 3D:
Los 2 cubos usan la misma clase CSS para animarse, la única diferencia radica en que el cubo de la derecha estra dentro de un contenedor al que se le aplica la propiedad perspective, lo que lo convierte en tridimensional, veamos el código:
Primero hay que dar forma al efecto aplicando el CSS a todas las caras del cubo, empezando por los estilos comunes como las dimensiones..
1 2 3 4 5 6 7 | .cubo div { position : absolute ; width : 120px ; height : 120px ; border : 2px solid #222 ; } |
..y después cara por cara orientándolas a la su posición correspondiente.
1 2 3 4 5 6 | .cubo .cara 1 { -webkit-transform: translateZ( 60px ); } .cubo .cara 2 { -webkit-transform: rotateY( 90 deg) translateZ( 60px ); } .cubo .cara 3 { -webkit-transform: rotateY( 90 deg) rotateX( 90 deg) translateZ( 60px ); } .cubo .cara 4 { -webkit-transform: rotateY( 180 deg) rotateZ( 90 deg) translateZ( 60px ); } .cubo .cara 5 { -webkit-transform: rotateY( -90 deg) rotateZ( 90 deg) translateZ( 60px ); } .cubo .cara 6 { -webkit-transform: rotateX( -90 deg) translateZ( 60px ); } |
Para que roten hay que hacer una animación con keyframes que quedaria asi:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | @-webkit-keyframes rotacubo { 0% { -webkit-transform: rotateX( 0 deg); } 100% { -webkit-transform: rotateX( 360 deg); } } .animacubo { -webkit-animation-name: rotacubo; -webkit-animation-timing-function: linear; -webkit-animation-iteration-count: infinite; -webkit-animation-duration: 12 s; -webkit-transform-style: preserve -3 d; -webkit-transform-origin: 60px 60px 0 ; |
Importante en este punto el origen (transform-origin) de la animación, ya que determina el punto sobre el que los cubos van a rotar, en este caso la mitad de su longitud. Por lo demás no hay nada especial, un efecto de rotación sobre el eje X con rotateX que se ejecuta de forma lineal, algo sobre lo que ya escribí en este artículo.
Por ultimo el html del primer cubo seria así..
1 2 3 4 5 6 7 8 | < div class = "cubo animacubo" > < div class = "cara1" ></ div > < div class = "cara2" ></ div > < div class = "cara3" ></ div > < div class = "cara4" ></ div > < div class = "cara5" ></ div > < div class = "cara6" ></ div > </ div > |
..mientras que el segundo cubo esta en un contenedor con el siguiente CSS
1 2 3 4 5 | #contenedor{ width : 120px ; height : 120px ; -webkit-perspective: 1000px ; } |
1 2 3 4 5 6 7 8 9 10 | < div id = "contenedor" > < div class = "cubo animacubo" > < div class = "cara1" ></ div > < div class = "cara2" ></ div > < div class = "cara3" ></ div > < div class = "cara4" ></ div > < div class = "cara5" ></ div > < div class = "cara6" ></ div > </ div > </ div > |
Ahora que ya sabemos como aplicar perspective a los efectos 3D vamos a complicar un poco la cosa añadiendo el efecto de profundidad sobre el eje Z y alguna rotación mas.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | @-webkit-keyframes rotacubo { 0% { -webkit-transform: translateZ( 0 ) rotateX( 0 ) rotateY( 0 ); } 50% { -webkit-transform: translateZ( -800px ) rotateX( 180 deg) rotateY( 180 deg); } 100% { -webkit-transform: translateZ( 0 ) rotateX( 360 deg) rotateY( 360 deg); } } .animacubo { -webkit-animation-name: rotacubo; -webkit-animation-timing-function: linear; -webkit-animation-iteration-count: infinite; -webkit-animation-duration: 12 s; -webkit-transform-style: preserve -3 d; -webkit-transform-origin: 60px 60px 0 ; } |
En este CSS añado a la propiedad transform otras dos funciones, translateZ y rotateY, la primera es para que el cubo se mueva en el eje Z logrando ese efecto de profundidad y la segunda es para que rote sobre el eje Y al mismo tiempo que sobre el eje X. Este seria el efecto conseguido con ese código:
Para que los efectos 3D y las transformaciones sean compatibles con firefox y otros navegadores no webkit tendremos que quitar los prefijos -webkit- de las instrucciones CSS para que estos puedan interpretarlas.
En esta ocasión no incluyo el código de los ejemplos puesto que lo he realizado sobre la marcha en el editor de la web, pero voy a compartir con vosotros una pequeña animación que he realizado para comprender mejor estas propiedades. Se trata de un octágono al que le he añadido una textura y un fondo, la base es la misma, solo cambian el numero de caras.
Puedes verlo en acción o descargar el código fuente con las imágenes desde aquí:
También podría interesarte:
Valora este artículo.
Comentarios
Aquí te dejo una:
tridiv.com/
Salu2
Suscripción de noticias RSS para comentarios de esta entrada.