Я думаю, что проблема в следующей части if (isOn)
ветви:
jq_base.animate(
{ height: baseStartH },
{
duration: 300,
queue: false,
step: function (now)
{
if ( now <= ( baseStartH + 10 ) )
jq_base.animate( { top: baseStartTop }, 800 );
}
}
);
В частности, в рамках функции step
этого конкретного вызова animate()
вы запускаете другую анимацию с довольно большой продолжительностью (800 мс), и потому что она находится в step
, даже если вы запускаете тест if несколько анимаций с такой длительностью.
Это означает, что, хотя процесс достигает точки, в которой он выглядит завершенным, потому что все переместилось в свою конечную позицию, за кулисами эти дополнительные анимации не закончились и поэтому не реагируют должным образом. на последующие клики. Если вы переместите эту 800-миллиметровую анимацию из функции step
и просто вставите ее потом, то, похоже, все будет работать более плавно. (По крайней мере, в Chrome это выглядит намного лучше: как я уже говорил в моем комментарии выше, у меня нет FF на этом компьютере, поэтому я не могу это проверить.)
Вот демонстрация с изменениями, о которых я говорю: http://jsfiddle.net/fnswz/1/
Возможно, вы захотите установить флаг animationRunning
при запуске анимации, а затем сбросить ее с помощью обратного вызова animate()
complete
, чтобы вы могли проверить флаг и игнорировать щелчки, пока текущая анимация не закончится, но только изменение выше сделало для меня большое улучшение.
(Кстати, почему вы используете document.onclick = ...
, когда используете jQuery?)