Анимация ускорения вращения при скролле
Всем доброго времени!
Задача: Есть 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, время: 00:35. |