Так что это может быть очень просто, но я еще не смог найти никаких примеров, на которых можно было бы поучиться, поэтому, пожалуйста, терпите меня. ;)
Вот в основном то, что я хочу сделать:
<div>Lots of content! Lots of content! Lots of content! ...</div>
....
$("div").html("Itsy-bitsy bit of content!");
Я хочу плавно анимировать между размерами div с большим количеством содержимого и размерами div с очень небольшим количеством, когда вводится новый контент.
Мысли?

может как то так?
$(".testLink").click(function(event) {
event.preventDefault();
$(".testDiv").hide(400,function(event) {
$(this).html("Itsy-bitsy bit of content!").show(400);
});
});
Близко к тому, что, я думаю, вы хотели, также попробуйте slideIn / slideOut или посмотрите плагин UI / Effects.
Вы можете использовать анимированный метод.
$("div").animate({width:"200px"},400);
Идеальный! Я просто добавил $("div").stop(true,true); прямо перед тем, как вызвать ваше заявление, чтобы убедиться, что анимация не стоит в очереди.
Привет, meyahoocoma4c5ki0pprxr19sxhajsogo6jgks5dt.
Вы можете обернуть «div содержимого» «внешним div», для которого задано абсолютное значение ширины. Добавьте новый контент с помощью метода hide () или animate ({width}), как показано в других ответах. Таким образом, страница не перекомпоновывается между ними, потому что div-оболочка имеет постоянную ширину.
Попробуйте этот плагин jQuery:
// Animates the dimensional changes resulting from altering element contents
// Usage examples:
// $("#myElement").showHtml("new HTML contents");
// $("div").showHtml("new HTML contents", 400);
// $(".className").showHtml("new HTML contents", 400,
// function() {/* on completion */});
(function($)
{
$.fn.showHtml = function(html, speed, callback)
{
return this.each(function()
{
// The element to be modified
var el = $(this);
// Preserve the original values of width and height - they'll need
// to be modified during the animation, but can be restored once
// the animation has completed.
var finish = {width: this.style.width, height: this.style.height};
// The original width and height represented as pixel values.
// These will only be the same as `finish` if this element had its
// dimensions specified explicitly and in pixels. Of course, if that
// was done then this entire routine is pointless, as the dimensions
// won't change when the content is changed.
var cur = {width: el.width()+'px', height: el.height()+'px'};
// Modify the element's contents. Element will resize.
el.html(html);
// Capture the final dimensions of the element
// (with initial style settings still in effect)
var next = {width: el.width()+'px', height: el.height()+'px'};
el .css(cur) // restore initial dimensions
.animate(next, speed, function() // animate to final dimensions
{
el.css(finish); // restore initial style settings
if ( $.isFunction(callback) ) callback();
});
});
};
})(jQuery);
Комментатор RonLugge отмечает, что это может вызвать проблемы, если вы вызовете его дважды для одного и того же элемента (элементов), где первая анимация не завершилась до начала второй. Это связано с тем, что вторая анимация примет текущие (середина анимации) размеры в качестве желаемых «конечных» значений и продолжит исправлять их в качестве конечных значений (эффективно останавливая анимацию на ее дорожках, а не приближая ее к «естественному» размеру. ) ...
Самый простой способ решить эту проблему - вызвать stop() перед вызовом showHtml() и передать true для второго параметра (jumpToEnd):
$(selector).showHtml("new HTML contents")
.stop(true, true)
.showHtml("even newer contents");
Это приведет к немедленному завершению первой анимации (если она все еще выполняется) перед началом новой.
В чем смысл переменной финиша? А чем он отличается от cur?
@ecoffey: finish содержит начальное и конечное значения для стилей width и height. Он всегда будет отличаться от cur, который представляет стили, необходимые для фиксации элемента на его исходной ширине и высоте; если бы они были одинаковыми, тогда размеры элемента не менялись бы вместе с его содержимым, и эта анимация была бы бессмысленной!
вы должны возвращать this.each
@ Shog9: ну ладно, спасибо; Думаю, у меня было другое предположение о том, что происходило. Возможно, мне стоит просто ctrl + c / ctrl + v этот код и посмотреть, как он работает, прежде чем я продолжу его критиковать :-P
Этот код подвержен ошибкам, если два вызова подходят слишком близко друг к другу - например, если запрос AJAX для нового содержимого возвращается достаточно быстро, чтобы произойти, пока анимация для «AJAX QUERY RUNNING» все еще выполняется.
@Ron: если вы запускаете две анимации подряд, они могут мешать ... Не думаю, что я это продемонстрировал, но если вы действительно хотите использовать загрузочную анимацию, то можно сделать промежуточный вызов stop().
Спасибо за быстрый ответ! Куда бы вы поместили промежуточный вызов stop ()? Я попытался поставить его непосредственно перед вызовом второго .showHtml (), но это не сработало.
@Ron: вам нужно заставить текущую анимацию на самом деле полный (а не просто останавливаться), передав true для второго параметра в stop(). Я обновил ответ подробностями.
Спасибо! Я не хотел открывать свой вопрос, когда, честно говоря, этот был на 99,9999% от необходимого мне решения. Вроде избыточно.
Вот как я это исправил, надеюсь, это будет полезно! Анимация на 100% плавная :)
HTML:
<div id = "div-1"><div id = "div-2">Some content here</div></div>
Javascript:
// cache selectors for better performance
var container = $('#div-1'),
wrapper = $('#div-2');
// temporarily fix the outer div's width
container.css({width: wrapper.width()});
// fade opacity of inner div - use opacity because we cannot get the width or height of an element with display set to none
wrapper.fadeTo('slow', 0, function(){
// change the div content
container.html("<div id=\"2\" style=\"display: none;\">new content (with a new width)</div>");
// give the outer div the same width as the inner div with a smooth animation
container.animate({width: wrapper.width()}, function(){
// show the inner div
wrapper.fadeTo('slow', 1);
});
});
Может быть и более короткая версия моего кода, но я просто сохранил ее вот так.
идея иметь fadeIn внутри успешного события fadeOut никогда не приходила мне в голову, спасибо!
На самом деле это обратный звонок, а не успешное событие
Это делает мою работу за меня. Вы также можете добавить ширину временного блока div.
$('div#to-transition').wrap( '<div id = "tmp"></div>' );
$('div#tmp').css( { height: $('div#to-transition').outerHeight() + 'px' } );
$('div#to-transition').fadeOut('fast', function() {
$(this).html(new_html);
$('div#tmp').animate( { height: $(this).outerHeight() + 'px' }, 'fast' );
$(this).fadeIn('fast', function() {
$(this).unwrap();
});
});
Вы можете сгладить анимацию jQuery с помощью dequeue. Перед запуском новой анимации проверьте наличие класса (устанавливается при наведении курсора и удаляется при обратном вызове анимации mouseOut). Когда новая анимация действительно начнется, удалите из очереди.
var space = ($(window).width() - 100);
$('.column').width(space/4);
$(".column").click(function(){
if (!$(this).hasClass('animated')) {
$('.column').not($(this).parent()).dequeue().stop().animate({width: 'toggle', opacity: '0.75'}, 1750,'linear', function () {});
}
$(this).addClass('animated');
$('.column').not($(this).parent()).dequeue().stop().animate({width: 'toggle', opacity: '0.75'}, 1750,'linear', function () {
$(this).removeClass('animated').dequeue();
});
$(this).dequeue().stop().animate({
width:(space/4)
}, 1400,'linear',function(){
$(this).html('AGAIN');
});
});
Демонстрация настроена как 5 столбцов полной высоты, щелчок по любому из столбцов со 2 по 5 будет анимировать ширину переключения остальных 3 и переместить выбранный элемент в крайнее левое положение.


Чтобы использовать решение плагина jquery (слишком низкая репутация, чтобы добавить это в качестве комментария), jQuery.html () удалит все обработчики событий в добавленном html. Меняется:
// Modify the element's contents. Element will resize.
el.html(html);
к
// Modify the element's contents. Element will resize.
el.append(html);
сохранит обработчики событий элементов "html"
Не совсем то, что я хотел. При этом Div сжимается до нуля, прежде чем снова расшириться. Я хочу устранить эту среднюю усадку, чтобы она перешла непосредственно к новым размерам, не обнуляя промежуточные значения. Имеет ли это смысл? Похоже, что ни одна из демонстраций пользовательского интерфейса / эффектов этого не делает.