Создание анимации
Как через JS создать анимацию движений объектом , допустим картинкой , и чтобы анимация длилась 5 секунд?
|
JQuery animation посмотрите
|
|
Грубый пример на коленке, это если без jquery.
Тестировал в хром, opera, ie9 Ссылка на песочницу или запустите пример ниже.
<!DOCTYPE HTML>
<html>
<head> </head>
<body>
<div id="test" style="position:absolute;left:100px;background-color:yellow;width:70px;height:70px;opacity:0.1;">привет</div>
<div id="test2" style="position:absolute;left:500px;background-color:red;width:70px;height:70px;opacity:0.1;">привет</div>
<script>
//для начала обьявим функцию которая будет выполнять анимацию
function animate(style){
var el=style["el"],
easing=style["easing"]||"line",
duration=style["duration"]||1000,
//получим расчитанный стиль
// currentStyle используется в старых ie, для поддержки старых IE этого конечно мало :)
сomputedStyle=window.getComputedStyle?window.getComputedStyle(el, null):el.currentStyle,
//время до которого анимацию нужно успеть выполнить
finalTime=new Date().getTime()+duration,
//список анимируемых свойств
prop={},
// единицы измерения
ob={
left:"px",
right:"px",
top:"px",
bottom:"px",
width:"px",
height:"px"
},
// закон изменения параметра в зависимости от положения анимации
// 3 штучки дя примера
delta={
'line':function(progress){
return progress;
},
'circ':function(progress){
return 1 - Math.sin(Math.acos(progress))
},
'sine':function (progress) {
return 1 - Math.sin((1 - progress) * Math.PI/2);
}
},
//счётчик для циклов
i=0;
//так как время и ссылку на анимируемы обьект передали в style, то нужно эти поля удалить
delete style["time"];
delete style["el"];
delete style["easing"];
//запомним начальные значения всех свойств
//вообще можно было бы использвать сomputedStyle напрямую, но мне стрёмно парсить числа на каждой итерации
// поэтому значения я подгатавливаю в этом цикле заранее
for (i in style){
prop[i]= parseFloat( сomputedStyle[i] )||0;
}
//Цикл анимации
function f(){
//рассчитаем время прошедшее с начала анимации
var now=duration-(finalTime- (new Date().getTime()) ),
progress=now/duration,
s=0;
// защитимся от случае когда прогресс>100% , в этом случае просто установим 100% то есть 1.
if (progress>1) progress=1;
// анимируем каждое свойство
for (i in style){
s=((style[i]-prop[i]) * delta[easing](progress) )+prop[i];
el.style[i]= s+ ( ob[i] || "" );
}
if (progress<1) setTimeout(f,16);
}
//запуск первой итераци цикла
f();
}
// Пример использования получившейся функции
animate({
el:document.getElementById("test"),
left:500,
top:50,
opacity:1,
duration:5000,
//easing:"circ"
});
// Пример использования получившейся функции
animate({
el:document.getElementById("test2"),
left:100,
top:50,
opacity:1,
duration:5000,
//easing:"circ"
});
</script>
</body>
</html>
|
Цитата:
интервал - т.к. время между кадрами (тонкая разница между интервалом и таймаутом) время - ~16мс, время между кадрами при ФПС = 60 |
раньше при переходе на другую вкладку setInterval продолжал работать, при возвращении на вкладку срабатывали все накопившееся события. Выглядило это как ускорившаяся анимация.
Я не вкурсе просто, сейчас что-то изменилось ? Можно ещё RequestAnimationFrame использовать, а в случае его отсутствия делать через setTimeout но пример и без того перегружен по моему. Я сам непонял нафиг я эту анимацию писать начал, просто чото написать хотелось наверно )))) В баню всё, я спать :)
// кроссбраузерны requestAnimationFrame с поддержкой старого говна
(function() {
var lastTime = 0;
var vendors = ['ms', 'moz', 'webkit', 'o'];
//если requestAnimationFrame отсутствует то поищим requestAnimationFrame с префиксами.
for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
window.cancelAnimationFrame =
window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame'];
}
//если requestAnimationFrame отсутствует то с имитируем его при помощи timeout
if (!window.requestAnimationFrame)
window.requestAnimationFrame = function(callback, element) {
var currTime = new Date().getTime();
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
var id = window.setTimeout(function() { callback(currTime + timeToCall); },
timeToCall);
lastTime = currTime + timeToCall;
return id;
};
// если cancelAnimationFrame отсутствует то будем отменять setTimeout
if (!window.cancelAnimationFrame)
window.cancelAnimationFrame = function(id) {
clearTimeout(id);
};
}());
|
| Часовой пояс GMT +3, время: 20:05. |