我正在 angularjs 中开发一个项目,该项目有一个实时更新的对象列表,每次更新都会重新排序。我想让这些对象从它们的开始位置平滑地移动到它们的结束位置,例如,当列表重新排序是:
A C
B -> A
C B
A 和 B 将分别下降一个位置,C 将上升两个位置,速度是原来的两倍。当您手动操作 DOM 时,这很容易完成 - 如果您通过更改其 style.top 来移动列表元素,您只需放置
transition-duration: 0.5s, 0.5s;
transition-property: top;
进入元素的CSS,它会自动发生。但是,如果您使用 ngRepeat 来显示列表,则此技巧将不起作用,因为(据我所知)角度实际上重新创建了构成列表的 DOM 元素以进行更新,而不是移动 DOM 元素。
不幸的是,我发现很难用角度动画重现这个功能。我遇到的问题是角度移动动画似乎不知道每个元素的起始位置。使用 ngAnimate 指令,您可以在元素移动时自动在元素上设置一个 css 类,例如模拟它淡入或淡出。但是你没有关于元素曾经在哪里的信息,所以你不能从它的旧位置平滑地移动它——它只是被传送到新的位置,你必须让它在那里跳舞。据我所知,javascript 动画也是如此 - 角度将其传送到位,然后将其传递给您的函数,而无需任何历史信息。
有没有一种方法可以在不放弃框架并自己处理 DOM 操作的情况下实现上述平滑的重新排序动画?