-
Regresamos con nuestro contador regresivo de "Oh noes",
-
¿Y si queremos que el chico "Oh noes" sea más grande,
-
mientras el contador regresivo se acerca a cero?
-
Para que parezca que se acerca más a una muerte inminente.
-
Una manera de hacer esto es animar los estilos de CSS con "window.setInterval".
-
Como primer paso debo encontrar la imagen, y almacenarla en una variable.
-
'var ohnoes = document.getElementById("ohnoes");'
-
Y voy a configurar el tamaño inicial, porque tiene que empezar con algún tamaño,
-
de esa manera tenemos un tamaño desde el que empezamos a hacerlo más grande.
-
Y ahora voy a escribir la función "makeItBigger",
-
que será la función responsable de hacerlo más grande cada vez.
-
Y aquí necesitamos cambiar "style.width",
-
y al "style.width" anterior debemos sumarle 1.
-
Finalmente, vamos a llamar "setInterval" con esta función.
-
"window.setInterval(makeItBigger);",
-
y ¿hasta qué tamaño queremos que crezca?,
-
o ¿cada cuánto queremos hacerlo más grande?
-
Bueno, queremos una animación fluida,
-
lo que significa que generalmente debe ser entre
-
24 cuadros por segundo y 60 cuadros por segundo.
-
Voy a probar con 30 cuadros por segundo, que es 1000 entre 30.
-
Mmm, ok, no está funcionando.
-
¿Ves por qué? Es un poco complicado.
-
Vamos aquí, a pensar un poco en este código.
-
¿Cuál es el valor de "ohnoes.style.width",
-
después de esta línea que está aquí?
-
Bueno, podrías pensar que 50px pasa a ser 51px,
-
pero vamos a anotar el resultado de "ohnoes.style.width" para ver cuál es el valor.
-
Vamos a usar "infoDiv" para poner aquí el resultado.
-
Así que esto es igual a..., vamos a ver,
-
50px, ok.
-
Y luego, tratemos de sumar 1 a 50px.
-
¿Cuánto es 50px más 1?
-
Probablemente digas que son 51px, pero JavaScript
-
piensa en 50px como una cadena de caracteres,
-
así que en realidad esto es igual a "50px1",
-
lo que en realidad no tiene sentido.
-
Así que probablemente el navegador esté ignorando nuestro intento
-
de igualar la propiedad "width" a este valor que no tiene sentido.
-
Lo que tenemos que hacer en convertir este número que tiene una unidad,
-
a un número simplemente,
-
luego sumar 1 a ese número,
-
y luego añadirle "px" nuevamente.
-
Podemos hacer esto encerrando este código en "parseFloat",
-
lo que convierte esto en un número.
-
Luego encerramos todo esto,
-
y le sumamos "px" al final.
-
¡Woo! ¡Está funcionando! ¡Se está haciendo grande!
-
Muy bien.
-
Ahora puedes ver la parte difícil
-
en las animaciones de las propiedades de CSS.
-
Muchas veces tienen las unidades incluidas, así que
-
tienes que usar "parseFloat" para quitar las unidades --- ¡Oh Dios mío se está haciendo más grande!
-
Tienes que quitar las unidades y luego volverlas a incluir.
-
Ok, pero, se está haciendo realmente espantoso;
-
y en realidad, hay algunas cosas que dan miedo,
-
cuando usas "setInterval", para animar las propiedades de CSS.
-
En primer lugar, el navegador no te garantiza que
-
obedecerá este retraso que tenemos aquí.
-
Si se presentan otras cosas como la interacción del usuario,
-
como cuando el usuario teclea algo, entonces tendrás que llamar a la función "callback" más tarde.
-
Y entonces no tendrás esta animación suave.
-
En segundo lugar, el navegador llamará a tu función
-
aún si esto está oculto,
-
lo que usará capacidad de procesamiento de la computadora innecesariamente.
-
Por eso hay una función nueva,
-
disponible en los navegadores modernos
-
diseñada específicamente pensando en animaciones del DOM,
-
y esta función se llama "window.requestAnimationFrame".
-
Para usarla, nos tenemos que deshacer de esta línea que tiene "setInterval".
-
Y llamar "requestAnimationFrame"
-
desde el interior de la función,
-
y en realidad le daremos una referencia
-
a la función "makeItBigger".
-
Entonces llamaremos a la función cuando la página se carga.
-
"makeItBigger();"
-
¡Oh! ¡Muy bien, se está haciendo grande muy rápido esta vez!
-
Ahora el navegador está llamando a la función "makeItBigger" justo antes
-
de que se repinte, lo que sucede cerca de 60 cuadros por segundo,
-
el doble de lo que teníamos antes.
-
Y estamos añadiendo un pixel a la anchura cada vez.
-
Así que si hacemos el cálculo matemático, y somos geniales en matemáticas aquí,
-
estamos añadiendo 60 pixeles por segundo.
-
En sólo pocos segundos crece hasta ser más grande que la página.
-
Ahora ya no se ve.
-
¿Cómo hacemos que nuestra animación corra más despacio?
-
Hay varias maneras, pero una que me gusta
-
es hacer un seguimiento de cuánto tiempo ha transcurrido,
-
y luego basados en eso, calcular cuál debería ser
-
la nueva anchura.
-
Empezamos por recordar el tiempo inicial, en milisegundos,
-
antes de llamar a la función.
-
"var startTime...", ¡Oh!, se sigue haciendo grande otra vez.
-
"new Date().getTime();"
-
Y luego dentro de la función "makeItBigger", guardamos el tiempo actual.
-
"var currentTime = new Date().getTime(),"
-
Y para hacer el cálculo,
-
digamos que queremos que crezca 30 pixeles por segundo,
-
y que empiece en 50 pixeles.
-
Así que vamos a calcular esto aquí.
-
Entonces "... newWidth = 50 ", nuestra anchura de inicio,
-
más el tiempo actual, menos el tiempo inicial,
-
todo esto está en milisegundos así que tenemos que
-
dividir esto entre 1000,
-
y luego multiplicar todo por 30.
-
Porque queremos que aumente 30 pixeles por segundo.
-
Ok, así que ésta es nuestra "newWidth", nueva anchura,
-
y ahora, vamos a configurar "style.width" con esta nueva anchura.
-
Entonces... "newWidth", ¡Ah! aquí vamos.
-
Es una linda y suave animación de 30 pixeles por segundo.
-
Y podemos cambiar este número, si queremos
-
que crezca más despacio o más rápido.
-
¿Y si detenemos la animación cuando llegue a ser demasiado grande?
-
Podemos meter esta línea en un "if",
-
esta línea de aquí, y sólo ejecutarla
-
si "currentWidth" es menor que algún número,
-
por ejemplo 300, vamos a probar esto.
-
Ok.
-
En realidad "currentWidth" es igual a... No, debe ser "newWidth".
-
Ok, vamos a ver si llega a 300.
-
Tu tu tu, tu tu tu tu. ¡Vamos "Oh noes", tú puedes hacerlo!
-
¡Ah! ¡Hermoso!
-
Ahora, esta técnica que usa "requestAnimationFrame"
-
debe funcionar siempre y cuando el usuario tenga Chrome,
-
Firefox o IE10+.
-
Hay diversas librarías de JavaScript y "shims",
-
que usarán "requestAnimationFrame" cuando esté disponible,
-
y luego retroceder a "setInterval" en los navegadores anteriores.
-
Éste es un punto importante en el desarrollo web:
-
La web está cambiando todo el tiempo,
-
los navegadores van teniendo nuevas características,
-
y los desarrolladores están descubriendo nuevas formas de usar esas características.
-
Debes estar aprendiendo constantemente sobre las cosas nuevas,
-
y qué es lo mejor para lo que quieres hacer.