Последовательная анимация JQuery
Суть задачки Лабораторная работа создать анимацию сортировки массива...
все получается вот только проблема в том что последовательных перемещений добиться не получилось, все выполняется параллельно что не очень наглядно с JS я на "вы", цель добиться последовательности действий в анимации всю суть задачи можно свести к следующем коду <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script> <script> function create() { var a=$("#xs0"); var b =$("#xs1"); var c= $("#xs2"); a.animate({left:String(a.position().left+100)+"px"},1000); b.animate({left:String(b.position().left+200)+"px"},1000); c.animate({left:String(c.position().left+300)+"px"},1000); } </script> </head> <body> <input type="button" onclick="create()" value="dvigaem" /> <div style="position: absolute; line-height:0px;width: 1000px;height: 400px;background: #cccccc;"> <div id="xs0" style="position: absolute;top:00px;left:0px; width: 40px;height: 40px;background: #ff0000;" >1</div> <div id="xs1" style="position: absolute;top:00px;left:0px; width: 40px;height: 40px;background: #00ff00;" >2</div> <div id="xs2" style="position: absolute;top:00px;left:0px; width: 40px;height: 40px;background: #0000ff;" >3</div> </div> <script> create(); </script> </body></html> надо чтобы обекты двигались последовательно тоесть сначала 1-ый, после окончания второй , а после окончания движения 2-го - третий |
а вы хоть официальную справку http://api.jquery.com/animate/ читали? она вроде не сложная
a.animate({left:String(a.position().left+100)+"px"},1000, function() { b.animate({left:String(b.position().left+200)+"px"},1000, function() { c.animate({left:String(c.position().left+300)+"px"},1000); }); }); теперь вроде по очереди |
Есть возможность уйти от callback-ов? ввиду того что вызов методов анимации разбросан по рекурсивным процедурам.... здесь привел код для 3 элементов чтобы было самому проще разобраться как управлять последовательностью, скажем так мне нужно что-то что может заставить вот это работать последовательно
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script> <script> function create() { for (i=0;i<=2;i++){ $("#xs"+String(i)).animate({left:String($("#xs"+String(i)).position().left+100)+"px"},1000); } } </script> </head> <body> <input type="button" onclick="create()" value="dvigaem" /> <div style="position: absolute; line-height:0px;width: 1000px;height: 400px;background: #cccccc;"> <div id="xs0" style="position: absolute;top:00px;left:0px; width: 40px;height: 40px;background: #ff0000;" >1</div> <div id="xs1" style="position: absolute;top:50px;left:0px; width: 40px;height: 40px;background: #00ff00;" >2</div> <div id="xs2" style="position: absolute;top:100px;left:0px; width: 40px;height: 40px;background: #0000ff;" >3</div> </div> </body></html> обход элементов объединил в цикл.... (разместил все вертикально чтобы наглядно было видно) как в этом случае быть???? отказаться от циклов в пользу callback-ов? |
alx1,
В цикле добавлять объекты к очереди анимации(массив объектов с анимационными параметрами), плюс функция обработки очереди |
Цитата:
|
Deff,
Огромное спасибо за идею, тк язык JS и его токости я не знаю получилось криво но получилось, в смысле работает последовательно, пришлось делать через callback функции animate, для анимации сортировки масива из 10 элементов получается 78 вызов метода и строка('st') в 5000 символов длиной <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script> <script> var animArray = new Array(); //сюда кладу анимацию последовательно ввиде строк(( пло другому не знаю как парсить //обработка массива анимации, рекурсивно достает элементы из масива и собирает строку function extrAnimArray(i){ var s; if (i>animArray.length-1) { return " );"; } else { if (i ==0) {s = animArray[i]+extrAnimArray(i+1)} else { s = ", function(){"+animArray[i]+extrAnimArray(i+1)+"});" } } return s; } function create() { for (i=0;i<=2;i++){ // было // $("#xs"+String(i)).animate({left:String($("#xs"+String(i)).position().left+100)+"px"},1000); // //изменил на заполнение массива анимаций s="$(\"#xs"+String(i)+"\").animate({left:\""+String($("#xs"+String(i)).position().left+100)+"px\"},1000" ;//завершающую скобку специально не ставлю(чтобы потом не удалять, да и не знаю как это на js делается) animArray.push(s); //поместим строку в массив } //тут я вызываю обработку массива анимации st = extrAnimArray(0); //первая функция которая мне попалась которая может из строку выполнить как функию... setTimeout(st, 1000); } </script> </head> <body> <input type="button" onclick="create()" value="dvigaem" /> <div style="position: absolute; line-height:0px;width: 1000px;height: 400px;background: #cccccc;"> <div id="xs0" style="position: absolute;top:00px;left:0px; width: 40px;height: 40px;background: #ff0000;" >1</div> <div id="xs1" style="position: absolute;top:50px;left:0px; width: 40px;height: 40px;background: #00ff00;" >2</div> <div id="xs2" style="position: absolute;top:100px;left:0px; width: 40px;height: 40px;background: #0000ff;" >3</div> </div> </body></html> |
Часовой пояс GMT +3, время: 19:36. |