Я попытался вставить и отключить DIV с помощью функции переключения jQuery, но результат всегда неустойчив в начале и/или конце анимации. Вот код js, который я использую:
$(document).ready(function(){
$('#link1').click(
function() {
$('#note_1').parent().slideToggle(5000);
}
);
И HTML:
<div class="notice">
<p>Here 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 vs Mootools я решил, что это будет хороший повод начать использовать jQuery. Поэтому моя первая необходимость заключалась в том, чтобы спустить этот DIV. И это не сработало.
Я сделал больше поиска, и я обнаружил, что старая ошибка в jQuery с запасом и отступом применяется к DIV. Решение состоит в том, чтобы обернуть DIV в другой DIV. В моем случае это не помогло.
В дальнейшем я нашел этот пост Ожидаемая анимация Slidedown. Он фиксирует прыжок с одного конца, но не на другом (Test2 in jQuery Slide test).
В переполнении стека я нашел эту jQuery IE jerky слайд-анимацию. В комментариях я увидел, что проблема связана с тегом P внутри DIV. Если я заменяю теги P тегами DIV, которые исправляют проблему, но это не правильное решение.
Наконец, я нашел этот слайд слайда jQuery. Читая это, я понял, что проблема, разрешенная путем переключения с P-тега на DIV, была с полями P (не присутствующими в DIV) и сбрасыванием полей между элементами. Поэтому, если я переключу поля на paddings, это устранит проблему. Но я теряю рушится поведение полей, рушится, что я хочу.
Честно говоря, я могу сказать, что мой первый опыт работы с jQuery не очень хорош. Если я хочу использовать один из простейших эффектов в jQuery, я должен не использовать правильную функцию (slideToggle), а вместо этого использовать какой-то ручной код И обернуть DIV в другой DIV и переключить поля в paddings, испортить мой макет.
Я пропустил более простое решение?
Как подсказывает krdluzni, я попытался написать как пользовательский script с помощью метода 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(и масштаб и размер). Он работает, но контент ниже DIV не перемещается с анимацией. Он только прыгает в конце/начале анимации, чтобы заполнить пробел. Я не хочу этого.
UPDATE:
Одна часть решения заключается в том, чтобы динамически устанавливать высоту контейнера DIV перед чем-либо. Это решает один прыжок. Но не одна причина, сворачивая маржу. Здесь код:
var parent_div = $("#note_1").parent();
parent_div.css("height", parent_div.height()+"px");
parent_div.hide();
ВТОРОЕ ОБНОВЛЕНИЕ:
Вы можете увидеть ошибку на собственном сайте jQuery на этой странице (пример B):
Учебники: Live Примеры jQuery
ТРЕТЬЕ ОБНОВЛЕНИЕ:
Пробовал с jQuery 1.4, больше шансов: - (
Ответ 1
Я нашел, что последовательно работает установка невидимой границы 1px:
border: 1px solid transparent;
Не нужно фиксировать ширину или высоту или что-то еще, и анимация не прыгает. Ура!
Ответ 2
Решение состоит в том, что скользящий div должен иметь ширину, заданную в пикселях. Не используйте "auto" и "%". И у вас будет отличный результат! Проблема заключается в встроенных элементах, которые находятся в скользящем div.
но если они имеют ширину в px, высота будет одинаковой. Попробуй.
Ответ 3
Сегодня я столкнулся с этой проблемой. Однако я заметил, что отключение всех CSS исправило проблему. Кроме того, я знал, что это сработало хорошо, поэтому, должно быть, это были недавние изменения, вызвавшие эту проблему.
Оказалось, что я использовал переходы в CSS для облегчения вхождения и выпадения.
Как только эти переходы были удалены из элементов, которые я добавлял, все было в порядке.
Итак, если у вас такая же проблема, просто добавьте эти строки к добавляемым элементам:
-webkit-transition: none;
-moz-transition: none;
-o-transition: none;
-ms-transition: none;
transition: none;
(Возможно, я немного злоупотреблял переходами, просто не добавляя их к элементам, для которых я хочу переходы, но использую их для всего веб-сайта.)
Ответ 4
Попробуйте удалить все поля CSS из всех элементов. Обычно резкая анимация возникает из-за того, что поля не учитываются рамкой анимации.
Ответ 5
Я считаю, что animate() является самым надежным способом анимации чего-либо в jQuery (по крайней мере, кросс-браузер).
Это динамически обертывает содержимое в div, а затем анимирует высоту этой обертки div, используя высоту ее внутреннего содержимого.
http://jsfiddle.net/BmWjy/13/
$('a').click(function(event) {
event.preventDefault();
xToggleHeight($(this).next());
});
//For each collapsible element.
$('.collapsible').each(function() {
//Wrap a div around and set to hidden.
$(this).wrap('<div style="height:0;overflow:hidden;visibility:hidden;"/>');
});
function xToggleHeight(el){
//Get the height of the content including any margins.
var contentHeight = el.children('.collapsible').outerHeight(true);
//If the element is currently expanded.
if(el.hasClass("expanded")){
//Collapse
el.removeClass("expanded")
.stop().animate({height:0},5000,
function(){
//on collapse complete
//Set to hidden so content is invisible.
$(this).css({'overflow':'hidden', 'visibility':'hidden'});
}
);
}else{
//Expand
el.addClass("expanded").css({'overflow':'', 'visibility':'visible'})
.stop().animate({height: contentHeight},5000,
function(){
//on expanded complete
//Set height to auto incase browser/content is resized afterwards.
$(this).css('height','');
}
);
}
}
Ответ 6
Отслеживание происходит, когда родительский div.wrapper в вашем случае имеет дополнение.
Наложение продолжается на дочерний div, а не на родителя. jQuery - это анимация высоты, а не отступы.
Пример:
<div class="notice">
<p>Here some text. And more text. <span id="link1">Test1</span></p>
<div class="wrapper" style="padding: 0">
<div id="note_1" style="padding: 20px">
<p>Some content</p>
<p>More blalba</p>
</div>
</div>
</div>
Надеюсь, что это поможет.
Ответ 7
Вы можете написать пользовательскую анимацию, используя метод animate. Это даст вам полный контроль над всеми деталями.
Ответ 8
Я заметил, что после вашего контейнера <div>
у вас есть <br />
, анимация также будет неустойчивой. Устранение этой проблемы устранило мою проблему.
Ответ 9
Здесь много предложений и много назад и вперед относительно того, что работает. Для меня проблема с поведением заключалась в том, что анимация расширения контейнера будет расширяться, а затем возвращаться к правильной высоте расширения (все это делается как часть одной анимации). В качестве примера анимация будет сначала расширяться до высоты 500 пикселей, а затем втягиваться в 450 пикселей. Не было проблем с коллапсом.
Решение, которое работало, состояло в том, чтобы добавить к расширяющемуся/сворачивающемуся div, CSS: white-space: nowrap;
Это сработало отлично - плавное расширение до правильной высоты.
Ответ 10
css padding и jquery slideToggle не работают хорошо. Попытайтесь заполнить пробел.
Ответ 11
Очевидно, что существует много разных решений этой проблемы - и в зависимости от вашего макета разные решения имеют разные результаты.
Вот что я (разделил)
<div>
<p>Text</p>
</div>
<div class="hidden">
<p></p>
</div>
Когда я буду использовать jQuery для отображения <div class="hidden">
, поле в элементе <p>
скроется с краем элемента <p>
над ним.
Я думал, что это странно, поскольку они были в разных <divs>
.
Мое решение состояло в том, чтобы устранить границу в нижней части <p>
. Наличие края с одной стороны предотвращает сбрасывание края с нижней части первого <p>
с вершины второго <p>
.
Это обходное решение решило мою проблему, возможно, применимо к другим, но может не работать для всех.
Ответ 12
Вам просто нужно изменить эффекты "вверх", "вниз" в эффектах. 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] || { }));
};
Ответ 13
Попробуйте установить свойство "position" контейнера (в этом случае .notice div) на "relative".
Работал для меня.
Источник: heightToggle height is "jump"
Ответ 14
Проблема в том, что вы выполняете действие над родительским, делая это удаляет CSS, связанный с этим элементом.
Вам нужно запустить слайд на заметке 1, а не в качестве родителя примечания 1.
У меня была такая же проблема, и я исправил ее, понизив уровень.
Ответ 15
Вы можете попробовать добавить doctype, если у вас его нет, он работал у меня в IE8 после того, как я нашел предложение здесь на SO: jQuery slideToggle подскакивает, Он предлагает строгий DTD, но я просто использовал doctype, который использует google.com: <!doctype html>
, и он исправил мою проблему.
Ответ 16
Я наткнулся на ту же ошибку, что и в течение нескольких дней, чтобы найти решение. проблема в том, когда элемент скрыт. jquery получает неправильную высоту. верхнее исправление, вы должны получить высоту перед тем, как скрыться, и использовать пользовательскую анимацию на этой высоте. его сложный путь здесь для лучшего объяснения
Ответ 17
У меня была такая же проблема с "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");
});
});
Ответ 18
В моем случае я решил добавить элемент style="white-space:nowrap;"
в элемент, чтобы предотвратить просчеты функции jQuery; нет необходимости устанавливать фиксированную ширину, если вам не требуется обернуть.
Ответ 19
Удостоверьтесь, что у вас нет правил перехода CSS, установленных глобально или в вашем контейнере или в любых входящих элементах. Это также вызовет дерзость.
Ответ 20
В этот вопрос встал сегодня, увидел этот вопрос и начал возиться с тем, что я увидел здесь. Я решил нашу нерешительную проблему, удалив позицию: относительно CSS содержащего div. После этого больше нет странности. Мои 2 цента.
Ответ 21
Я использовал slideDown()
как этот
$('#content').hide().delay(500).slideDown(500);
Для меня это был основной контейнер #content
. Я скрывал его, а затем вызывал slideDown()
. Я удалил свойство padding
в CSS, и после этого все сработало. Обычно это margin, padding или% width, поэтому самый простой метод - это комментирование каждого свойства и тестирование их 1 на 1 для получения ваших результатов.
Ответ 22
У меня была одна и та же проблема, но ни один из предлагаемых решений не работал у меня, поэтому я предлагаю решение, которое полностью исключает slideToggle()
.
Исправленные заметки. Загрузите страницу как обычно, соберите высоту каждого элемента, который хотите переключить, сохраните эту высоту в специальном атрибуте данных и затем скомпрометируйте каждый элемент. Тогда это так же просто, как изменить 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/
Ответ 23
У меня была такая же проблема. Я исправил это, добавив следующее:
.delay(100)
Угадайте, что больше времени на размышления помогает?
Ответ 24
Я только что узнал, что эта проблема также может возникнуть, если в расширяющемся/свертывающемся элементе есть плавающие элементы. В этом случае clearfix (clear: both;) в конце (все еще внутри) анимированный элемент может избавиться от него.
Ответ 25
Добавление моего решения: оказалось, что моя проблема была flexbox (только в хром). Я установил align-items: baseline;
в родительский элемент. Установите align-self: center;
в мой дочерний элемент slideToggling full-width, и он очистит его. Большое использование двух часов.
Ответ 26
Я решил это, установив:
box-sizing: content-box;
Ответ 27
Для меня устранена минимальная высота из моего контейнера.
Ответ 28
Для меня решение состояло в том, что у меня было определение стиля CSS, например:
* {
transition: all .3s;
}
Удаление этого было решением!