Transiciones CSS

En CSS aparecen uno de los aspectos más interesantes de la web interactiva: las transiciones. En versiones anteriores de CSS sólo se podían utilizar ciertas funcionalidades interactivas con pseudoclases como :hover o :focus. Sin embargo, dichas transiciones ocurrían de golpe, pasando de un estado inicial a otro final. Mediante las transiciones, tenemos a nuestra disposición una gran flexibilidad que nos permitirá dotar de atractivos y elegantes efectos de transición que multiplicarán por mil las posibilidades de nuestros diseños.

Las transiciones se basan en un principio muy básico, conseguir un efecto suavizado entre un estado inicial y un estado final. Las propiedades relacionadas que existen son las siguientes:

Propiedades Valor
transition-property all | none | propiedad css
transition-duration 0 |
transition-timing-function ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier(A, B, C, D)
transition-delay 0 |

En primer lugar, la propiedad transition-property se utiliza para especificar la propiedad a la que que afectará la transición. Podemos especificar la propiedad concreta (width o color, por ejemplo) o simplemente especificar all para que se aplique a todos los elementos con los que se encuentre. Por otro lado, none hace que no se aplique ninguna transición.

Nota: Debes saber que no todos los elementos permiten animación debido a su complejidad. Por ejemplo, los background-image de gradientes no son animables actualmente.

Con la propiedad transition-duration especificaremos la duración de la transición, desde el inicio de la transición, hasta su finalización. Se recomienda siempre comenzar con valores cortos, para que las transiciones sean rápidas y elegantes.

Si establecemos una duración demasiado grande, el navegador realizará la transición con detención intermitentes, lo que hará que la transición vaya a golpes. Además, transiciones muy largas pueden resultar molestas a muchos usuarios.

Función de tiempo

La propiedad transition-timing-function permite indicar el ritmo de la transición que queremos conseguir. Cuando estamos aprendiendo CSS, recomiendo utilizar linear, que realiza una transición a un ritmo constante. Sin embargo, podemos utilizar otros valores para conseguir que el ritmo sea diferente al inicio y/o al final de la transición.

Los valores que puede tomar la propiedad son los siguientes:

Valor Inicio Transcurso Final Equivalente en cubic-beizer
ease Lento Rápido Lento (0.25, 0.1, 0.25, 1)
linear Normal Normal Normal (0, 0, 1, 1)
ease-in Lento Normal Normal (0.42, 0, 1, 1)
ease-out Normal Normal Lento (0, 0, 0.58, 1)
ease-in-out Lento Normal Lento (0.42, 0, 0.58, 1)
cubic-bezier(A, B, C, D) - - - Transición personalizada

Una función de tiempo linear siempre es constante, mientras que ease comienza suavemente, continua de forma más rápida y termina suavemente de nuevo. Ease-in y ease-out son variaciones que van más lento al principio o al final, y ease-in-out una mezcla de las dos.

Cubic-Bezier()

La función de tiempo cubic-bezier() es una función personalizada, donde podemos darle unos valores concretos depediendo de la velocidad que queramos que tenga la transición. En la última columna de la tabla anterior podemos ver los valores equivalentes a cada una de las palabras clave mencionadas. En principio, el formato de la función es cubic-bezier(A, B, C, D), donde:

Parámetro Valor Descripción Pertenece a
A X1 Eje X del primer punto que orienta la curva bezier. P1
B Y1 Eje Y del primer punto que orienta la curva bezier. P1
C X2 Eje X del segundo punto que orienta la curva bezier. P2
D Y2 Eje Y del segundo punto que orienta la curva bezier. P2

Cubic Bezier

También puedes utilizar la página Cubic Bezier, donde puedes ver de forma interactiva la velocidad de las transiciones dependiendo de los parámetros utilizados.

Por último, la propiedad transition-delay nos ofrece la posibilidad de retrasar el inicio de la transición los segundos especificados.

Veamos un pequeño ejemplo de todo ello:

a {
  background: #DDD;
  color: #222;
  padding: 2px;
  border: 1px solid #AAA;
}

a:hover {
  background: #FFF;
  color: #666;
  padding: 8px 14px;
  border: 1px solid #888;

  transition-property: all;
  transition-duration: 0.2s;
  transition-timing-function: ease-in;
}

Truco: Si nos fijamos bien, este estilo se aplica sólo al mover el ratón sobre el enlace (transición de entrada). Sin embargo, si movemos el ratón fuera del enlace, no se produce transición sino que realiza el cambio de forma brusca. Si movemos las propiedades de transición al primer bloque, se aplicarán tanto en las transiciones de entrada como en las de salida.

Atajo: Transiciones

Como siempre, podemos resumir todas estas operaciones en una propiedad de atajo denominada transition. Los valores del ejemplo superior, se podrían escribir como se puede ver a continuación (si no necesitas algún valor, se puede omitir):

div {
  /* transition: <property> <duration> <timing-function> <delay> */
  transition: all 0.2s ease-in;
}
Manz
Publicado por Manz

Docente, divulgador informático y freelance. Autor de Emezeta.com, es profesor en la Universidad de La Laguna y dirige el curso de Programación web FullStack y Diseño web FrontEnd de EOI en Tenerife (Canarias). En sus ratos libres, busca GIF de gatos en Internet.