T J*_*T J 27 javascript css jquery jquery-ui angularjs
我正在尝试为用户设置动画,从不同的项目集中选择项目.该项目应从单击的集合设置为所选项目列表中的新位置.
在下面的演示中,将粉红色框视为可用项目,将边框视为所选项目列表(蓝色框).用户可以通过单击任一粉红色框来选择项目:
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
});
}
});
});
}
};
});Run Code Online (Sandbox Code Playgroud)
.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;
}Run Code Online (Sandbox Code Playgroud)
<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>Run Code Online (Sandbox Code Playgroud)
好吧,它有点工作 - 但我使用jQuery-ui找出起始位置(粉红色框的位置在响应式设计中会保持警惕)和jquery动画方法来动画元素.
此外,我必须将单击的方向存储在范围内,并且我将初始位置和动画设置为enter事件侦听器中的结束位置.
我一直在阅读和尝试很多内置动画钩子的角度,但无法找出一个适当的方式来动画来自相对/动态位置的元素.
有没有更好的方法来实现角js方式相同的用户体验..?
如果我正确理解了你的问题(如果没有,请告诉我);我认为解决这个问题的一种方法是这样的:
假设您的产品的尺寸(宽度)恒定 - 设置为 50px 或其他 - ;您可以将粉红色元素的位置设置为绝对;然后对粉红色元素使用 ng-repeat,并在 html 中添加一个简短的 ng-style 属性,如下所示:
<div ng-repeat="item in products" ng-style="{'left': $index*50 + 'px'}" ng-click="add-to-purchased($index)"></div>
Run Code Online (Sandbox Code Playgroud)
关于购买的产品:在“add-to-purchased”函数中,不要在“purchased”数组上使用ng-repeat,在将产品推送到“purchased”数组后,您可以简单地将产品动画到“top” : '到边框元素的高度距离'" 和 "left" 等于 {$scope.purchased.length*50 + 'px'}。然后使用 ng-class (带有切换开关)添加一个类来进行着色和其他 css 内容...(您也可以考虑颜色变化的过渡。正如您可能知道的那样)
我还认为您可以使用 ng 类处理不同的高度和顶部问题(以防产品数量超过一行的容量),该类根据以下内容添加具有新“顶部”值的类: ($index > some- number),以及上部元素(位于有边框元素顶部的元素)的另一个 ng-class,改变它的高度...
我希望这可以帮到你
更新:
不幸的是我没有很好地理解这个问题。但现在看看这个问题,我认为有一种方法可以更动态地做到这一点。
在函数内部$scope.purchase,您可以像这样向指令发送消息并$broadcast传递单击的元素(对于 stock 中的任何元素,无论是否使用 ng-repeat 创建):
<div class="stock" ng-click="purchase($event)"></div>
Run Code Online (Sandbox Code Playgroud)
和:
$scope.purchase = function(event) {
$scope.purchased.push($scope.products.pop());
$scope.$broadcast('purchaseHappened', event.target);
};
Run Code Online (Sandbox Code Playgroud)
并在您的指令中放置事件侦听器:
scope.$on('purchaseHappened', function(event, target) {
//catch target in here, and then use it's position to animate the new elements...
})
Run Code Online (Sandbox Code Playgroud)
我认为您还可以使用target.getBoundingClientRect()来获取元素相对于视口(.top、、.left...)的位置,而不是 jquery-ui,.position如果您愿意...
是否更接近解决方案?
| 归档时间: |
|
| 查看次数: |
991 次 |
| 最近记录: |