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 - это вичисленная высота меню, для определения конца прокрутки. |
|
Я недавно писал об этом в своем блоге. Почитайте, что будет непонятно - спрашивайте.
|
Спасибо, вроде, то что нужно.
|
Прочитал. Очень интересный материал. Только ведь у меня остановка не по времени идет, по координатам. Т.е. в данном контексте, ничего нельзя порекомендовать, надо переписовать функцию?
|
Destrifer,
В примерах статьи остановка тоже по координатам (когда 500, то останавливается), а время это только скорость анимации. Я не очень понял вашу задачу, если честно. Вам нужно просто передвинуть меню на определенное значение? |
Андрей Параничев,
Вообщем да, пример можно адаптировать, без проблем. Вопрос лишь, можно ли решить мою задачу в данном контексте (моего кода)? Все просто: 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. извините, если не понятно описал, как смог :). Вообщем проблема-то не вселенского характера. Перепешу код и дело с концом. Просто хотел добраться до истины :). |
Вместо z -= 1;
z = Math.max(z - 10, -s);Не будет перескакивать |
Цитата:
Андрей Параничев - Вам тоже спасибо за внимание к моей проблеме. |
Добавление
Кстати на это:
Цитата:
JS вдруг стал кроссбраузерным :)? |
Эммм, ну каг бэ в разных браузерах, разная реализация интерпритаторов JS, но это тут думаю не при чем.
|
Destrifer,
Ругается на эту строчку, или выдает NaN? И что есть переменная s? |
Андрей Параничев
s - это вычисленная высота меню, для определения конца прокрутки, посмотрите, в предыдущих постах все описано. Ругается, правда, на последнюю строчку: function my3(){ a=setTimeout('my3()',20); if(z <= -s){clearTimeout(a);return;} z = Math.max(z - 5, -s); document.getElementById("menu").style.top = z + 'px'; } Пишет "недопустимый аргумент". Однако при замене "z = Math.max(z - 5, -s);" на "z--" все нормально. |
Destrifer,
function my3(){ //a=setTimeout('my3()',20); //if(z <= -s){clearTimeout(a);return;} z = Math.max(z - 5, -s); alert(z); //document.getElementById("menu").style.top = z + 'px'; } Так выдает NaN? Каким образом "вычислена" высота меню? Может у вас берется значение из стилей, вместе с размерностью? |
Андрей Параничев,
да, есть NaN. А s выдает как undefined. вот формула s:s=document.getElementById('menu').clientHeight-(window.innerHeight-document.getElementById('cont').clientHeight). Стоит строгий доктайп. p.s. cont - это высота кнопки |
Похоже все связано с разницей в командах определения высоты ie vs other... Поменял, в ie теперь работает, в остальных - нет :).
p.s. вообщем работает, правда без доктайпа)) Андрей Параничев - спасибо за помощь, вроде разобрался. |
Часовой пояс GMT +3, время: 05:51. |