Для обновленного вопроса:
Во-первых, вот рабочая демонстрация с желаемым поведением .Здесь мы настраиваем скорость на основе количества, необходимого для перемещения, потому что speed
- это не точное описание, это длительность , перемещение на более короткое расстояние за ту же продолжительность означает более медленноедвигаться, поэтому нам нужно масштабировать продолжительность с расстоянием, которое нам нужно переместить.Для перемещения назад это выглядит следующим образом:
var oldLeft = ul.offset().left;
ul.animate({left: 0}, -oldLeft * speed, 'linear');
Поскольку <ul>
прокручивается с отрицательной левой позицией, нам нужно переместить обратное число этих пикселей, чтобы вернуться к началу, поэтому мы 'используется -oldLeft
(это текущая left
позиция).
Для прямого направления очень похожий подход:
var newLeft = divWidth - ulWidth,
oldLeft = ul.offset().left;
ul.animate({left: newLeft + 'px'}, (-newLeft + oldLeft) * speed, 'linear');
Получается новый left
свойство, конец которого равен ширине <ul>
минус ширина <div>
, в которой он находится. Затем мы вычитаем (это отрицательно, так что добавляем) это из текущей позиции left
(также отрицательно, поэтому поменяйте местами).
Этот подход дает вашей переменной speed
совершенно новое значение, теперь она означает "миллисекунд на пиксель" вместо duration , как это было раньше, что кажетсябыть тем, что вы после.Другая оптимизация использует тот кешированный селектор <ul>
, который у вас уже был, что делает все немного быстрее / чище в целом.
Для исходного вопроса:
Сохраняйте это простымтолько половина времени на половину расстояния, например:
$(function() {
$('#a').animate({left: '250px'}, 500, 'linear');
$('#b').animate({left: '500px'}, 1000, 'linear');
});
Вы можете попробовать демо здесь