Анимация ускорения вращения при скролле
Всем доброго времени!
Задача: Есть svg-геометрические фигуры, которые имеют равномерное вращение по часовой (скорость V1). При скролле вверх или вниз они должны ускорять свое вращение (скорость V2). Главным критерием является плавность и неторможение эффекта, иначе в нем теряется смысл. Вот собранный стенд: http://proudly.ru/febotelecom/#bl-services Проблема сейчас в том, что анимация по советам была сделана через requestAnimationFrame, то есть девайс сам решает когда ему удобно перерисовать анимацию, но но мобайл устройствах при свайпе по-видимости мощи не хватает, и анимация вместо ускорения, наоборот, подвисает. Есть ли какие-то рецепты от опытных профессоров js анимаций? :) Вот код:
var $services = $('#bl-services');
$services.data('currRot', 0);
var rotationV1 = 20;
var rotationV2 = 100;
var rotationTid = false;
function servicesRotationCycle() {
var currTs = Date.now();
var dt = (currTs - $services.data('startTs')) / 1000;
var rot = $services.data('startRot') + $services.data('speed') * dt;
// debug
//console.log('speed:', $services.data('speed'), 'rotation:', $services.data('startRot'), rot);
$services.data('currRot', rot);
$('#figure1').rotate({animateTo: Math.round(rot)});
$('#figure2').rotate({animateTo: Math.round(rot)});
$('#figure4').rotate({animateTo: Math.round(rot)});
requestAnimationFrame(servicesRotationCycle);
}
function servicesRotationRegisterPoint(speed) {
$services.data({
'startTs': Date.now(),
'startRot': $services.data('currRot'),
'speed': speed,
});
}
scrollCallbacks.push(function() {
if (rotationTid) {
clearTimeout(rotationTid);
} else {
servicesRotationRegisterPoint(rotationV2);
}
rotationTid = setTimeout(function() {
servicesRotationRegisterPoint(rotationV1);
rotationTid = false;
}, 50);
});
setTimeout(function() {
servicesRotationRegisterPoint(rotationV1);
requestAnimationFrame(servicesRotationCycle);
}, 100);
Да, еще: используется Jquery.rotate (https://jqueryrotate.com/) |
43 - 46 строка.
Мне хочется плакать, ну или злобно юморить тыц >> Проблема сейчас в том, что анимация по советам была сделана через requestAnimationFrame Это утверждение не верно. У тебя с определенными интервалами (43 строка) создаются задания т.е. функции которые должны быть вызваны при следующей отрисовке фрэйма. Пока таких заданий(функций) на отрисовку 20-150 браузер успевает их выполнить каждый кадр. а когда становится около тысячи появляются заметные подтормаживания. Для анимирования достаточно будет только одного вызова анимирующей функции для каждого кадра. Такие анимации гораздо лучше делать через CSS анимации. А со стороны JS просто изменять классы у элемента страницы для ускорения или замедления. Древний примерчик использования requestAnimationFrame |
Цитата:
Нет, до такого я еще, конечно не дошел :) На 43-46 всего лишь setTimeout(..., 100), был сделан для того, чтобы слегка отсрочить инициализацию. Хотя, признаться, я уже забыл зачем это было сделано. По поводу CSS-анимаций думал и даже делал стенд с ней, но почему-то отмел этот вариант. Обязательно попробую его воспроизвести для сравнения. |
@MallSerg
Цитата:
http://proudly.ru/febotelecom/ В Css:
@mixin infinite-rotation($speed: $animation-speed) {
-webkit-animation-name: rotation180;
-webkit-animation-duration: $speed;
-webkit-animation-iteration-count: infinite;
-webkit-animation-timing-function: linear;
-moz-animation-name: rotation;
-moz-animation-duration: $speed;
-moz-animation-iteration-count: infinite;
-moz-animation-timing-function: linear;
-o-animation-name: rotation180;
-o-animation-duration: $speed;
-o-animation-iteration-count: infinite;
-o-animation-timing-function: linear;
animation-name: rotation180;
animation-duration: $speed;
animation-iteration-count: infinite;
animation-timing-function: linear;
}
@-webkit-keyframes rotation180 { to { -webkit-transform: rotate(180deg); }}
@-moz-keyframes rotation180 { to { -moz-transform: rotate(180deg); }}
@-ms-keyframes rotation180 { to { -ms-transform: rotate(180deg); }}
@-o-keyframes rotation360 { to { -o-transform: rotate(180deg); }}
@keyframes rotation180 { to { transform: rotate(180deg); }}
@mixin animation-duration($speed: $animation-speed) {
-webkit-animation-duration: $speed;
-moz-animation-duration: $speed;
-o-animation-duration: $speed;
animation-duration: $speed;
}
#figure1 {
position: absolute;
top: -18vw;
right: -30.8vw;
width: 58.343265792610250297973778307509vw;
height: 59.356376638855780691299165673421vw;
display: block;
background: url('../images/_figure1.svg') no-repeat;
background-size: contain;
@include infinite-rotation(20000ms);
&.accelerated {
@include animation-duration(5000ms);
}
}
Далее в скрипте при прокрутке просто навешивается класс accelerated , и по таймауту убирается при остановке прокрутки. Но почему-то при изменении свойства animation-duration почему-то анимация начинается сначала (или с какой-то альтернативной точки, не пойму). Это лечится? |
css transition
|
Цитата:
http://proudly.ru/febotelecom/ |
Спасибо за подсказку, тоже ни как не могла разобраться, весьма благодарна, поделюсь статьей выигрышные автоматы и с вами в свободное время помогает расслабиться и получить удовольствие и дополнительный доход.
|
| Часовой пояс GMT +3, время: 20:50. |