Базовый jQuery slideUp и slideDown сводил меня с ума!

мои навыки jQuery обычно довольно хороши, но это сводит меня с ума!

Это довольно простой аккордеон, который я написал с нуля. Использование jQuery 1.3.2, поэтому не должно быть никаких прыгающих ошибок, но в основном, если вы посмотрите на пример:

http://www.mizudesign.com/jquery/accordian/basic.html

Я показываю высоту целевого div справа — если он содержит текст, он думает, что он короче, чем есть на самом деле, и прыгает. Если это образ, то нет проблем.

Я не могу понять, где я ошибаюсь - это явно где-то в CSS, но я пробовал все обычные подозреваемые, такие как display:block

Любые идеи будут с благодарностью приняты!

Ваш, Крис

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


person Mizu    schedule 07.07.2009    source источник


Ответы (10)


Вам нужна ширина или высота содержимого, чтобы оно плавно анимировалось.

person redsquare    schedule 07.07.2009
comment
Спасибо, я прочитал пост, но предположил (как я читал об ошибке в другом месте), что он применим к предыдущей версии jQuery. Стыд. - person Mizu; 07.07.2009
comment
Должен признаться, я думаю, что нашел лучшее решение, так как поиграл с ним - как описано ниже! :) - person Mizu; 07.07.2009
comment
он по-прежнему в основном добавляет высоту к элементу! - person redsquare; 07.07.2009
comment
За исключением того, что он сохраняет высоту в DOM для справки в любой момент времени. Я начал рассматривать использование jQuery .data для хранения информации, но это казалось гораздо более эффективным :) - person Mizu; 07.07.2009
comment
Срок действия этой ссылки истек для меня, что делает ответ ограниченным. Ссылки на внешние ресурсы приветствуются, но, пожалуйста, добавьте контекст вокруг ссылки, чтобы ваши коллеги-пользователи имели некоторое представление о том, что это такое и почему оно там. Всегда цитируйте наиболее релевантную часть важной ссылки на случай, если целевой сайт недоступен или навсегда отключится. - person Craicerjack; 16.07.2015
comment
@crackerjack эти правила не действовали в 2009 году - person redsquare; 27.07.2015

Я должен признать, что нашел свое собственное динамическое решение.

http://www.mizudesign.com/jquery/accordian/basic.html должно быть исправлено.

На самом деле это очень просто - просто добавьте высоту с помощью .css, прежде чем скрывать div. Работает на здоровье :)

$("#PlayerButtonsContent div").each (function() {
$(this).css("height", $(this).height());
});

$("#PlayerButtonsContent div").hide();
person Mizu    schedule 07.07.2009
comment
Удивительно, как ребята из JQuery упустили это... спасибо! Реально решает любую проблему. В течение многих лет я искал решение для прямой вязки. - person Pedro Ferreira; 02.10.2016

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

Также «имейте в виду», что таблицы ведут себя некорректно с помощью slideDown slideUp и скорее используют fadeIn fadeOut

person adardesign    schedule 07.07.2009
comment
Это было, безусловно, самое простое решение, независимо от того, задействованы ли таблицы. Я пытался установить высоту css и другие трюки, найденные здесь, но fadeIn/fadeOut сработало блестяще. - person eon; 02.10.2014

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

Если ваша анимация дергается, попробуйте использовать обратные вызовы. Не открывайте div и не скрывайте div одновременно. Вместо этого скройте свой первый div и в обратном вызове покажите следующий div.

$(".someDiv").slideUp("normal", function(){
  /* This animation won't start until the first
     has finished */
  $(".someOtherDiv").slideDown();
});

Обновлено (из комментариев):

красный квадрат: http://jqueryfordesigners.com/slidedown-animation-jump-revisited/

person Sampson    schedule 07.07.2009
comment
Спасибо за ответ, но я не пытаюсь получить высоту на самом деле - это просто отладочная информация. Я просто хочу, чтобы он красиво анимировался без прыжков! - person Mizu; 07.07.2009
comment
Разве вы не видите эффект от демо-ссылки? Когда вы нажимаете на первые две вкладки, содержимое прыгает вниз, а не скользит полностью вниз. Анимация не плавная, как на третьей вкладке. Судя по панели в правой части страницы, она также не вытягивает правильную высоту для анимации. Кажется, это работает только после того, как он анимировал его один раз. - person Mizu; 07.07.2009
comment
Попробуйте связать свои анимации вместе через их обратные вызовы. - person Sampson; 07.07.2009
comment
Мизу, ты ошибаешься насчет роста. Вы захватываете высоту еще до того, как div станет полностью видимым. Это даст вам неполный рост — это было бы похоже на то, как я измеряю ваш рост, когда вы наклоняетесь, чтобы завязать шнурки. - person Sampson; 07.07.2009
comment
Хорошо, я устранил запутанную проблему, включив информацию о высоте. Тогда простой вопрос: почему в этом случае slideDown() не отображается плавно. Он отображает первые x пикселей, а затем переходит к остальным. - person Mizu; 07.07.2009
comment
Мизу, используй обратные вызовы. Я обновил свой ответ примером. - person Sampson; 07.07.2009
comment
Спасибо, Джонатан, я не то чтобы не верю, и я ценю ответ, но он все равно неправильный. Вот очень простая версия всего с одной вкладкой, использующей slideToggle. mizudesign.com/jquery/accordian/simple.html Он по-прежнему перескакивает на дно, а не анимировать плавно. - person Mizu; 07.07.2009
comment
вам нужна высота/ширина на div. У Реми Шарпа есть сообщение в блоге об этой проблеме, см. jqueryfordesigners.com/slidedown-animation-jump-revisited. - person redsquare; 07.07.2009
comment
если я добавлю ширину или высоту к этому содержимому, анимация станет плавной - person redsquare; 07.07.2009
comment
Добавление предопределенной высоты для текстового поля выглядит довольно... некрасиво, не так ли? - person Sampson; 07.07.2009
comment
джон - согласен да. Другой способ — загружать тот же контент за пределы экрана и динамически применять высоту. Оба нехорошие и являются результатом jq 1.3+, когда код измерения был переписан. - person redsquare; 07.07.2009
comment
Джонатан, ты не ошибаешься, тем более, что это будет динамический контент, поэтому я не знаю, какой высоты он должен быть! Ну ладно :( Спасибо за вашу помощь. - person Mizu; 07.07.2009
comment
Я должен признать, что нашел свое собственное динамическое решение. mizudesign.com/jquery/accordian/basic.html следует исправить. На самом деле это очень просто - просто добавьте высоту с помощью .css, прежде чем скрывать div. Работает на здоровье :) - person Mizu; 07.07.2009

У меня также была раздражающая проблема с переходом slideUp(), которая возникала в Safari, но не в Chrome или IE. Оказалось, что тег div, который я скрывал/показывал, находился прямо под другим тегом div, который содержал float:left div. Во время скольжения плавающие элементы div на мгновение перерисовывались, вызывая скачок.

Исправление заключалось в простом добавлении clear:both к стилю скрытия/отображения div.

person beaves    schedule 24.08.2012

Моя проблема в том, что поскольку у меня отзывчивый дизайн, я не знаю, какой будет ширина или высота моего элемента. После прочтения этого сообщения в блоге http://www.bennadel.com/blog/2263-Use-jQuery-s-SlideDown-With-Fixed-Width-Elements-To-Prevent-Jumping.htm Я понял, что jQuery изменение положения моего элемента на фиксированное и изменение макета элемента. Я добавил следующее в свой CSS для элемента и не заметил каких-либо побочных эффектов в IE7+, firefox, chrome и сафари.

display: none;  
overflow: hidden;
position: relative !important;   
person Blake Plumb    schedule 02.08.2013

Замена значений margin-top и margin-bottom значениями padding-top и padding-bottom помогла мне. После этого не забудьте установить значение поля равным 0.

person 3rik82    schedule 21.08.2014

Это сработало для меня:

$(this).pathtoslidingelementhere.width($(this).parent().width());
person Smirnoff    schedule 25.05.2011

Проблема связана с тем, что IE (причудливый режим) пытается отобразить «высота: 0 пикселей».

Исправление: анимировать высоту до 1 (не 0), затем скрыть и сбросить высоту:

// slideUp for all browsers
$("div").animate({ height:1 },{ complete:function(){
        // hide last pixel and reset height
        $(this).hide().css({ height:"" });
    } 
});
person sciroccohsd    schedule 22.08.2013

Для меня проблема заключалась в том, что поля (или отступы) в div должны отображаться/скрываться со слайдом, но мне нужно было указать поля (или отступы) для этого div. Я решил с помощью этого трюка:

  .slide-div:before{
    content: " ";
    display: block;
    margin-top: 15px;
  }
person Fred K    schedule 28.12.2014