• Empleos
  • Sobre nosotros
  • profesionales
    • Inicio
    • Empleos
    • Cursos y retos
  • empresas
    • Inicio
    • Publicar vacante
    • Nuestro proceso
    • Precios
    • Evaluaciones
    • Nómina
    • Blog
    • Comercial
    • Calculadora de salario

0

104
Vistas
moviendo el elemento html a través de la pantalla usando requestAnimationFrame en la clase javascript

Por favor, tengan paciencia conmigo... Estoy aprendiendo a usar requestAnimationFrame para animaciones simples (por ejemplo: mover la pelota por la pantalla). Obtuve un ejemplo de trabajo usando funciones javscript. Ahora quiero usar la clase y los métodos de JavaScript para hacer lo mismo. Estoy haciendo esto porque a continuación quiero instanciar la clase varias veces, correr y controlar varias bolas que se mueven por la pantalla. Problemas:

  1. No estoy seguro si la sintaxis de mi clase es ideal. (Es un poco de un truco)

  2. requestAnimationFrame está ejecutando la animación demasiado rápido.

    ...animationRequest = window.requestAnimationFrame(this.moveBall());

Funciona como funciones de javascript https://jsfiddle.net/tjqbpv1e/

pero va demasiado rápido (o nada) cuando creo una clase. https://jsfiddle.net/68vys0hL/

about 3 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Tiene algunas variables no declaradas y adicionales, además de perder this , pero aparte de eso, parece una clase decente. La razón por la que no hay animación (también conocida como demasiado rápida) es porque está ejecutando this.moveBall() directamente en lugar de enviar this.moveBall como devolución de llamada a requestAnimationFrame . Además, no tienes nada que controle la velocidad en absoluto. Con requestAnimationFrame , debe verificar cuánto tiempo pasó desde la devolución de llamada anterior, como lo hizo en el código original como variable diff no utilizada.

Hablando de devoluciones de llamada, es un poco complicado enviar devoluciones de llamada con this alcance, muy a menudo es posible que necesite .bind(this) a la función de devolución de llamada:

 class AnimatedCircle { output; animated_circle; number; xpos; multiplier; animationRequest; myContainer; screen_width; prevTime; speed; constructor(val_1, val_2) { this.val_1 = val_1; // example of passing values this.val_2 = val_2; this.animated_circle = document.getElementById('animated_circle'); this.number = 0; this.xpos = 1; // new horizontal position this.multiplier = 1; this.animationRequest = null; this.myContainer = document.querySelector('#container'); this.screen_width = this.myContainer.offsetWidth - 50; this.prevTime = 0; this.speed = Math.random() * 10; //random speed } // test method test_method() { return `${this.val_1} says hello.`; } moveBall(time) { this.animationRequest = window.requestAnimationFrame(this.moveBall.bind(this)); if (time - this.prevTime < this.speed) //speed control return; this.prevTime = time; // if on screen console.log("got here!"); if (this.xpos < this.screen_width && this.xpos > 0) { this.number++; } else { // when we get to end of screen , then exit function return; } this.xpos = this.xpos + (5); // horizontal position // move on X-Axis this.animated_circle.style.transform = `translateX(${this.xpos}px)`; console.log("loop"); } } // instantiate class myAnimatedCircle = new AnimatedCircle('Bob', 'Level22'); // call method console.log(myAnimatedCircle.test_method()); console.log(myAnimatedCircle.moveBall());
 #container{ border: 1px solid gray; background-color: rgb(236, 225, 225); height:60px; padding:0px; } #animated_circle{ height: 35px; width: 35px; margin:10px; background-color: rgb(103, 74, 184); border-radius: 50%; display: inline-block; }
 <p id="output"></p> <div id="container" > <p id="animated_circle"></p> </div>

about 3 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Nuestro proceso Comercial
Legal
Términos y condiciones Política de privacidad
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recomiéndame algunas ofertas
Necesito ayuda