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

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 ]

0 голосов
/ 26 сентября 2011

У меня была такая же проблема с 'jerkyness' с divs внутри моего тега nav - моя цель - показать неупорядоченный список при наведении курсора на div (если он существует).Мои списки создаются динамически, поэтому они не имеют фиксированного значения.

Вот исправление:

$("nav div").hover(
  function() { // i.e. onmouseover function

    /****simple lines to fix a % based height to a px based height****/
    var h = jQuery(this).find("ul").height(); //find the height
    jQuery(this).find("ul").css("height", h); 
                         //set the css height value to this fixed value
    /*****************************************************************/

    jQuery(this).find("ul").slideDown("500");
  },
  function(){ // i.e. onmouseout function
    jQuery(this).find("ul").slideUp("500");
  });
});
0 голосов
/ 19 июля 2012

Убедитесь, что у вас нет CSS-правил перехода, установленных глобально или в вашем контейнере или любых включенных элементах. Это также приведет к подергиванию.

0 голосов
/ 06 апреля 2016

Добавление моего решения: оказалось, что моя проблема была flexbox (только в Chrome). Я установил align-items: baseline; на родительский элемент. Установите align-self: center; для моего дочернего элемента slideToggling на всю ширину, и он сразу очистится. Отличное использование двух часов.

0 голосов
/ 06 сентября 2012

Сегодня столкнулся с этой проблемой, увидел этот вопрос и начал ковыряться, основываясь на том, что я видел здесь. Я решил нашу непростую проблему, удалив положение: относительное из CSS содержащего элемента div. Нет больше странностей после этого. Мои 2 цента.

0 голосов
/ 15 декабря 2016

Я решил это, установив:

box-sizing: content-box;
0 голосов
/ 14 мая 2013

Я использовал slideDown() вот так

$('#content').hide().delay(500).slideDown(500); 

Для меня это был основной контейнер #content элемент. Я скрывал это и затем звонил slideDown(). Я удалил свойство padding в CSS, и после этого все работало нормально. Обычно это поле, отступ или ширина, поэтому самый простой способ - закомментировать каждое свойство и проверить их 1 на 1, чтобы получить результаты.

0 голосов
/ 05 июля 2017

Для меня решение состояло в том, что у меня было определение стиля CSS как следующее:

* {
    transition: all .3s;
}

Устранить это было решением!

0 голосов
/ 21 марта 2011

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

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