программная анимация
Сегодня утром наткнулся на данную статью Основы программной анимации на JavaScript
и вроде всё в порядке... даже реализовал анимацию, движение по спирали, пока в голову не начали лезть сомнения.. Всё-таки для человека долгое время развлекающегося асемблером и далекого от web-технологий всё это как то странно.. просто хочу уточнить пару моментов.. Допустим есть что-то похожее на: function go(arg1,arg2){ var radius = arg1; var obj = arg2; /* элемент который вращаем*/ ... setTimeout(function() { /* Используем radius и obj*/ /* Тут изменение параметров */ if (/* условие срабатывания итерации */) setTimeout(arguments.callee, 0); }, 0); } Не могу до конца понять.. Смотрите.. мы запускаем go(MyElement1, Rad); проинициализировались переменные setTimeout запускает анонимную функцию и гоняет её по циклу, пользуясь переменными go(), пока не сделает все свои дела... вопрос встал вот в чем: пока setTimeout гоняет свою функцию, она пользуется переменными go() и тут я могу понять замыкание и тд.. НО! А если я пользуюсь этой функцией не для одного элемента, а для нескольких??? Разве переменные radius и obj не должны перетераться???? и на этом месте у меня в голове заварилась каша :) |
они каждый раз будут заново создаваться и каждый раз будет появляться замыкание. вроде бы :)
|
я пока для себя могу найти только одно разумное объяснение...
что когда идет обращение к go() второй/.../n-й раз интерпритатор будет видеть, что [[scope]] функции go, ныне принадлежащий анонимной функции, пока еще занят и будет создавать новый [[scope]], а старый остаётся за анонимной функцией до её смерти... Логично?? или я не прав... |
Цитата:
|
Каждому вызову - по отдельному [скопу]) melky всё правильно сказал...
Кстати, на будущее: если нужно анимировать два разных объекта одновременно, то лучше пользоваться одним таймером, который будет менять св-ва обоих. |
спасибо за ответы
trikadin, в моем случае согласен... а если я не знаю сколько их будет? допустим два от одного родителя и 6 от другого с разными радиусом и скоростью например... страшная же функция получится)))) я хотел найти наиболее простое решение для себя, чтоб использовать как $(...).animate({...}); |
А если 100500 и все с разной анимацией разных css-св-в?)
Анимацию на javascript надо оптимизировать для каждого отдельного случая, иначе тормозно будет. |
лучше тогда использовать transitions ...
ёмаё, ну для кого их придумывали? в каждой теме про них говорю, толку никакого :) |
melky, в каждой теме говорят, что использовать document.write и ставить обработчик на кнопку, а не на отправку формы - плохо. Никакого толку)
|
обработчик ещё через свойство и через атрибут ставить :) где-то тут было.
|
Цитата:
Минус руки бы за такое... А вообще, transitions придумывали для тех, у кого хватит ума их использовать. |
:) сколько там его надо? по-моему, они в разы легче, чем та же анимация
если взять "ту же анимацию" из исходников jquery. очень хитрая. а с переходами только уточнить, какие префиксы (браузер) использовать. |
melky, мой уже ставший излюбленным пример: линукс на три порядка стабильнее, быстрее, удобнее, гибче (список дополнить по мере необходимости) винды. И моска для его использования в качестве десктопной системы (убунту, например) нужно немного.
Где же толпа пользователей линукса?) |
Во-первых, melky, я не читал все Ваши посты на этом форуме...
Во-вторых, transitions и keyframes, я использую давольно часто, но без вмешательств с js, а только для анимации небольших красотулек, на которые срать если в каком либо браузере не поддерживается... trikadin, что стабильнее, удобнее, гибче да, но не на много быстрее.. нынешние дистрибутивы ubuntu жрут столько же сколько и win7... Хотя на моем старом ноуте с оперативой в 512МБ работало быстрее винды, но не на много... и то что их можно ставить простому обывателю - не согласен.. |
Цитата:
Цитата:
Цитата:
Я же не говорю про генту) Конечно, её простым обывателем ставить не надо... |
Цитата:
Цитата:
на переходах она идёт плавно, соотв. (jquery эту фичу уже использует) Цитата:
из известных дистров не пробовал только Mint и таких жесткачей, как Slackware, Gentoo. сейчас сижу на Arch x86-64 и радуюсь жизни. Цитата:
|
trikadin, melky ну ну... особенно когда идут проблемы с железом, либо когда необходимый софт нужно искать/качать и компилить сорцы - это как раз для далёких от компа людей... про извращения с вайн я вообще промолчу... конечно если вы оказываете им тех. поддержку, то не спорю, что для домашнего применения будет супер, но у меня нет таких знакомых, кто хотел заморочится, а ходить к ним и решать тупые вопросы мне лень.
И melky, я не говорю про всю анимацию.. я говорил про анимацию, которая жизнено необходима для отображения сайта (меню навигации и тп)... То что transitions быстрее и желательно использовать его, я не спорю... И вообще мы ушли от темы... JS - используется для анимации?? используется! И был вопрос не по анимации, а по статье с этого сайта, а точнее про вызов функций и [[scope]]... анимация css3 немного не то, что меня сейчас интересует, хотя в Ваших сообщениях на этом форуме я получил для себя некоторые новые знания о transitions |
taha, так в чём проблема, собственно? Мы ответили на ваш вопрос. О достоинствах и недостатках линя можно спорить вечно. Не будем разводить холивар.
|
trikadin, да нет у меня больше вопросов... я про то и говорю, что ответ уже давно получен и желания спорить про css3 и linux у меня нет... тем более, что сам сижу на ubuntu 11.04, юзаю css3-анимацию и вообще не понимаю к чему было всё вышесказаное, если вопрос был не об этом
|
Просто тема об этом зашла) Вы же сами спор и начали. :)
|
trikadin, нет нет.... не я... начиная с 8-го поста пошли какие-то Ваши личные с
melky темы про css и линух и про то, о чем melky говорит в каждой теме |
Цитата:
Но про линь-то вы начали спорить на тему убоства/неудобства его для обычного юзверя. |
Цитата:
вернёмся к анимации, совершаемой в бОльшей мере инструментами JavaScript. |
trikadin, melky спасибо за советы, стало работать намного быстрее...
|
у меня еще один вопросик.. а если я буду использовать не
setTimeout(function() { /* Тут изменение параметров */ if (/* условие срабатывания итерации */) setTimeout(arguments.callee, 0); }, 0); а следущее function RunAnimate(obj, R, dlt,start){ if(progress < 1) setTimeout(function(){RunAnimate(obj, R, dlt, start);}, 10); } второй вариант будет работать быстрее?? ведь по идее кучи [[скопов]] создаваться не должно.. так?? так как для RunAnimate всё передается через аргументы |
Используйте setInterval при создании анимации...
|
а потом
if(progress < 1) ClearInterval(handle); тоже как-то не очень хорошо, нужно будет хранить handle, тоесть будет сохраняться скоп вызвавшей функции... хотя это лучше чем куча скопов от сеттаймаут... спасибо, ща попробую |
Программная анимация на JS делается примерно так:
<div id="elem" style="width: 10px; height: 10px; background: red; position:absolute"></div> <script> div= document.getElementById("elem"); pos=0; interv= setInterval(function(){ if (++pos > 50){ clearInterval(interv); return; }; div.style.left= pos+"px"; }, 50); </script> |
еще вариант
<html> <head> <meta charset="utf-8"> <style type="text/css"> div { background-color:green; height:100px; width:100px; } </style> <script type="text/javascript"> var i = 0; function x() { if (i<400) { document.getElementsByTagName('div')[0].style.marginLeft=++i+'px'; setTimeout(x,10); } } </script> </head> <body> <div onclick="x();"></div> </body> </html> |
nerv_, я им и пользовался... просто хочу попробовать разные способы и найти для себя наиболее оптимальный..
Думаю, что сопсоб trikadin, будет оптимальней.. ибо [[скоп]] RunAnimatin создастся один раз и будет юзаться функцией setInterval'а.. В случае setTimeout(RunAnimatin,10); я так понимаю, что RunAnimatin будет запускаться раньше завершения, предыдущего запуска, и для нё будет создаваться новый [[скоп]].. и следовательно грузится будет больше.. это я так понимаю, могу быть не прав.... |
nerv_, ваш способ медленнее и больше памяти жрёт.
|
trikadin, сделал как Вы сказали и всё прекрасно, не считая firefox, который тормозит скрипт на функции easeOut в этих строках, как и в прошлых вариантах
function d(progress) { for(var a = 0, b = 1, result; 1; a += b, b /= 2) { if (progress >= (7 - 4 * a) / 11) правда в нем еще две группы с 10-15 вкладок в каждой.. и он всегда тормозит.. но остановить скрипт он всёже хочет в данном месте |
А что после ифа?
И каково значение progress? lim(a)=2 при b=>0, следовательно, если progress > -1/11, то бесконечный цикл гарантирован. |
код взят всё с тойже статьи
function easeOut(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); } поемуто с простейшими функциями такого не случается значение progress не знаю.. ибо firefox зависает.. это периодически случается только в нём кстати... но теперь, благодаря Вам, в три раза реже)) оффтоп... когда перебираю все анимируемые элементы var obj = document.getElementById("Mylist"); for (var i in obj.childNodes){ if ( obj.childNodes[i].nodeType == 1 ){ ... }} firebug говорит Цитата:
|
сделал одну из предложеных функций easeOut'вой
function easeOut(progress) { return 1-Math.pow((1-progress),2) * ((2.5 + 1) * (1-progress) - 2.5); } firefox, ниразу не завис ещё, остальные еще быстрее залетали но вопрос по Цитата:
поискал в инете, в статьях про DOM примеры вот такие: var object = document.getElementById('el'); for (var childItem in object.childNodes) { if (object.childNodes[childItem].nodeType == 1) object.childNodes[childItem].style.color = '#FF0000'; } тоесть тоже самое... и в чём косяк? PS: то что firefox притормаживал это впринципе норм.. его обычное состояние ![]() |
Вообще, object.childNodes - это массив (грубо говоря) узлов. Поэтому можно попробовать перебирать вот так:
for (var i=0; i!= object.childNodes; ++i) Потому что мало ли, что там может выплыть при переборе через key in obj. |
эхххххх..... =\\\\\\\\\\\
var n = 0; /* Все прямые потомки являющиеся элементами */ for (var i in objPiE.childNodes) n=(objPiE.childNodes[i].nodeType==1)?(++n):(n); /* Колличество элементов li в данном списке */ красивей смотрелось =( |
Цитата:
перебирайте элементы через цикл, а не через перебор свойств. var i = 0, curr; while(curr = obj.childNodes[i++]){ //.... } |
for(var curr, i = 0; curr = obj.childNodes[i]; i++){ if ( curr.nodeType == 1 ) { // ... } } |
trikadin,
спасибо огромное работает также, но firebug ругаться перестал на это... он что-то вобще взбесился.. даже на jquery, который тупо только подключен, ругается |
Часовой пояс GMT +3, время: 08:41. |