我想使用ng-show和动画为无序列表中的某些对象创建一个滑块。当物体向一个方向滑动时,我的效果很好。
但是,当我希望用户能够向左或向右滑动对象时,使用ng-class更改类,动画将不再有效。
左/右案例的html是:
<div class="slide-holder">
<ul class="slide-list">
<li class="slide-object" ng-show="directionElement == 0" ng-class="{'slide-object-left': direction === 'left', 'slide-object-right': direction === 'right'}">
Hello There 1! How are you?</li>
<li class="slide-object" ng-show="directionElement == 1" ng-class="{'slide-object-left': direction === 'left', 'slide-object-right': direction === 'right'}">
Hello There 2! How are you?</li>
<li class="slide-object" ng-show="directionElement == 2" ng-class="{'slide-object-left': direction === 'left', 'slide-object-right': direction === 'right'}">
Hello There 3! How are you?</li>
<li class="slide-object" ng-show="directionElement == 3" ng-class="{'slide-object-left': direction === 'left', 'slide-object-right': direction === 'right'}">
Hello There 4! How are you?</li>
</ul>
</div>
控制器中用于改变方向的功能是:
$scope.left = function() {
$scope.direction === 'left'
if($scope.directionElement > 0)
$scope.directionElement = $scope.directionElement - 1;
};
$scope.right = function() {
$scope.direction === 'right'
if($scope.directionElement < 3)
$scope.directionElement = $scope.directionElement + 1;
};
过渡css看起来像这样:
.slide-object-left.ng-hide-add,
.slide-object-left.ng-hide-remove {
-webkit-transition:0.5s linear all;
-moz-transition:0.5s linear all;
-o-transition:0.5s linear all;
transition:0.5s linear all;
position:absolute;
}
.slide-object-left.ng-hide-add {
left:100%;
}
.slide-object-left.ng-hide-remove,
.slide-object-left.ng-hide-add.ng-hide-add-active {
left:0;
}
.slide-object-left.ng-hide-remove.ng-hide-remove-active {
left:-100%;
}
我创建了一个plnkr来显示两种情况:http://plnkr.co/edit/sh0uCAPZiCne4Y5ynFQ2?p=preview
编辑1:根据Theoretisch的回答,我更新了plnkr以修复控制器中的'==='错误,该错误导致方向切换为故障。但是,主要的ng类问题和动画问题仍然存在。这是更新plnkr:http://plnkr.co/edit/lv1BBFjRoOmenTv7IBeC?p=preview
答案 0 :(得分:5)
动画不起作用的原因是因为控制器功能中的===
。
您应该只使用===
代替=
,因为您不想将$scope.direction
与字符串进行比较。
$scope.left = function() {
$scope.direction = 'left'
if($scope.directionElement > 0)
$scope.directionElement = $scope.directionElement - 1;
};
$scope.right = function() {
$scope.direction = 'right'
if($scope.directionElement < 3)
$scope.directionElement = $scope.directionElement + 1;
};
现在动画再次运作。
但是如果你想要一个好的和正确的动画,还有一些事情要做。
其中一个,例如是改变你的CSS。
如果您减慢动画速度,可以看到错误的slide-object
已设置动画。
只需更改此内容即可更正:
.slide-object-left.ng-hide-add {
right:-100%;
}
.slide-object-left.ng-hide-remove,
.slide-object-left.ng-hide-add.ng-hide-add-active {
right:0;
}
.slide-object-left.ng-hide-remove.ng-hide-remove-active {
right:100%;
}
.slide-object-right.ng-hide-add {
left:-100%;
}
.slide-object-right.ng-hide-remove,
.slide-object-right.ng-hide-add.ng-hide-add-active {
left:0%;
}
.slide-object-right.ng-hide-remove.ng-hide-remove-active {
left:100%;
}
我将right
切换为left
并另外更改了代数符号。
您可以通过我的更改 HERE 找到插件。
编辑:
我不确定为什么动画会这么多。我认为这是因为ng-class
。
我删除了它并编辑了ng-show
。
您可以看到编辑过的Plunk HERE。
它不是最好的解决方案,但它现在解决了我的问题,我希望。
(也许你可以用THIS小提琴来改进它)