Javascript 设置div元素的动画,以更改其在div列表中的位置

Javascript 设置div元素的动画,以更改其在div列表中的位置,javascript,jquery,css,meteor,Javascript,Jquery,Css,Meteor,我试图在div元素在排序的div列表中重新定位时设置它的动画,这样它就不会立即跳转,而是平滑过渡。列表数据来自Mongo集合,每个文档生成一个模板(一个div元素)。每个文档都有一个“投票”属性,根据该属性对列表进行排序。登录的用户可以为每一篇文章投票一次,如果一篇文章达到更高的投票数,它将被重新定位 我在看《发现流星》这本书,以防有人熟悉。这是通过设置CSS转换属性来处理的:transition:all 300ms 0ms ease in,在旧位置重新渲染文章,然后在重新渲染后更改文章的相对位

我试图在div元素在排序的div列表中重新定位时设置它的动画,这样它就不会立即跳转,而是平滑过渡。列表数据来自Mongo集合,每个文档生成一个模板(一个div元素)。每个文档都有一个“投票”属性,根据该属性对列表进行排序。登录的用户可以为每一篇文章投票一次,如果一篇文章达到更高的投票数,它将被重新定位

我在看《发现流星》这本书,以防有人熟悉。这是通过设置CSS转换属性来处理的:
transition:all 300ms 0ms ease in,在旧位置重新渲染文章,然后在重新渲染后更改文章的相对位置。当然,后者是在onRendered函数中处理的

问题就从这里开始。显然,一旦div元素获得足够的票数来更改其位置,onRendered就不会触发

所以,我的问题是:一旦列表被重新排序,如何设置元素改变位置的动画

编辑:以下是代码:

Template.postItem.onRendered(function(){
    //animate post from previous position to new position
    console.log(/*something so I know the onRendered function is firing*/);
    var instance = this;
    var rank = instance.data._rank;

    var $this = $(this.firstNode);
    var postHeight = 80;
    var newPosition = rank * postHeight;

    //if element has currentPosition (i.e. is not first ever rendered)
    if(typeof(instance.currentPosition)!=='undefined'){
        var previousPosition = instance.currentPosition;
        //calculate difference between old position and new position and send
        //element there
        var delta = previousPosition - newPosition;
        $this.css("top", delta + "px");
    }

    //let it draw in the old position, then...
    Meteor.defer(function(){
        instance.currentPosition = newPosition;
        //bring element back to its new original position
        $this.css("top", "0px");
    });
});

我建议使用Blaze's。您可以注册一个钩子,当Blaze打算移动相应的DOM元素时将调用该钩子

例如:

var hook = {
    moveElement: function(node, next) {
        var $node = $(node);
        /* Add animation code. */
        $node.animate();
    }
}

Template.postItem.onRendered(function() {
    /* Set hook to first node. */
    this.firstNode._uihooks = hook;
    /* Or to any other DOM element. */
    this.find('.postItem')._uihooks = hook;
});

我建议使用Blaze's。您可以注册一个钩子,当Blaze打算移动相应的DOM元素时将调用该钩子

例如:

var hook = {
    moveElement: function(node, next) {
        var $node = $(node);
        /* Add animation code. */
        $node.animate();
    }
}

Template.postItem.onRendered(function() {
    /* Set hook to first node. */
    this.firstNode._uihooks = hook;
    /* Or to any other DOM element. */
    this.find('.postItem')._uihooks = hook;
});

你的代码是…?你的代码是。。。?