1) Вы должны указать единицу сверху, то есть: x.style.top = i +"px"
2) Ваша функция не будет анимироваться, вместо того, чтобы использовать setInterval или setTimeout
Как вы и просили, пример. Я бы не стал так делать для одного из моих проектов, но я сохранил вашу функцию, чтобы вы лучше познакомились с кодом.
Я использовал setTimeout вместо setInterval, потому что setInterval должен быть очищен, когда он не нужен, а setTimeout запускается только один раз:
var Toggle = (function() { // use scope to define up/down
var up = true;
return function(element) {
var top = parseInt(element.style.top, 10); // element.offsetTop ?
if ( !top ) {
top = 0;
}
if (up) {
if (element.offsetTop < 0) { // if we are not at 0 and want to get up
element.style.top = (top+1) + "px";
setTimeout(function() { Toggle(element); }, 10); // recall the function in 10 ms
} else { // we change up value
up = !up;
}
}
else {
if (element.offsetTop > -50) {
element.style.top = (top-1) + "px";
setTimeout(function() { Toggle(element); }, 10); // recall the function in 10 ms
} else {
up=!up;
}
}
}
})();