Transformaciones CSS

facebook-svg gplus-svg twitter-svg

Con las transformaciones 2D de CSS3 podemos mover ( translate ) redimensionar ( scale ) girar ( rotate ) y sesgar ( skew ) los elementos HTML.

elemento { transform: none | funciones de transformación | initial | inherit;}

Algunas funciones de transformación:

Transformaciones Descripción
none Establece que no habrá transformación alguna.
translate(x,y) Traslada o mueve un elemento a lo largo de los ejes horizontal ( x ) y vertical ( y )
translateX(x) Traslada o mueve un elemento solo a lo largo del eje horizontal ( x )
translateY(y) Traslada o mueve un elemento solo a lo largo del eje vertical ( y )
scale(x,y) Redimensiona un elemento 2D
scaleX(x) Redimensiona un elemento solo a lo largo de su eje horizontal ( x )
scaleY(y) Redimensiona un elemento solo a lo largo de su eje vertical ( y )
skew(ax,ay) Sesga un elemento a lo largo de sus dos ejes
skewX(ax) Sesga un elemento a lo largo del eje X (horizontal), donde ax es el ángulo de deformación.
skewY(ay) Sesga un elemento a lo largo del eje X (vertical), donde ay es el ángulo de deformación.
rotate(a) Define una rotation 2D, donde a es el ángulo ( en grados hexagesimales ), donde a es el ángulo de rotación.
rotateX(angle) Define una rotación a lo largo del eje X ( horizontal )
rotateY(a) Define una rotación a lo largo del eje X ( vertical )
matrix(n,n,n,n,n,n) Define una transformación 2D, utilizando una matriz de 6 valores.
matrix3d (n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n) Define una transformación 3D, utilizando una matriz de 4x4 = 16 valores.
initial Sets this property to its default value. Read about initial
inherit Hereda this property from its parent element. Read about inherit

Trasladar con translate

Para trasladar elementos en el CSS3 utilizamos el método translate(), o los métodos de desglose translateX() y translateY(). En el siguiente ejemplo el centro del elemento .translate cambia su posición 100px hacia la derecha y 50px hacia abajo.

.translate{ transform: translate(100px, 50px)}

Si queremos trasladar el elemento solo hacia la derecha podemos dejar de lado el segundo parámetro y el CSS entenderá que el desplazamiento en y es nulo.

.translate{ transform: translate(100px)}

Podemos expresar lo mismo utilizando el método de desglose translateX que traslada o mueve un elemento solo a lo largo del eje horizontal:

.translate{ transform: translateX(100px)}

Para desplazar un elemento solo a lo largo del eje vertical ( y ) podemos utilizar el método de desglose translateY.

.translate{ transform: translateY(100px)}

* {
  box-sizing: border-box;
}
.contenedor {
  width: 340px;
  height: 250px;
  margin: 0 auto;
  border: 1px solid #d9d9d9;
  position: relative;
}
.contenedor p {
  text-align: center;
  font-size: 16px;
  margin-top: 37px;
}
.transform {
  width: 100px;
  height: 100px;
  border: 1px solid #d9d9d9;
  background-image: url(images/transformCSS.png);
  position: absolute;
}
[class^=translate] {
  top: 25px;
  left: 20px;
}
.translate {
  -webkit-transform: translate(100px, 100px);
  -moz-transform: translate(100px, 100px);
  -ms-transform: translate(100px, 100px);
  transform: translate(100px, 100px);
}
.translateX {
  -webkit-transform: translate(200px);
  -moz-transform: translate(200px);
  -ms-transform: translate(200px);
  transform: translate(200px);
}

La parte que más nos interesa de todo este código es:

.translate  {transform : translate(100px, 100px);}
.translateX {transform : translate(200px);}

translate

translateX

translate

translateX

Redimensionar con scale()

Para redimensionar un elemento utilizamos una de la función scale(), o los métodos de desglose scaleX() y scaleX().

div{transform: scale(x-axis, y-axis);}

El método scale(x, y) reduce o amplía a escala el elemento transformado, donde x-axis representa el eje horizontal, e y-axis el eje vertical. Por ejemplo: si x-axis = 0.5 la anchura del elemento se verá reducida en un 50%. Y si y-axis = 2, la altura del elemento aumentara a 200% de su valor inicial. El valor por defecto de los parámetros x e y es 1 ( el elemento no será redimensionado ).

div{transform:  scale(.5, 2);}

En el caso que queramos redimensionar solo la anchura del elemento podemos utilizar la función scaleX() que redimensiona un elemento solo a lo largo del eje horizontal. Para redimensionar solo la altura del elemento utilizamos scaleY().

.reduceX{transform:  scaleX(.5);}
.aumentaY{transform:  scaleY(2);}

Veamos un ejemplo.


* {
  box-sizing: border-box;
}
.contenedor {
  width: 340px;
  height: 250px;
  margin: 0 auto;
  border: 1px solid #d9d9d9;
  position: relative;
}
.contenedor p {
  text-align: center;
  font-size: 16px;
  margin-top: 37px;
}
.transform {
  width: 100px;
  height: 100px;
  border: 1px solid #d9d9d9;
  background-image: url(images/transformCSS.png);
  position: absolute;
}
[class^=scale] {
  top: 15px;
  left: 120px;
}
.scale {
  -webkit-transform: scale(1, .5);
  -moz-transform: scale(1, .5);
  -ms-transform: scale(1, .5);
  transform: scale(1, .5);
}
.scaleX {
  -webkit-transform: scaleX(2) translateY(120px);
  -moz-transform: scaleX(2) translateY(120px);
  -ms-transform: scaleX(2) translateY(120px);
  transform: scaleX(2) translateY(120px);
}

La parte que más nos interesa de todo este código es:

.scale{ transform: scale(1, .5);}
/*Para el div.scaleX utilizamos dos trasformaciones: scaleX y translateY*/
.scaleX{ transform: scaleX(2) translateY(120px);}

scale

scaleX(2)

scale

scaleX(2)

Observamos que al redimensionar una caja, los bordes, las imágenes de fondo y los elementos hijos ( <p> en este caso ) están redimensionados también. La caja aparece redimensionada alrededor de su centro. Decimos que el origen de la deformación se encuentra en el centro del elemento. Podemos cambiar el origen  utilizando – como no - la propiedad transform-origin.

Sesgar con skew

Para deformar objetos en el CSS utilizamos el método skew ( sesgar ), o los métodos de desglose skewX ( sesgar horizontalmente ) y skewY ( sesgar verticalmente ). Todos estos métodos toman como parámetros los ángulos de deformación en grados sexagesimales ( deg ).

div.skewX{transform: skewX(15deg);}
div.skewY{transform: skewY(20deg);}
div.skew{transform: skew(15deg, 20deg);}

En el caso de skewX el eje vertical del elemento aparece inclinado hacia atrás en un ángulo de 15º. En el caso de skewY el eje horizontal aparece inclinado hacia adelante en un ángulo 20º. El método skew deforma el elemento en ambas direcciones.

Exactamente como en el caso de scale(), el origen de la deformación se encuentra en el centro del elemento, pero podemos cambiar el origen  utilizando la propiedad transform-origin.


* {
  box-sizing: border-box;
}
.contenedor {
  width: 340px;
  height: 250px;
  margin: 0 auto;
  border: 1px solid #d9d9d9;
  position: relative;
}
.contenedor p {
  text-align: center;
  font-size: 16px;
  margin-top: 37px;
}
.transform {
  width: 100px;
  height: 100px;
  border: 1px solid #d9d9d9;
  background-image: url(images/transformCSS.png);
  position: absolute;
}
[class^=skew] {
  top: 15px;
  left: 60px;
}
.skew {
  -webkit-transform: skew(15deg, 15deg);
  -moz-transform: skew(15deg, 15deg);
  -ms-transform: skew(15deg, 15deg);
  transform: skew(15deg, 15deg);
}
.skewX {
  -webkit-transform: skewX(15deg) translateX(120px);
  -moz-transform: skewX(15deg) translateX(120px);
  -ms-transform: skewX(15deg) translateX(120px);
  transform: skewX(15deg) translateX(120px);
}
.skewY {
  -webkit-transform: skewY(15deg) translateY(120px);
  -moz-transform: skewY(15deg) translateY(120px);
  -ms-transform: skewY(15deg) translateY(120px);
  transform: skewY(15deg) translateY(120px);
}

skew

skewX

skewY

skew

skewX

skewY

Entender skew()

See the Pen Skew in CSS by Gabi (@enxaneta) on CodePen.

Girar elementos con rotate()

Para girar un elemento utilizamos la función rotate().

div{transform: rotate(45deg);}

En este ejemplo el elemento esta girado 45º ( grados sexagesimales ) en el sentido del reloj.  
Podemos girar un elemento en el sentido contrario utilizando valores negativas del ángulo:

div{transform: rotate(-45deg);}

* {
  box-sizing: border-box;
}
.contenedor {
  width: 340px;
  height: 250px;
  margin: 0 auto;
  border: 1px solid #d9d9d9;
  position: relative;
}
.contenedor p {
  text-align: center;
  font-size: 16px;
  margin-top: 37px;
}
.transform {
  width: 100px;
  height: 100px;
  border: 1px solid #d9d9d9;
  background-image: url(images/transformCSS.png);
  position: absolute;
}
[class^=rotate] {
  top: 75px;
  left: 120px;
}
.rotate {
  -webkit-transform: rotate(45deg);
  -moz-transform: rotate(45deg);
  -ms-transform: rotate(45deg);
  transform: rotate(45deg);
}

rotate

rotate

La propiedad transform-origin

En el ejemplo anterior el elemento está girado alrededor de su centro. Podemos cambiar el centro de rotación ( el origen ) utilizando la propiedad transform-origin.

elemento { transform-origin: x-axis y-axis z-axis | initial | inherit;}

Si el valor de z-axis ( solo para transformaciones 3D ) no está declarado su valor por defecto es 0.
Si el valor de y-axis no está declarado su valor por defecto es 50%.

El valor por defecto de transform-origin: 50% 50% 0;
Posibles valores para el x-axis (el eje horizontal):

  • - left (izquierda)
  • - center (centro)
  • - right (derecha)
  • - distancia
  • - %

Posibles valores para y-axis (el eje vertical) :

  • - top (arriba)
  • - center (centro)
  • - bottom (abajo)
  • - distancia
  • - %

Posibles valores para z-axis:

  • - distancia
.rotate-origen {
     transform-origin : 0 0;
     transform : rotate(45deg);
 }

* {
  box-sizing: border-box;
}
.contenedor {
  width: 340px;
  height: 250px;
  margin: 0 auto;
  border: 1px solid #d9d9d9;
  position: relative;
}
.contenedor p {
  text-align: center;
  font-size: 16px;
  margin-top: 37px;
}
.transform {
  width: 100px;
  height: 100px;
  border: 1px solid #d9d9d9;
  background-image: url(images/transformCSS.png);
  position: absolute;
}
[class^=rotate] {
  top: 75px;
  left: 120px;
}
.rotate-origen {
  -webkit-transform-origin: 0 0;
  transform: rotate(45deg);
  -moz-transform-origin: 0 0;
  transform: rotate(45deg);
  -ms-transform-origin: 0 0;
  transform: rotate(45deg);
  transform-origin: 0 0;
  transform: rotate(45deg);
}

rotate

rotate

La perspectiva

En un dibujo, la perspectiva simula la tercera dimensión, da al observador la sensación de profundidad y volumen. La perspectiva depende de la posición del observador.
En CSS3 la propiedad perspective determina la distancia entre el observador virtual, y el objeto.
Cuanto más pequeño el valor de perspective, más cerca estamos del objeto, y por lo tanto más impresionante el efecto visual. Por lo contrario, cuanto más grande el valor de perspective, más lejos estamos del objeto, y la deformación es menos importante.

See the Pen Perspective in CSS by Gabi (@enxaneta) on CodePen.