2013-08-01 4 views
12

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

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

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

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

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

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

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

+2

хорошо читать по теме: http://www.paulirish.com/2012/why-moving-elements-with-translate-is-better-than-posabs-topleft/ – Yoshi

+0

@ Йоши благодарю вас!То, что мне было интересно узнать. Можете ли вы опубликовать это в качестве ответа, чтобы я мог его принять? –

ответ

5

Это не очень гладко, даже с помощью перехода 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/

+5

Я никогда не слышал об этом; Мне нужно будет изучить этот плагин. Спасибо за предложение! Я просмотрел документы и изменил их с анимирования верхних и нижних свойств непосредственно на использование его собственного x/y, и он намного более плавный (но странно немного шаткий). Http://jsfiddle.net/XSEd8/ –

+0

Обновление: I теперь это работает в моем реальном коде, и это здорово. +1 для jquery.transit. Единственная проблема, с которой я столкнулся, заключалась в том, что не было способа остановить переходы, но я нашел [вилку базы кода] (https://github.com/tblasv/jquery.transit), которая добавляет эту функцию. –

+0

Полезно знать. Я думаю, что, примерно, чем медленнее компьютер, тем больше улучшается версия перехода CSS. Кроме того, я не думаю, что вы должны принять мой ответ (если вы планируете) только пока. Дайте ему немного времени и посмотрите, подходит ли лучший ответ. – thirtydot

7

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

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

но адаптация анимации CSS будет лучше.

+3

Да, вот вилка, которая использует GSAP GreenSock с преобразованиями вместо top/left: http://jsfiddle.net/2LpgY/1/. Это намного более гладко в webkit, но Firefox использует различные методы сглаживания, которые, похоже, не подходят субпиксельная рендеринг. Так что в некоторых случаях это верно. Я также утверждаю, что анимация CSS не будет лучше, особенно если вам нужен жесткий контроль - см. Http://www.greensock.com/why-gsap/ – Jack

0

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

Итак, мы имеем ...

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

вместо ...

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

Дело в том, что объект движется медленно. Эта коробка масштабируется, как на экстазе. – thirtydot

+1

Это больше, чтобы продемонстрировать тот факт, что он может беспрепятственно перемещаться, если количество, которое он перемещает за кадр, является достаточно высоким значением. Перемещение объекта 1 пиксель каждую секунду будет казаться изменчивым, потому что наши глаза видят больше деталей (что-то делать с фреймерами, я думаю). –

+0

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

Смежные вопросы