Почему медленная анимация jQuery изменчивая?

Мне сложно найти эту проблему, потому что большинство вещей, которые я могу найти, - это анимации, которые должны быть быстрыми, но действуют медленно. Мой вопрос касается анимации, что я хочу иметь длительный срок, но все равно быть гладким.

Я создал этот jsfiddle, чтобы продемонстрировать проблему: http://jsfiddle.net/93Bqx/

Я пытаюсь сделать элемент медленно перемещаться в другую позицию с течением времени. Но анимация очень изменчив.

В принципе, это сводится к чему-то вроде этого:

$elem.animate({
        left: x,
        top: y
}, someLargeNumber);

Мне интересно, если проблема в том, что анимация настолько медленная, что каждый шаг меньше пикселя, и поэтому он округляет их до 0 или 1, заставляя, кажется, сбросить кадры, а затем переместить все сразу. Но я не знаю, как это проверить или исправить.

Есть ли лучший способ делать медленные анимации, чтобы они были гладкими? У меня был подобный, созданный с помощью CSS3 и переведенный (x, y), который был гладким, но, к сожалению, мне нужна большая гибкость, чем я думаю, что могу получить с помощью CSS.

Ответ 1

Он не намного более плавный, даже используя переход CSS.

Я добавил Transit jQuery plugin, чтобы проверить переход CSS, и он выглядит почти так же.

Ваш код с незначительными исправлениями: http://jsfiddle.net/thirtydot/93Bqx/5/

Тот же код, но с Transit добавил: http://jsfiddle.net/thirtydot/93Bqx/6/.

Я думаю, что это ограничение того, что (большинство?) браузеров не выполняют подпиксельную визуализацию. Как вы уже упоминали, элементы x и y элемента округляются после каждого шага анимации, и это округление, которое вызывает неприглядный эффект "смещения".

Версия перехода CSS выглядит заметно лучше для менее патологических тестовых случаев. Читайте это для получения дополнительной информации: http://www.paulirish.com/2012/why-moving-elements-with-translate-is-better-than-posabs-topleft/

Ответ 2

Я предполагаю, что это неизбежная сделка с программной анимацией. Возможно, попробуйте фреймворк, специализированный в анимации, например:

http://www.greensock.com/gsap-js/

но лучше всего адаптировать анимацию к CSS.

Ответ 3

Я думаю, что это имеет какое-то отношение к тому, как часто вы перемещаете элемент. Например, если вы перемещаете объект один раз в секунду, это будет казаться изменчивым. Попробуйте уменьшить время между каждым движением, а также уменьшить расстояние между каждым движением. См. http://jsfiddle.net/2K9xP/ для примера.

Итак, у нас есть...

var duration = Math.round(10 * distance);

вместо...

var duration = Math.round(1000 * distance);