Проблемы с анимацией
Здравствуйте! Я в js новичок, та ктчо буду очень благодарна, если кто-то мне поможет. У меня есть следующая задачка: Есть картинка, которая положена в div. Этот div в бесконечном цикле сначала поднимается вверх на сотню пикселей, потом 'падает ' вниз на прежнее место. По клику на этот див, где бы он ни был, он должен 'упасть', т.е. вернуться в исходную позицию.
Бесконечное 'карабканье и падение' я сделала так: function goes_up(){ $('#idl').animate({top:'-=180'},40000);//подъем $('#id').animate({top:'+=180'},1000);//падение }; setInterval(goes_up, 100);//бесконечный подъем и падение Но когда я стала добавлять часть с кликом, то возникли проблемы (пыталась сделать через animate, но не вышло). Как мне можно решить эту проблему? |
(function () { var callee = arguments.callee; $("#id").animate({ top: "+=180px" }, 3000, function () { $(this).animate({ top: "-=180px" }, 3000, callee); }); })(); |
Цитата:
Цитата:
|
ну и не упадёт никогда по клику. пока цикл не закончится опросов и других любых действий не будет
|
так ведь нужно,чтобы упала по клику
|
делать движение через таймер.появятся промежутки во времени между вызовами по таймеру в течении которых будет работать опросы мыши и клавы. вобщем момент в том чтобы были промежутки во времени между действиями производимыми по таймеру-может быть ситуация время след выполнения по таймеру уже подошло а пред действие ещё не отработало полностью(зависит от компа клиента).да и зачем библиотеки для этого ?на чистом скрипте с тем же эффектом это всё делается
|
Цитата:
|
можно. повесить всё в цикл простой
|
А вы это пробовали хоть раз сделать? Покажите нам примерчик, пожалуйста.
|
dmitriymar,
Правильно ли я понимаю: Делаем цикл: Подвинем немного, проверим, кликали ли; Если кликали, то уроним элемент; если нет, то подвинем вверх. Так? |
vyazovetskova, зачем вам этот бред? Анимация через цикл не делается. Чем вам мой код не угодил?
|
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> |
момент не в этом. если есть какая работа на сайте-то если во время выполнения её был клик то не будет по нему обработки. привязать к котейнеру обработчик он клик. и вызывать функцию обработки движения по таймеру(движение вверх -вниз)-но при этом следить чтобы были паузы между вызовами функции по таймеру
|
хотя я точно не знаю может обработчик онклик привязанный к контейнеру будет срабатывать во время работы функции по таймеру. но в любом случае когда он роняется таймер нужно оключить.а уронив опять включить
|
exec,
что называть анимацией-какоето движение? так без разницы движение точки будет по таймеру или в цикле зациклено-и то и другое будет называться анимацией!!!или графические изменения с помощью ассемблера или другого языка это не анимация? но в ассемблере для чтения с мыши есть прерывания. а вот js как обрабатывает посторонние действия во время выполнения.если как борландовский с++ или делфи то во время выполнения действий отслеживать не будет. и если это именно эта модель -то стоит по таймеру вызывать функцию смещения всего на пару точек. и так много раз-это в этом случае будет естественным прерыванием на опрос переферии. Ну и наверное если выкладывается код к этой цитате-dmitriymar, чтобы вы не несли чушь про циклы, я покажу вам наглядный пример, как делается такая анимация на чистом JS: то стоит позаботиться о том чтобы он хотябы работал.у меня в FF он не работает!!! |
Цитата:
давайте вы уже попробуете у себя на компьютере зациклить что-нибудь, увидеть повисший браузер вместо анимации и перестанете нести ахинею. |
браузер будет всётаки висеть(значит события с переферии обрабатываться не будут) но точка будет двигаться и это тоже называется анимацией малыш
|
Я так понимаю, до сих пор говорим о своих фантазиях. Тогда рассказываю: когда браузер висит, он ничего не перерисовывает. Без перерисовки нет анимации.
|
браузер как раз висеть не будет в этот момент-он будет выполнять цикл движения точки. а то что браузер не будет реагировать на внешние раздражители-так это говорит только об одном-у него нет естественных прерываний на опрос переферии в случае выполнения какого либо действия малыш!!
|
Kolyaj,
хотя бы читал внимательно что написано а потом коментил-уже не первый раз это вижу от одного и тогоже |
Решение было найден. Спасибо всем, кто помогал разобраться!
|
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> |
monolithed,
когда много раз кликаеш скорость увеличивается. не только в фаефоксе он не работает-он во всех не работает |
Всё, подправил свой пример. Кстати, при повторном клике скорость не увеличивается.
А теперь выложите-ка свой рабочий код, который делает анимацию через цикл, интересно было бы посмотреть. |
блин да вы все читать умеете в конце концов? прочти внимательно посты от меня!!!хотелось бы глянуть на атестат и убедиться что там помимо русского языка изучалась и литература,а именно то что не только в школе научили писать но и читать.хотя чегото уверен в обратном скорость увеличивается при повторных кликах у monolithed
|
exec,
не точно не преподавали чтение-человек просил чтобы при он клик контейнер ронялся |
monolithed,
точно не роняется а просто скорость увеличивается при нажатии на клик |
dmitriymar, что мешает поменять одно число в коде, отв. за скорость?
|
мешает то, что ни у тебя ни у monolithed не роняет контейнер.
|
Цитата:
Цитата:
|
monolithed,
всё равно не роняется))) |
Цитата:
|
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> Просто интересно узнать, что опять не так. |
exec,
а сам что не видишь что он клик не реаигирует а принудительно падает с верхней точки .по крайней мере в ff да и в ie-так что по ходу наверное во всех.задача ведь человеком чётко сформулирована)))не переживай уже разобрались с человеком задавшим этот вопрос в личке. |
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> Цитата:
Цитата:
|
monolithed,
от спасибо-аж на сек показалось что у меня сегодня д.р. просто у нас была полемика что такое анимация и что такое зацикленный браузер а что повисший. у меня тож испод того кода ff лёг. ну а проблема была решена несколько часов назад-она всё правильно делала-только нужно было прерываться на опросы чаще и всё(в смысле функции работы по таймеру делать короче и вызывать их чаще чтобы инфу с мыши считывать) |
Цитата:
|
monolithed,
видеш ведь мою карму?интересно к полуночи к -1000 догоню?))) |
Свое решение описала тут: http://vyazovetskova.livejournal.com/15461.html
|
Цитата:
И если вы уж решили кому-то дать масстер-классс, то убедитесь хотя бы сами, что ваш пример работает, я уж не говорю про элементарную демку и хотя бы намек на то что это jQuery (ведь тем кто знает что это - пройдут стороной, но вы рассчитываете на противоположную аудиторию). PS: И был ли смысл вообще делать на jQuery, если тоже самое только рабочее и с меньшим количеством кода можно сделать на чистом JavaScript? |
Часовой пояс GMT +3, время: 17:46. |