2012-03-27 66 views
-1

尝试使用jQuery或jQuery-UI将元素从一个元素附加到另一个元素时,实现任何移动效果。appendTo()动画

<div id='div1'><div id='i-am-moving-slow'></div></div> 
<div id='div2'></div> 

$('#i-am-moving-slow').appendTo('#div2'); 

请帮忙。谢谢。

编辑:http://jsfiddle.net/5936t/

回答

6

您可以将元素的克隆附加到新点,但保持隐藏状态。将原始元素动画化为新点,然后删除旧元素并显示新元素。

我做了一个插件来做到这一点。试试这个:

$.fn.animateAppendTo = function(sel, speed) { 
    var $this = this, 
     newEle = $this.clone(true).appendTo(sel), 
     newPos = newEle.position(); 
    newEle.hide(); 
    $this.css('position', 'absolute').animate(newPos, speed, function() { 
     newEle.show(); 
     $this.remove(); 
    }); 
    return newEle; 
}; 


$('#i-am-moving-slow').click(function() { 
    $(this).animateAppendTo('#div2', 1000); 
});​ 

DEMO:http://jsfiddle.net/5936t/36/

+1

看起来很干净,但我认为用jQuery我可以用较少的代码来完成。=) – 2012-03-27 16:33:15

+0

问题是,没有内置的方法来做你想做的事情。所以,我做了一个:-)从现在开始,您可以使用'animateAppendTo' :-P – 2012-03-27 16:38:34

+0

不适用,如果该项目的宽度是从父容器继承的100%。克隆的项目全尺寸出来 – 2012-10-30 05:12:33

1

可能这是你想要的

HTML

<div id='div1'><div id='i-am-moving-slow'>i-am-moving-slow</div></div> 
<div id='div2'>div2</div> 

JS

$('#div2') 
.append($('#i-am-moving-slow') 
.css({'margin-left':-$(this).width()+'px'}) 
.delay(500) 
.animate({'margin-left':'0px'}, 'slow'));​ 

这里一个example

如果你想附加一个副本,那么你应该克隆它,并使用克隆here is another example

+0

如果你只想使用淡入淡出效果,那么试试这个http://jsfiddle.net/q94VF/8/ – 2012-03-27 16:25:58

2

我知道这个问题是长期的解决,但我还是决定在火箭的答复得到改善。我需要为appendTo,prependTo,insertBefore和insertAfter的行为设置动画,我还希望能够自定义缓动并提供回调,就像您可以使用$.fn.animate()一样。

另外,我的函数留下原始元素而不是其克隆,其行为完全像appendTo。因此,如果您有任何对脚本变量中存在的元素的引用,它们将不会中断。

我也使用position:relative而不是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); 
}); 

durationeasing将被委托给animate调用,因此,如果你离开他们了,他们将在通过为undefined和jQuery将使用默认值。 complete在元素替换发生在动画结束后被调用,并且设置this等于被动画元素,就像$.fn.animate()的回调一样。