【发布时间】:2016-04-24 20:47:20
【问题描述】:
我正在尝试为用户从不同的项目集中选择项目设置动画。 该项目应该从被点击的集合动画到它在选定项目列表中的新位置。
在下面的演示中,将粉色框视为可用项目,将带边框的框视为选定项目的列表(蓝色框)。用户可以通过单击任一粉红色框来选择一个项目:
angular.module('test', ['ngAnimate'])
.controller('testCtrl', function($scope) {
$scope.products = [{}, {}, {}, {}];
$scope.purchased = [{}];
$scope.purchase = function(dir) {
$scope.direction = dir
$scope.purchased.push($scope.products.pop());
};
})
.directive('testDir', function($animate) {
return {
link: function(scope, element) {
$animate.on('enter', element, function(element, phase) {
$target = scope.direction == 'left' ? $('.stock:first') : $('.stock:last');
element.position({
my: 'center',
at: 'center',
of: $target,
using: function(pos, data) {
$(this).css(pos);
$(this).animate({
top: 0,
left: 0
});
}
});
});
}
};
});
.stock {
display: inline-block;
width: 50px;
height: 50px;
background: hotpink;
}
.stock.right {
margin-left: 100px;
}
.product {
height: 50px;
width: 50px;
border: 1px solid;
}
.purchased {
height: 60px;
margin-top: 100px;
border: 2px dotted;
}
.purchased .product {
display: inline-block;
margin: 5px;
background: dodgerblue;
}
<script src="https://code.jquery.com/jquery-2.1.3.min.js"></script>
<script src="https://code.jquery.com/ui/1.11.2/jquery-ui.js"></script>
<script src="https://code.angularjs.org/1.4.8/angular.js"></script>
<script src="https://code.angularjs.org/1.4.8/angular-animate.js"></script>
<div ng-app="test" ng-controller="testCtrl">
<div class="stock" ng-click="purchase('left')"></div>
<div class="stock right" ng-click="purchase('right')"></div>
<div class="purchased clearfix">
<div class="product" ng-repeat="product in purchased" data-test-dir>
</div>
</div>
</div>
嗯,它有点工作 - 但我正在使用 jQuery-ui 来找出起始位置(粉红色框的位置在响应式设计中会很谨慎)和 jquery animate 方法来为元素设置动画。
此外,我还必须将点击的方向存储在范围内,并在 enter 事件侦听器中设置初始位置和动画到结束位置。
我一直在阅读和尝试很多内置动画钩子的角度,但无法找到从相对/动态位置为元素设置动画的正确方法。
有没有更好的方法来以 Angular js 方式实现相同的用户体验..?
【问题讨论】:
-
您是否尝试在不使用任何 jquery ui 的情况下实现相同的行为?
-
@kiran 使用 jQuery UI 查找位置很好。我认为会有更好的方法来构造它的角度,比如不必在控制器范围内存储点击的方向......我也不认为在
$animate.on('enter'中做整个事情是正确的方式 -
查看 ng-animate-ref 可能会有所帮助,因为它可以根据需要在应用程序区域中为元素设置动画。我认为它通常意味着一对一的关系,所以如果你的元素可以像你的演示一样产生多个实例,那么你可能需要挂钩动画的结尾并在完成后拉出引用,以便下一次迭代不会为多个元素设置动画。文档:docs.angularjs.org/api/ngAnimate
-
@ColtMcCormack 这仅在视图之间转换时有效...
-
看起来不错,您可能只想将模型附加到 Div,这样您就可以循环购买,然后您将在其中拥有模型和数据集以进行相应的遍历和处理。跨度>
标签: javascript jquery css angularjs jquery-ui