Я знаю, что эта проблема давно решена, но я решил улучшить ответ Ракеты.Мне нужно было анимировать поведение не только appendTo, но и prependTo, insertBefore и insertAfter, и я также хотел иметь возможность настраивать замедление и обеспечивать обратный вызов, так же, как вы можете с помощью $.fn.animate()
.
Кроме того, мойФункция оставляет позади оригинальный элемент, а не его клон, ведя себя точно так же, как appendTo.Поэтому, если у вас есть какие-либо существующие ссылки на элемент, лежащий в переменных вашего скрипта, они не сломаются.
Я также использую position: относительный, а не position: absolute для анимации, поэтому, если ширина элемента была100% своего контейнера он не выскочит и не займет 100% окна во время анимации.Однако в конце анимации он переместится на 100% от любой ширины его нового контейнера.
Вот мое решение:
$.fn.animateTo = function(appendTo, destination, duration, easing, complete) {
if(appendTo !== 'appendTo' &&
appendTo !== 'prependTo' &&
appendTo !== 'insertBefore' &&
appendTo !== 'insertAfter') return this;
var target = this.clone(true).css('visibility','hidden')[appendTo](destination);
this.css({
'position' : 'relative',
'top' : '0px',
'left' : '0px'
}).animate({
'top' : (target.offset().top - this.offset().top)+'px',
'left' : (target.offset().left - this.offset().left)+'px'
}, duration, easing, function() {
target.replaceWith($(this));
$(this).css({
'position' : 'static',
'top' : '',
'left' : ''
});
if($.isFunction(complete)) complete.call(this);
});
}
Использование:
// basic usage
$("#i-am-moving-slow").animateTo('appendTo', '#div2');
// advanced usage
$("#i-am-moving-slow").animateTo('insertAfter', '#some-other-div', 'linear', function() {
console.log("animation completed on ", this);
});
duration
и easing
будут делегированы на вызов animate
, поэтому, если вы их опустите, они будут переданы как undefined
, и jQuery будет использовать значения по умолчанию.complete
вызывается после замены элемента в конце анимации и устанавливает this
равным анимируемому элементу, как это делает обратный вызов $.fn.animate()
.