Оптимизация jQuery.animate

Дата публикации: 07.02.2012

Задача

Анимировать несколько объектов одновременно. К примеру нужно переместить несколько объектов, а по окончанию движения изменить им цвет. Для этого используем jQuery.animate.

Решение фиговое

$("#kv2").animate({left: 550, width: 100},1000);
$("#kv3").animate({top: 450, width: 100},1000);
$("#kv4").animate({left: 550, top: 450, width: 100},1000);
	
setTimeout(function() {$("div").css("background","green");}, 1001);

Проблема данного кода заключается в том, что каждый animate запускает свой таймер со своими перерисовками экрана. Чтобы число перерисовок сократить используем один animate и его функцию step. Функция step будет выполняться на каждом шаге анимации. Дополнительно воспользуемся функцией complete, которая срабоатет один раз по завершению анимации:

$("#kv2").animate(
		{
			/*
				на значение данного параметра будут опираться вычисления для остальных объектов и свойств.
				выбираем с которым проще работать и меньше математических действий
			*/
			left: 550 
		},
		{
			duration: 1000,
			step: function(now, fx)
			{
				$("#kv2").css({"width": 50+(now-250)/6+"px"}); // вычисляем ширину данного блока в зависимости от положения
				$("#kv3").css({"top":now-100+"px", "width": 50+(now-250)/6+"px"}); // вычисляем top этого блока относительно положения left у #kv2
				$("#kv4").css({"top": now-100+"px", "left": now+"px", "width": 50+(now-250)/6+"px"}); // вычисляем позицию блока отностельно left у #kv2
			},
			complete: function()
			{
				$("div").css("background","green");
			}
		}
		);

Посмотреть в живую. Отследить эффект можно с помощью Хромовского файрбага, вкладки «Timeline».

Чем сложнее анимация, больше количество объектов участвует в ней и дольше длиться по времени, тем больше прирост производительности даст такой подход.

Подробней о функции step

Она принимает два парамтера: now и fx.

Now — значение анимированного свойства в данный момент (на данном шаге анимации). При чем следует заметить, что если анимированных свойств несколько например так:

$("#kv2").animate({left: 550, width: 100},
[...]

тогда now на каждом шаге будет возврщать два значения: left и width. Выделить нужное из них я не нашел способа. Поэтому анимирую одно свойства, остальные меняю в функции step.

Параметр fx возвращает несколько значений, которые могут пригодиться:

Атрибут Тип Опиcание
fx.elem DOM элемент анимируемый элемент
fx.start number начальное значение анимируемого свойства
fx.end number конечное значение анимируемого свойства
fx.prop String свойство, которое меняется
fx.unit String единицы измерения изменяемого свойства
fx.pos Number коэффициент со значением в прделах 0.0 — 1.0. Чем ближе к концу анимации, тем значение ближе к 1.
fx.startTime Number время когда анимация стартовала
fx.options.duration Number длительность всей анимации

Материалы

По теме

Показать комментарии