Как использовать requestAnimationFrame

335
28 августа 2021, 22:00

Я изучаю requestAnimationFrame и запускать функцию отрисовки у меня получается. Я не понимаю, как управлять тем, на какой стадии находится отрисованный элемент.
Я написал, что шарик идёт вниз на 100px за секунду. Но при достижении 100px при запуске следующей анимации, я хотел бы, чтобы запустилась другая анимация, при которой шарик шёл бы обратно.
Как в хорошем коде управляет анимацией в requestAnimationFrame?

var el = document.getElementById("first"); 
var elem = document.getElementById("second"); 
 
function animate({timing, draw, duration}) { 
 
	let start = performance.now(); 
 
	requestAnimationFrame(function animate(time) { 
		let timeFraction = (time - start) / duration; 
		if (timeFraction > 1) { 
			timeFraction = 1; 
		} 
		let progress = timing(timeFraction); 
		draw(progress); 
		if (timeFraction < 1) { 
			requestAnimationFrame(animate); 
		} 
	}); 
} 
 
window.addEventListener('click', () => { 
	animate({ 
        duration: 1000, 
        timing: function(timeFraction) { 
         	return timeFraction; 
        }, 
        draw: function(progress) { 
        	if (elem.style.top == (100 + 'px') || num == 1) { 
        		var num = 1; 
        		elem.style.top = progress * 0 + 'px'; 
        	} else { 
        		elem.style.top = progress * 100 + 'px'; 
        	} 
        	 
        } 
     }); 
});
body { 
	margin: 0; 
} 
 
#first, #second { 
	width: 100px; 
	height: 100px; 
	position: relative; 
	border-radius: 50%; 
	background-color: red; 
} 
 
#second { 
	background-color: green; 
}
<div id="first"></div> 
<div id="second"></div>

Answer 1

Хорошая анимация - это чистая функция от времени, в каждом кадре Вы однозначно знаете сколько прошло времени и соответственно однозначно можете определить где должен находится объект...

animation.innerHTML = Array(30).fill(0).map((e, i) => { 
  return `<div style='background-color:hsl(${i*12},66%,66%)'></div>`; 
}).join(''); 
 
let circles = document.querySelectorAll('#animation div'); 
 
requestAnimationFrame(draw) 
 
function draw(t)  { 
  requestAnimationFrame(draw) 
  circles.forEach((c,i) => { 
    c.style.top = 55 + 50*(Math.sin(t/300-i*100)) + "px"; 
    c.style.transform = `scale(${0.7+Math.sin(t/300-i*33)*0.3})`; 
    c.style.left = i*21+5 + Math.cos(t/255-i)*5 + "px"; 
  })   
}
#animation div { 
  border-radius: 50%; 
  position: absolute; 
  width: 20px; 
  height: 20px; 
  top: 0; 
}
<div id=animation><div>

READ ALSO
Перебор объекта

Перебор объекта

Есть матрица которая представлена объектом объектовНапример такая:

99
Как проверить флажок если он не нажат

Как проверить флажок если он не нажат

Я сделала мини тест на js, на язык не обращайте внимания, в value находятся баллы, если правильно угадал то добавляется 1 балл

292
ошибка Uncaught SyntaxError: Unexpected token &#39;delete&#39;

ошибка Uncaught SyntaxError: Unexpected token 'delete'

Мне нужно сделать функцию, которая бы удаляла из верстки элементы корзиныДля этого пишу такой код:

181
Как получить доступ к содержимому iframe?

Как получить доступ к содержимому iframe?

На странице имеется iframe, находящийся в одной папке вместе с родителемВнутри iframe имеется поле для ввода

98