Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Проблемы с анимацией (https://javascript.ru/forum/misc/13673-problemy-s-animaciejj.html)

vyazovetskova 08.12.2010 23:04

Проблемы с анимацией
 
Здравствуйте! Я в js новичок, та ктчо буду очень благодарна, если кто-то мне поможет. У меня есть следующая задачка: Есть картинка, которая положена в div. Этот div в бесконечном цикле сначала поднимается вверх на сотню пикселей, потом 'падает ' вниз на прежнее место. По клику на этот див, где бы он ни был, он должен 'упасть', т.е. вернуться в исходную позицию.
Бесконечное 'карабканье и падение' я сделала так:
function goes_up(){
$('#idl').animate({top:'-=180'},40000);//подъем
$('#id').animate({top:'+=180'},1000);//падение


};
setInterval(goes_up, 100);//бесконечный подъем и падение

Но когда я стала добавлять часть с кликом, то возникли проблемы (пыталась сделать через animate, но не вышло). Как мне можно решить эту проблему?

exec 09.12.2010 05:56

(function () {
	var callee = arguments.callee;
	$("#id").animate({
		top: "+=180px"
	}, 3000, function () {
		$(this).animate({
			top: "-=180px"
		}, 3000, callee);
	});
})();

vyazovetskova 09.12.2010 10:07

Цитата:

Сообщение от exec (Сообщение 82931)
(function () {
	var callee = arguments.callee;
	$("#id").animate({
		top: "+=180px"
	}, 3000, function () {
		$(this).animate({
			top: "-=180px"
		}, 3000, callee);
	});
})();

Цитата:

Сообщение от exec
var callee = arguments.callee;

А что жает эта переменная?

dmitriymar 09.12.2010 10:59

ну и не упадёт никогда по клику. пока цикл не закончится опросов и других любых действий не будет

vyazovetskova 09.12.2010 11:11

так ведь нужно,чтобы упала по клику

dmitriymar 09.12.2010 11:29

делать движение через таймер.появятся промежутки во времени между вызовами по таймеру в течении которых будет работать опросы мыши и клавы. вобщем момент в том чтобы были промежутки во времени между действиями производимыми по таймеру-может быть ситуация время след выполнения по таймеру уже подошло а пред действие ещё не отработало полностью(зависит от компа клиента).да и зачем библиотеки для этого ?на чистом скрипте с тем же эффектом это всё делается

Kolyaj 09.12.2010 11:31

Цитата:

Сообщение от dmitriymar
делать движение через таймер.

А можно сделать анимацию без таймера?

dmitriymar 09.12.2010 11:36

можно. повесить всё в цикл простой

Kolyaj 09.12.2010 12:00

А вы это пробовали хоть раз сделать? Покажите нам примерчик, пожалуйста.

vyazovetskova 09.12.2010 15:02

dmitriymar,
Правильно ли я понимаю:
Делаем цикл:
Подвинем немного, проверим, кликали ли;
Если кликали, то уроним элемент; если нет, то подвинем вверх.
Так?

exec 09.12.2010 15:11

vyazovetskova, зачем вам этот бред? Анимация через цикл не делается. Чем вам мой код не угодил?

exec 09.12.2010 15:25

dmitriymar, чтобы вы не несли чушь про циклы, я покажу вам наглядный пример, как делается такая анимация на чистом JS:

<div id='foo' style='width: 50px; height: 50px; position: absolute; background: #555555'>
</div>

<script type='text/javascript'>
window.onload = function () {
	document.getElementById("foo").onclick = function () {
		var E = this;
		this.onclick = new Function;
		(function (toTop, from, to) {
			var start = new Date().getTime(),
			callee = arguments.callee;
			setTimeout(function () {
				var progress = (new Date().getTime() - start) / 1000;
				E.style.top = ((to - from) * progress + from) + "px";
				if (progress < 1)
					setTimeout(arguments.callee, 13);
				else
					callee(!toTop, toTop ? 0 : 180, toTop ? 180 : 0);
			}, 13);
		})(false, 0, 180);
	};
};
</script>

dmitriymar 09.12.2010 17:15

момент не в этом. если есть какая работа на сайте-то если во время выполнения её был клик то не будет по нему обработки. привязать к котейнеру обработчик он клик. и вызывать функцию обработки движения по таймеру(движение вверх -вниз)-но при этом следить чтобы были паузы между вызовами функции по таймеру

dmitriymar 09.12.2010 17:17

хотя я точно не знаю может обработчик онклик привязанный к контейнеру будет срабатывать во время работы функции по таймеру. но в любом случае когда он роняется таймер нужно оключить.а уронив опять включить

dmitriymar 09.12.2010 17:19

exec,
что называть анимацией-какоето движение? так без разницы движение точки будет по таймеру или в цикле зациклено-и то и другое будет называться анимацией!!!или графические изменения с помощью ассемблера или другого языка это не анимация? но в ассемблере для чтения с мыши есть прерывания. а вот js как обрабатывает посторонние действия во время выполнения.если как борландовский с++ или делфи то во время выполнения действий отслеживать не будет. и если это именно эта модель -то стоит по таймеру вызывать функцию смещения всего на пару точек. и так много раз-это в этом случае будет естественным прерыванием на опрос переферии.
Ну и наверное если выкладывается код к этой цитате-dmitriymar, чтобы вы не несли чушь про циклы, я покажу вам наглядный пример, как делается такая анимация на чистом JS:
то стоит позаботиться о том чтобы он хотябы работал.у меня в FF он не работает!!!

Kolyaj 09.12.2010 17:41

Цитата:

Сообщение от dmitriymar
или в цикле зациклено-и то и другое будет называться анимацией!!!

dmitriymar,
давайте вы уже попробуете у себя на компьютере зациклить что-нибудь, увидеть повисший браузер вместо анимации и перестанете нести ахинею.

dmitriymar 09.12.2010 17:47

браузер будет всётаки висеть(значит события с переферии обрабатываться не будут) но точка будет двигаться и это тоже называется анимацией малыш

Kolyaj 09.12.2010 17:50

Я так понимаю, до сих пор говорим о своих фантазиях. Тогда рассказываю: когда браузер висит, он ничего не перерисовывает. Без перерисовки нет анимации.

dmitriymar 09.12.2010 17:54

браузер как раз висеть не будет в этот момент-он будет выполнять цикл движения точки. а то что браузер не будет реагировать на внешние раздражители-так это говорит только об одном-у него нет естественных прерываний на опрос переферии в случае выполнения какого либо действия малыш!!

dmitriymar 09.12.2010 18:06

Kolyaj,
хотя бы читал внимательно что написано а потом коментил-уже не первый раз это вижу от одного и тогоже

vyazovetskova 09.12.2010 18:11

Решение было найден. Спасибо всем, кто помогал разобраться!

monolithed 09.12.2010 18:33

exec на всякий, поправьте свой пример, он не работает как минимум в firefox))


Внесу свои пять копеек:
<script type="text/javascript">
window.onload = function(){
    var elem = document.getElementsByTagName('div')[0], i = l = 30, j = k = 0, s = 100;
    document.getElementsByTagName('a')[0].onclick = function(){
        if(k!=0) return;
        (function(){
            if(i<=s){
                elem.style.top = ++i +'px'; j = i; k = 1;
            }
            else {
                elem.style.top = --j +'px';
                if(j<=l) i = l;
            }
            window.setTimeout(arguments.callee, 10); return false;
        })();
        return false;
    };
};
</script>

<a href="#">click<a/>
<div style="background: #0095FF; position: absolute; width: 50px; height: 50px"></div>

dmitriymar 09.12.2010 18:43

monolithed,
когда много раз кликаеш скорость увеличивается. не только в фаефоксе он не работает-он во всех не работает

exec 09.12.2010 18:46

Всё, подправил свой пример. Кстати, при повторном клике скорость не увеличивается.
А теперь выложите-ка свой рабочий код, который делает анимацию через цикл, интересно было бы посмотреть.

dmitriymar 09.12.2010 18:53

блин да вы все читать умеете в конце концов? прочти внимательно посты от меня!!!хотелось бы глянуть на атестат и убедиться что там помимо русского языка изучалась и литература,а именно то что не только в школе научили писать но и читать.хотя чегото уверен в обратном скорость увеличивается при повторных кликах у monolithed

dmitriymar 09.12.2010 18:55

exec,
не точно не преподавали чтение-человек просил чтобы при он клик контейнер ронялся

dmitriymar 09.12.2010 19:15

monolithed,
точно не роняется а просто скорость увеличивается при нажатии на клик

exec 09.12.2010 19:38

dmitriymar, что мешает поменять одно число в коде, отв. за скорость?

dmitriymar 09.12.2010 19:44

мешает то, что ни у тебя ни у monolithed не роняет контейнер.

monolithed 09.12.2010 19:50

Цитата:

Сообщение от dmitriymar
точно не роняется
не роняет контейнер.

В смысле?

Цитата:

Сообщение от dmitriymar
а просто скорость увеличивается при нажатии на клик

поправил

dmitriymar 09.12.2010 19:52

monolithed,
всё равно не роняется)))

dmitriymar 09.12.2010 19:56

Цитата:

Сообщение от vyazovetskova
Здравствуйте! Я в js новичок, та ктчо буду очень благодарна, если кто-то мне поможет. У меня есть следующая задачка: Есть картинка, которая положена в div. Этот div в бесконечном цикле сначала поднимается вверх на сотню пикселей, потом 'падает ' вниз на прежнее место. По клику на этот див, где бы он ни был, он должен 'упасть', т.е. вернуться в исходную позицию.
Бесконечное 'карабканье и падение' я сделала так:

то что человек просил)

exec 09.12.2010 20:16

dmitriymar, на

<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;
		this.onclick = new Function;
		(function (toTop, from, to) {
			var start = new Date().getTime(),
			callee = arguments.callee;
			setTimeout(function () {
				var progress = (new Date().getTime() - start) / 1000;
				E.style.top = ((to - from) * (toTop ? progress : delta(progress)) + from) + "px";
				if (progress < 1)
					setTimeout(arguments.callee, 13);
				else
					callee(!toTop, toTop ? 0 : 180, toTop ? 180 : 0);
			}, 13);
		})(false, 0, 180);
	};
};
</script>


Просто интересно узнать, что опять не так.

dmitriymar 09.12.2010 20:22

exec,
а сам что не видишь что он клик не реаигирует а принудительно падает с верхней точки .по крайней мере в ff да и в ie-так что по ходу наверное во всех.задача ведь человеком чётко сформулирована)))не переживай уже разобрались с человеком задавшим этот вопрос в личке.

monolithed 09.12.2010 20:40

exec, у меня после пары кликов по кубику firefox вырубило наглухо с сообщением о критической ошибке)))

dmitriymar special for you :D
<script type="text/javascript">
window.onload = function(){
    var elem = document.getElementsByTagName('div')[0], i = l = 200, j = k = 0;
    elem.onclick = function(){
        if(k!=0) {
            i = -l;
            return false;
        }
        (function(){
            if(i>=k){
                elem.style.top = --i +'px'; j = i; k = 1;
            }
            else {
                elem.style.top = ++j +'px';
                if(j++>=l) i = l;
            }
            window.setTimeout(arguments.callee, 10);
        })();
        return false;
    };
};
</script>

<div style="background: #0095FF; position: absolute; width: 50px; height: 50px; top: 200px"></div>


Цитата:

Сообщение от dmitriymar
exec, не переживай

по поводу?
Цитата:

Сообщение от dmitriymar
уже разобрались с человеком задавшим этот вопрос в личке.

а смысл?

dmitriymar 09.12.2010 20:53

monolithed,
от спасибо-аж на сек показалось что у меня сегодня д.р. просто у нас была полемика что такое анимация и что такое зацикленный браузер а что повисший. у меня тож испод того кода ff лёг. ну а проблема была решена несколько часов назад-она всё правильно делала-только нужно было прерываться на опросы чаще и всё(в смысле функции работы по таймеру делать короче и вызывать их чаще чтобы инфу с мыши считывать)

dmitriymar 09.12.2010 21:00

Цитата:

Сообщение от monolithed
уже разобрались с человеком задавшим этот вопрос в личке.

смысл в том что тут была описанна проблемма почему у неё не срабатывало-но начались заскоки -чтобы показать свой ум вот и ушел с ней в личку. хоть она и недавно скрипт изучает но понимание есть и желание разобраться в проблеме объективно-разобраться с первопричиной

dmitriymar 09.12.2010 21:04

monolithed,
видеш ведь мою карму?интересно к полуночи к -1000 догоню?)))

vyazovetskova 10.12.2010 19:41

Свое решение описала тут: http://vyazovetskova.livejournal.com/15461.html

monolithed 10.12.2010 22:03

Цитата:

Сообщение от vyazovetskova
Дело в том, что в js нет паралельности. Казалось бы, такую задачу можно решить использовав объекты. Но в js объектов как таковых нет. Объектами называются обычные хэши.

Хочется спросить, вы хоть одну книжку по JavaScript в руках держали?

И если вы уж решили кому-то дать масстер-классс, то убедитесь хотя бы сами, что ваш пример работает, я уж не говорю про элементарную демку и хотя бы намек на то что это jQuery (ведь тем кто знает что это - пройдут стороной, но вы рассчитываете на противоположную аудиторию).

PS: И был ли смысл вообще делать на jQuery, если тоже самое только рабочее и с меньшим количеством кода можно сделать на чистом JavaScript?


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