Ultimate Useless Machine en Css parte 4: ¡Ya funciona!


       En la última parte de la serie de artículos sobre la máquina inútil activábamos transformaciones con la pseudoclase css :active del interruptor.

       Para llegar a los demás elementos usábamos selectores de adyacencia. He comprobado que la doble adyacencia no funcionaba bien en Chrome y he cambiado el código usando el selector de hermano sin adyacencia (~), así que he cambiado

#interruptor:active + #tapa + #allen{

       por

#interruptor:active ~ #allen{

       Ahora vamos a trabajar la animación. Tiene que tener los siguientes pasos: Cuando pulsemos el interruptor éste tiene que cambiar su posición a encendido, una vez encendido la caja se tiene que abrir y cuando se haya abierto lo suficiente el percutor girar. Cuando el percutor llegue a la posición del interruptor, se tiene que apagar y el percutor comenzar a bajar otra vez y la caja cerrarse para volver a estar como al principio.

       La animación completa durará 4.6 segundos. Las animaciones se van a realizar con frames. Cada declaración de frames se tiene que repetir para cada navegador, por lo que el código es muy extenso, voy a poner solo la del percutor, para hacernos a la idea de como funciona. El resto de la animación se puede ver en el código fuente de la máquina funcionando.

@-moz-keyframes animaAllen{
0%{ -moz-transform: rotate(0deg); }
17%{ -moz-transform: rotate(0deg); }
50%{ -moz-transform: rotate(-90deg); }
83%{ -moz-transform: rotate(0deg); }
100%{ -moz-transform: rotate(0deg); }
}
@-webkit-keyframes animaAllen{
0%{ -webkit-transform: rotate(0deg); }
17%{ -webkit-transform: rotate(0deg); }
50%{ -webkit-transform: rotate(-90deg); }
83%{ -webkit-transform: rotate(0deg); }
100%{ -webkit-transform: rotate(0deg); }
}
@-o-keyframes animaAllen{
0%{ -o-transform: rotate(0deg); }
17%{ -o-transform: rotate(0deg); }
50%{ -o-transform: rotate(-90deg); }
83%{ -o-transform: rotate(0deg); }
100%{ -o-transform: rotate(0deg); }
}
@-ms-keyframes animaAllen{
0%{ -ms-transform: rotate(0deg); }
17%{ -ms-transform: rotate(0deg); }
50%{ -ms-transform: rotate(-90deg); }
83%{ -ms-transform: rotate(0deg); }
100%{ -ms-transform: rotate(0deg); }
}
@keyframes animaAllen{
0%{ transform: rotate(0deg); }
17%{ transform: rotate(0deg); }
50%{ transform: rotate(-90deg); }
83%{ transform: rotate(0deg); }
100%{ transform: rotate(0deg); }
}

       Esta es sencilla, queremos que esté quieto hasta el 17% de los 4.6 segundos, que después gire 90ª llegando a 90 a la mitad de la animación y que vuelva a bajar, llegando abajo faltando todavía un 17% de tiempo para el final.

       Hemos dicho los pasos de la animación, en porcentajes, porque no hemos especificado todavía la duración ni modo ni nada, eso se hace así:

#interruptor:active ~ #allen{
-moz-animation: animaAllen 4.6s linear 0s 1;
-webkit-animation: animaAllen 4.6s linear 0s 1;
-o-animation: animaAllen 4.6s linear 0s 1;
-ms-animation: animaAllen 4.6s linear 0s 1;
animation: animaAllen 4.6s linear 0s 1;
}

       Damos el nombre de la animación a usar, el tiempo total, la función de interpolación, el retardo en el inicio y el número de repeticiones.

       Ahora llega el momento de mostrar el resultado final. Funciona en Firefox, Chrome, Safari y Opera modernos. Funcionará (al menos en teoría) en Internet Explorer 10. Al ser solo CSS tenemos el pequeño problema de que hay que dejar pulsado el ratón en el interruptor hasta que acaba la animación. Solucionaremos con javascript este problema, pero por ahora tenemos loq ue buscábamos, ¡una Ultimate Useless Machine en CSS!.
useless machine