JQuery слайд нервный - PullRequest
       108

JQuery слайд нервный

62 голосов
/ 26 августа 2009

Я пытался вставлять и выводить DIV с помощью функции переключения jQuery, но результат всегда скачок в начале и / или конце анимации. Вот код js, который я использую:

$(document).ready(function(){
    $('#link1').click(
        function() {
            $('#note_1').parent().slideToggle(5000);
        }
);

И HTML:

<div class="notice">
    <p>Here's some text. And more text. <span id="link1">Test1</span></p>
    <div class="wrapper">
        <div id="note_1">
            <p>Some content</p>
            <p>More blalba</p>
        </div>
    </div>
</div>

Вы также можете увидеть полный пример здесь: jQuery Slide test

Я обычно использую Mootools и могу без проблем создавать этот слайд. Но я начинаю новый проект в Django, и большинство приложений в Django используют jQuery. Итак, для этого и после прочтения jQuery против Mootools я решил, что это будет хорошим поводом начать использовать jQuery. Поэтому моей первой потребностью было сделать слайд с этим DIV. И это не сработало должным образом.

Я провел дополнительный поиск и обнаружил, что это старая ошибка в jQuery с полями и отступами, примененными к DIV. Решение состоит в том, чтобы обернуть DIV в другой DIV. В моем случае это не помогло.

Продолжая поиск, я обнаружил этот пост Анимация слайд-слайда повторно посещена . Это исправляет скачок на одном конце, но не на другом ( Test2 in jQuery Slide test ).

На переполнении стека я нашел это jQuery IE анимация отрывистого слайда . В комментариях я увидел, что проблема с тегом P внутри DIV. Если я заменю P-теги на DIV-теги, которые решают проблему, но это не является правильным решением.

Наконец я нашел это Странное поведение jQuery, слайд . Прочитав его, я понял, что проблема, решаемая переключением с тега P на DIV, заключалась в полях P (отсутствует в DIV) и коллапсе полей между элементами. Поэтому, если я переключу поля на отступы, это решит проблему. Но я теряю рушащееся поведение полей, которое я хочу.

Честно говоря, я могу сказать, что мой первый опыт работы с jQuery не очень хорош. Если я хочу использовать один из самых простых эффектов в jQuery, я должен не использовать правильную функцию (slideToggle), а вместо этого использовать некоторый код, сделанный вручную, и оборачивать DIV в другой DIV, а также переключать поля в отступы, портя мой макет.

Я пропустил более простое решение?

Как подсказывает krdluzni, я пытался написать как собственный скрипт с помощью метода animate. Вот мой код:

var $div = $('#note_2').parent();
var height = $div.height();

$('#link2').click(
    function () {
        if ( $div.height() > 0 ) {
            $div.animate({ height: 0 }, { duration: 5000 }).css('overflow', 'hidden');
        } else {
            $div.animate({ height : height }, { duration: 5000 });
        }

        return false;
});

Но это тоже не работает, потому что jQuery всегда устанавливает переполнение на видимое в конце анимации. Таким образом, DIV снова появляется в конце анимации, но накладывается на остальную часть контента.

Я пробовал также с UI.Slide (и Scale and Size). Это работает, но содержимое под DIV не перемещается с анимацией. Это только прыжок в конце / начале анимации, чтобы заполнить пробел. Я не хочу этого

UPDATE:

Одной из частей решения является динамическая установка высоты контейнера DIV перед чем-либо. Это решить одним прыжком. Но не единственная причина разрушения маржи. Вот код:

var parent_div = $("#note_1").parent();
parent_div.css("height", parent_div.height()+"px");
parent_div.hide();

ВТОРОЕ ОБНОВЛЕНИЕ:

Вы можете увидеть ошибку на собственном сайте jQuery на этой странице (пример B): Обучающие программы: живые примеры jQuery

ТРЕТЬЕ ОБНОВЛЕНИЕ:

Пробовал с jQuery 1.4, больше никаких шансов: - (

Ответы [ 28 ]

2 голосов
/ 27 марта 2013

css padding и jquery slideToggle не работают вместе. Попробуйте убрать отступы.

1 голос
/ 13 октября 2009

Вам просто нужно изменить эффекты up, down в effect.js, чтобы они учитывали поля или отступы, которые могут существовать, а затем скорректировать то, что они воспринимают как общий размер элемента для соответствия этим значениям ... что-то в этом роде ....

Effect.BlindDown = function(element) {
  element = $(element);
  var elementDimensions = element.getDimensions();

//below*
  var paddingtop = parseInt(element.getStyle('padding-top'));
  var paddingbottom = parseInt(element.getStyle('padding-bottom'));
  var totalPadding = paddingtop + paddingbottom;

  if(totalPadding > 0)
  {
   elementDimensions.height = (elementDimensions.height - totalPadding);
  }
//above*

  return new Effect.Scale(element, 100, Object.extend({
    scaleContent: false,
    scaleX: false,
    scaleFrom: 0,
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
    restoreAfterFinish: true,
    afterSetup: function(effect) {
      effect.element.makeClipping().setStyle({height: '0px'}).show();
    },
    afterFinishInternal: function(effect) {
      effect.element.undoClipping();
    }
  }, arguments[1] || { }));
};
1 голос
/ 17 февраля 2012

Попробуйте установить свойство 'position' контейнера (в данном случае .notice div) в'lative '.

работал для меня. Источник: высота slideToggle "прыгает"

1 голос
/ 04 октября 2012

Здесь много предложений и много рассуждений о том, что работает. Для меня проблема поведения заключалась в том, что анимация расширения контейнера чрезмерно расширялась и затем возвращалась к правильной высоте расширения (все это было сделано как часть одной анимации). В качестве примера, анимация изначально будет расширяться до высоты 500 пикселей, а затем уменьшаться до 450 пикселей. С обвалом проблем не было.

Решение, которое работало, состояло в том, чтобы добавить в расширяющийся / сворачивающийся div, CSS: пробел: nowrap;

Это сработало отлично - плавное расширение до нужной высоты.

1 голос
/ 23 декабря 2014

Проблема в том, что вы выполняете действие над родителем, при этом удаляется CSS, связанный с этим элементом.

Вам нужно запустить слайд на заметке 1, а не на родительской заметке 1.

У меня была та же проблема, и я исправил ее, опустив уровень.

0 голосов
/ 10 октября 2009

Вы можете попробовать добавить doctype, если у вас его нет, он работал для меня в IE8 после того, как я нашел здесь предложение по SO: jQuery slideToggle переходит вокруг . Он предлагает строгое DTD, но я просто использовал тип документа, который использует google.com: <!doctype html>, и это решило мою проблему.

0 голосов
/ 19 октября 2015

Я только что узнал, что эта проблема также может возникать, если в раскрывающемся / разрушающемся элементе есть плавающие элементы. В этом случае исправление (clear: both;) в конце (все еще внутри) анимированного элемента может избавиться от него.

0 голосов
/ 07 февраля 2015

У меня была такая же проблема. Я исправил это, добавив это:

.delay(100)

Догадаешься, что больше времени для размышлений помогает?

0 голосов
/ 17 января 2014

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

Spark Notes : загрузить страницу как обычно, собрать высоту каждого элемента, который вы хотите переключить, сохранить эту высоту в специальном атрибуте данных, а затем свернуть каждый элемент. Тогда это так же просто, как изменить max-height между значением в атрибуте data-height элемента (развернуто) и нулем (свернуто). Если вы хотите добавить к элементам дополнительные отступы, поля и т. Д., Я рекомендую хранить их в отдельном классе CSS для добавления и удаления с помощью свойства max-height.

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

HTML

<ul id="foo">
   <li>
      <h2>Click Me 1</h2>
      <div class="bar">Content To Toggle Here 1</div>
   </li>
   <li>
      <h2>Click Me 2</h2>
      <div class="bar">Content To Toggle Here 2</div>
   </li>
</ul>

CSS

#foo>li>div.bar {transition: all 0.5s;
   overflow: hidden;}

JQuery

$('#foo h2').each(function(){
   var bar = $(this).siblings('.bar');
   bar.attr('data-height', bar.height()); //figure out the height first
   bar.css('max-height', '0px'); //then close vertically
});
$('#foo h2').click(function(){
   var bar = $(this).siblings('.bar');
   if ( bar .css('max-height') == '0px' ){ //if closed (then open)
      bar.css('max-height', bar.data('height') + 'px');
   } else { //must be open (so close)
      bar.css('max-height', '0px');
   }
});

Вот рабочий JSFiddle : http://jsfiddle.net/baacke/9WtvU/

0 голосов
/ 20 апреля 2012

В моем случае я решил это, добавив style="white-space:nowrap;" к элементу, чтобы предотвратить ошибки в функции jQuery; нет необходимости устанавливать фиксированную ширину, если вам не нужно оборачиваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...