< Return to Video

Animando estilos con RAF (Versión en Video)

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

more » « less
Video Language:
English, British
Duration:
07:48

Spanish, Mexican subtitles

Revisions