Показать сообщение отдельно
  #93 (permalink)  
Старый 26.12.2010, 13:33
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

ну так у exec такая большая карма, потому что всем влом его код читать а если серьезно, то где там проблема? Его скрипт упрощенно работает так:
setTimeout(function(){
    <сдвигаем квадрат>
    setTimeout(arguments.callee, 13);
}, 13)

по такой же схеме работает анимация в jQuery. А чтобы не осталось никаких сомнений я добавил возможность остановить квадрат:
<div id='foo' style='width: 50px; height: 50px; position: absolute; background: #555555'>
</div>

<script type='text/javascript'>
window.onload = function () {
function delta(progress) {
     function d(progress) {
        for(var a = 0, b = 1, result; 1; a += b, b /= 2) {
           if (progress >= (7 - 4 * a) / 11)
               return -Math.pow((11 - 6 * a - 11 * progress) / 4, 2) + Math.pow(b, 2);
        }
     }
     return 1 - d(1 - progress);
}

	document.getElementById("foo").onclick = function () {
		var E = this;
		var timerId;
		this.onclick = function(){
			clearTimeout( timerId );   // !!! останавливаем квадрат
		};
		var go = function( toTop, from, to ){
			var start = new Date().getTime(),
			callee = arguments.callee;
			timerId = setTimeout(function () {
				var progress = (new Date().getTime() - start) / 1000;
				E.style.top = ((to - from) * (toTop ? progress : delta(progress)) + from) + "px";
				if (progress < 1)
					timerId = setTimeout(arguments.callee, 13);
				else
					callee(!toTop, toTop ? 0 : 180, toTop ? 180 : 0);
			}, 13);
		};
		go(false, 0, 180);
	};
};
</script>
Ответить с цитированием