Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   setTimeout и др. (https://javascript.ru/forum/misc/2763-settimeout-i-dr.html)

Destrifer 09.02.2009 00:11

setTimeout и др.
 
Имеем функцию которая передвигает меню на значение z, однако двигается оно очень медленно :(. Уменьшение значения setTimeout не помагает, а увеличениt шага (приращения z), создает проблемы с точным позицированием.
Вроде крутится вариант в голове позицировать по одному приращению, а смещать по другому, но никак не получается сделать правильно.
function my3(){
if(z < -s){clearTimeout(a);return;}
z -= 1;
a=setTimeout('my3()',20);
document.getElementById("menu").style.top = z + 'px';


p.s. s - это вичисленная высота меню, для определения конца прокрутки.

Zibba 09.02.2009 00:39

Основы программной анимации на JavaScript

Андрей Параничев 09.02.2009 00:40

Я недавно писал об этом в своем блоге. Почитайте, что будет непонятно - спрашивайте.

Destrifer 09.02.2009 10:41

Спасибо, вроде, то что нужно.

Destrifer 09.02.2009 16:05

Прочитал. Очень интересный материал. Только ведь у меня остановка не по времени идет, по координатам. Т.е. в данном контексте, ничего нельзя порекомендовать, надо переписовать функцию?

Андрей Параничев 09.02.2009 17:11

Destrifer,
В примерах статьи остановка тоже по координатам (когда 500, то останавливается), а время это только скорость анимации.

Я не очень понял вашу задачу, если честно. Вам нужно просто передвинуть меню на определенное значение?

Destrifer 09.02.2009 21:30

Андрей Параничев,
Вообщем да, пример можно адаптировать, без проблем. Вопрос лишь, можно ли решить мою задачу в данном контексте (моего кода)?
Все просто:
function my3(){
if(z <= -s){clearTimeout(a);return;}
z -= 1;
a=setTimeout('my3()',20);
document.getElementById("menu").style.top = z + 'px';
}

function my4(){
if(z >= 30){clearTimeout(b);return;}
z += 1;
b=setTimeout('my4()',20);
document.getElementById("menu").style.top = z + 'px';
}

Одна функция двигает меню вверх (my3), другая вниз (my4). Высота меню выше высоты страницы, поэтому она вычисляется (s), и как только z достигает порогового значения, меню останавливается. Проблема в том, что при большом шаге (z), когда происходит сранение z и s, меню может передвинутся несколько дальше, чем требуется (z перескакивает через пороговое значение s). Если уменьшить z, проблема исчезает, но скорость перемещения меню становится крайне мала. А дальнейшее уменьшение значения setTimeout, не помогает или исчезает плавность анимации.
p.s. извините, если не понятно описал, как смог :). Вообщем проблема-то не вселенского характера. Перепешу код и дело с концом. Просто хотел добраться до истины :).

Kolyaj 09.02.2009 21:43

Вместо z -= 1;
z = Math.max(z - 10, -s);
Не будет перескакивать

Destrifer 09.02.2009 22:02

Цитата:

Сообщение от Kolyaj (Сообщение 12388)
Вместо z -= 1;
z = Math.max(z - 10, -s);
Не будет перескакивать

Оригинально, спасибо, работает.
Андрей Параничев - Вам тоже спасибо за внимание к моей проблеме.

Destrifer 10.02.2009 19:29

Добавление
 
Кстати на это:
Цитата:

Сообщение от Kolyaj (Сообщение 12388)
Вместо z -= 1;
z = Math.max(z - 10, -s);
Не будет перескакивать

вдруг стал ругаться ie, ставлю обратно z--, работает.
JS вдруг стал кроссбраузерным :)?


Часовой пояс GMT +3, время: 05:58.