Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   JQuery, анимация для нескольких элементов сразу, возможно ли? (https://javascript.ru/forum/jquery/14101-jquery-animaciya-dlya-neskolkikh-ehlementov-srazu-vozmozhno-li.html)

Logo 29.12.2010 16:56

JQuery, анимация для нескольких элементов сразу, возможно ли?
 
Как с помощью JQuery анимировать два разных элемента одновременно, причем так чтобы у разных элементов анимировались разные свойства?
Есть див, в который загружаются ajax данные, и он делает slideDown.
Чобы пользователь не скролил вниз, когда загруженны Ajax данные, одновременно с div.slideDown должна работать анимация скролинга окна (пока это $('html').animate({scrollTop : '+='+height}) ). Однако, JQuery выполняет эту анимацию раздельно, в результате чего видно, как див скачет относително окна.
Как одновременно анимровать высоту дива и scrollTop окна?

x-yuri 30.12.2010 11:49

Цитата:

Сообщение от Logo
Чобы пользователь не скролил вниз, когда загруженны Ajax данные, одновременно с div.slideDown должна работать анимация скролинга окна

пользователь не оценит... либо покажи как это выглядит без анимации окна

Logo 31.12.2010 12:29

Наверно, тему правильнее было бы назвать "Синхронная анимация в JQuery".

Навигация похожа на http://slashdot.org/, кнопка "Many more" снизу.
Только загружаемых данных меньше, они умещаются по высоте в высоту экрана и загружаются почти мгновенно, и для их показа используется анимация (slideDown).
После нажатия на кнопку "показать еще" приходится скролить на экран вниз, чтобы увидеть загруженные ссылки на новости.
Хорошо бы анимировать скролл окна вместе со slideDown, чтобы сразу видеть загруженые данные.

x-yuri 01.01.2011 18:29

Цитата:

Сообщение от Logo
После нажатия на кнопку "показать еще" приходится скролить на экран вниз, чтобы увидеть загруженные ссылки на новости.
Хорошо бы анимировать скролл окна вместе со slideDown, чтобы сразу видеть загруженые данные.

на slashdot.org такого нету. Почему они так не сделали? Чем отличается твой случай, что так надо сделать?

Logo 05.01.2011 11:58

У меня загружаемых данных меньше, они умещаются по высоте в высоту экрана и загружаются почти мгновенно, и для их показа используется анимация (slideDown). На slashdot данных больше, они грузятся некоторое время, и для их показа не используется анимация.
В общем, поскольку данные умещаются в экран, пользователь должен проскролить на экран вниз. А поскольку данные загружаются малыми порциями, то быстрое пролистывание вниз сопровождается постоянным не нужным скролингом.

x-yuri 05.01.2011 14:46

Цитата:

Сообщение от Logo
А поскольку данные загружаются малыми порциями, то быстрое пролистывание вниз сопровождается постоянным не нужным скролингом.

так сделай, чтобы данные загружались большими порциями. Можно посмотреть?

Logo 05.01.2011 15:48

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

x-yuri 05.01.2011 19:25

ну так. Сейчас хорошо сделано. Не надо мешать пользователю читать сайт, принимать за него решения. Например, я просматриваю список новостей и щелкаю на "показать еще", чтобы подгрузились еще новости, пока я дочитаю то, что уже есть. К чему мне этот автоматический скролл?

p.s. извини, я не помогаю совершать ошибки...

p.p.s. речь в общем-то не о дизайне, а о юзабилити. Но с дизайнером я согласен, там же несколько разделов, один за другим. Сложно будет скроллить к следующему разделу, если большими блоками показывать

Logo 06.01.2011 11:45

Вообще то я тоже считаю, что лучше загружать маленькими порциями.

Цитата:

Например, я просматриваю список новостей и щелкаю на "показать еще", чтобы погрузились еще новости, пока я дочитаю то, что уже есть.
Ерунда. Пользователь нажимает "показать еще" когда он уже ознакомился с тем что выше.
Однако эти новости появляются внизу, где их не видно, после нажатия кнопки надо еще скролить вниз. Кроме того, сама кнопка уезжает вниз.
Если сделать как планируется, новости будут видны сразу, и кнопка будет все время фиксирована относительно окна. То есть можно листать новости одним щелчком мыши, без перемещений и скрола.

И вообще тема создавать в надежде получить помощь. А не для того, что бы ты меня отговаривал от поиска решения.

x-yuri 06.01.2011 17:41

Цитата:

Сообщение от Logo
И вообще тема создавать в надежде получить помощь. А не для того, что бы ты меня отговаривал от поиска решения.

но я ведь пытаюсь тебе помочь ;)

Цитата:

Сообщение от http://phpfaq.ru/humor
Новичок: Подскажите пожалуста самый крепкий сорт дерева! Весь инет перерыл, поиском пользовался!
Старожил: Объясни, зачем тебе понадобилось дерево? Сейчас оно в строительстве практически не используется.
Новичок: Я небоскрёб собираюсь строить. Хочу узнать, из какого дерева делать перекрытия между этажами!
Старожил: Какое дерево? Ты вообще соображаешь, что говоришь?
Новичок: Чем мне нравиться этот форум - из двух ответов ниодного конкретного. Одни вопросы неподелу!
Старожил: Не нравится - тебя здесь никто не держит. Но если ты не соображаешь, что из дерева небоскрёбы не строят, то лучше бы тебе сначала школу закончить.
Новичок: Не знаите - лучше молчите! У меня дедушка в деревянном доме живёт! У НЕГО НИЧЕГО НЕ ЛОМАЕТСЯ!!!
Но у него дом из сосны, а я понимаю, что для небоскрёба нужно дерево прочнее! Поэтому и спрашиваю!!! А от вас нормального ответа недождёшся!!!
Прохожий: Самое крепкое дерево - дуб. Вот тебе технология вымачивания дуба в солёной воде, она придаёт дубу особую прочность:
Новичок: Спасибо, братан! То что нужно!!!

http://phpfaq.ru/humor

Суп. Надо. Есть. Ложкой!

Logo 13.01.2011 23:50

Приведенная выше копипаста ни как не относится к обсуждаемому вопросу.
Я четко спросил, КАК сделать синхронную анимацию в JQuery.
Вместо того, что бы помочь или сказать не знаю как/пройти мимо, дознаешся до вещей, напрямую к вопросу не относящихся, заранее с установкой к чему нибудь придраться, и сказать, что ты бы сделал по другому.

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

А ты тонкий тролль.

x-yuri 14.01.2011 01:20

Цитата:

Сообщение от Logo
А ты тонкий тролль.

ты первый, кто меня так назвал :) а в дальнейшем просто учти, что меня не интересует, ЧТО ты спросил. Меня интересует, как лучше всего решить твою проблему ;)

UPD еще немного копипасты

Logo 14.01.2011 13:08

Моя проблема в том, что анимация скролла, и анимация появления контента происходит не синхронно. Ни сообщения по теме нет, а только флуд и флейм.

Logo 19.01.2011 23:34

Так.

Во-первых. Обсуждаемая опция - часть интерфейса. А на почве интерфейса происходят самые сильные холивары. vi[m] vs emacs, vim/emacs vs нормальные редакторы, редакторы vs IDE, GNOME vs KDE, браузерные войны etc. Хорошо/плохо здесь ориентируется на личные предпочтения, привычку, и не более.


Во-вторых ты действительно не привел ни одного аргумента.
Цитата:

Сообщение от x-yuri
Не надо мешать пользователю читать сайт, принимать за него решения.

Сферическое, в вакуме. Под это "определение" можно подогнать все что угодно.

Цитата:

Сообщение от x-yuri
Например, я просматриваю список новостей и щелкаю на "показать еще", чтобы подгрузились еще новости, пока я дочитаю то, что уже есть.

Контента мало, новости подгружаются сразу же, описанное физически невозможно. Сразу вспоминается один из принципов построения X System, "Хуже обобщения одного примера может быть только обобщение вообще без примеров."
А вот листать малыми порциями, постоянно возвращаясь скроллом, очень неудобно.

А в главных, от тебя не требовалось разводить тему преимущества того или иного способа навигации, а просто помочь в реализации.

x-yuri 20.01.2011 00:08

Цитата:

Сообщение от Logo
А в главных, от тебя не требовалось разводить тему преимущества того или иного способа навигации, а просто помочь в реализации.

тон смени, а?

а то, что ты не можешь это реализовать только подтверждает, что это не нужно ;)

Logo 20.01.2011 10:29

То, что в JQuery нельзя сделать синхронную анимацию, лишь говорит о ее недостатках.

bender-nvkz 06.05.2012 01:13

не серьёзно совсем
 
Уже год прошел, а ни кто не делится информацией :(
Мне сейчас похожий функционал требуется, нужно уменьшать блок 1 и добавлять внутренний отступ к соседнему блоку 2, при наведении.
$('адрес блока инициирования').hover(function()
{
$('блок 1').animate({'width': '-=10px'}, 300);
$('блок 2').animate({'paddingRight': '+=10px'}, 300);
},
function() {
*процедура при снятии курсора*
});
})


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

Цитата:

Сообщение от Logo
То, что в JQuery нельзя сделать синхронную анимацию, лишь говорит о ее недостатках.

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

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

bender-nvkz 06.05.2012 01:47

ответ (решение)
 
Вариант с использованием SetTimeout - отпал как, предположительно не возможное решение. Пробовать не стал, но думаю поочередность сохранится.
Первый вариант был придумать конструкцию типа
$( "блок 1" ).add( "блок 2" )
и этим усложнить всё ситуацию.

НО - чудо свершилось, и имя ему
queue
- что значит "очередь"
Конструкция приняла такой вид:

$('адрес блока инициирования').hover(function()
{
$('блок 1').animate({'width': '-=10px'}, { duration: 300, queue: false });
$('блок 2').animate({'paddingRight': '+=10px'}, { duration: 300, queue: false });
},
function() {
*процедура при снятии курсора*
});
})


так вот "queue: false" - снимает этот вопрос!
jquery гораздо продуманней, чем может показаться.
ссылка на страницу в jq api - http://api.jquery.com/queue/

Буду рад, если вам пригодится данная информация)

devote 06.05.2012 15:51

используйте событие step в методе animate
$('блок 1').animate({
    'width': '-=10px'
}, {
    duration: 300,
    step: function( now, data ) {
        // тут и обрабатывайте все что нужно, каждый шаг
    }
});

bender-nvkz 23.05.2012 05:15

Всё равно в итоге лажа получается.
Мне нужно несколько групп блоков обрабатывать независимо, т.е. множество блоков, внутри которых используется анимация вложенных блоков при наведении, так вот если после наведения на блок 1 сразу наводить на блок 2, где используется анимация, то процедура назначенная блоку 1 при снятии не выполняется, а выполняется сразу процедура наведения на блок 2, а блок 1, так и остается как-будто фокус мыши на нем. Это пол беды. Если вернуть мышь на блок 1, то парметры 'width': '-=10px' выполняются принимая за начальное значение width уже -=10px, так как осталось после выполнения первого наведения. В итоге если навести 5 раз, то блок на 50px меньше становится, и не возвращается в начальное заданное css значение.

Есть мысли у кого нибудь?

ilya.tk 29.05.2012 20:57

Было это больше года назад, но queue тогда не решало проблемы, насколько я помню.
Цитата:

Чобы пользователь не скролил вниз, когда загруженны Ajax данные, одновременно с div.slideDown должна работать анимация скролинга окна (пока это $('html').animate({scrollTop : '+='+height}) ). Однако, JQuery выполняет эту анимацию раздельно, в результате чего видно, как див скачет относително окна.
Анимация шла не одновременно, а соответственно, не было синхронности. step думаю как раз помог бы решить этот вопрос, но тогда я о нем не знал.

Цитата:

Всё равно в итоге лажа получается.
Мне нужно несколько групп блоков обрабатывать независимо, т.е. множество блоков, внутри которых используется анимация вложенных блоков при наведении, так вот если после наведения на блок 1 сразу наводить на блок 2, где используется анимация, то процедура назначенная блоку 1 при снятии не выполняется, а выполняется сразу процедура наведения на блок 2, а блок 1, так и остается как-будто фокус мыши на нем. Это пол беды. Если вернуть мышь на блок 1, то парметры 'width': '-=10px' выполняются принимая за начальное значение width уже -=10px, так как осталось после выполнения первого наведения. В итоге если навести 5 раз, то блок на 50px меньше становится, и не возвращается в начальное заданное css значение.
Не очень понял, можно пример?

Deff 29.05.2012 21:50

Logo,
Imхо - тут по-моему подход несколько иной нужно делать
А чисто временно свернуть все за дивом, вплоть до полной загрузки а у div
cделать margin-bottom ?

Как Див подгрузился - разворачиваете нижние данные, *можно и с анимацией
----------------------------
Вариант 2: Cделать подгружаемый блок временно position:fixed; привязав нижний край к обрезу экрана, по загрузке, возвращаем нормальную позицию
----------------------------
Просто засинхрячить скролл в разных браузерах - достаточно тяжело
(С Мозиллой как то две недели промучился


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