I want to create a slider for some objects that are contained in an unordered list, using ng-show and animations. I have this working well when the objects are sliding in one direction.
However, when I want the user to be able to slide objects left or right, using ng-class to change the class, the animations no longer work.
The html for the left/right case is:
<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>
The functions in the controller for changing the direction are:
$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;
};
The transitions css looks like this:
.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%;
}
I have created a plnkr to show both cases: http://plnkr.co/edit/sh0uCAPZiCne4Y5ynFQ2?p=preview
EDIT 1: I've updated the plnkr to fix the '===' mistake in the controller which was causing the switching of direction to malfunction, as per the answer by Theoretisch. However, the main ng-class problem and animation problem remains. Here is the update plnkr: http://plnkr.co/edit/lv1BBFjRoOmenTv7IBeC?p=preview
The reason why the animation isn't working is because the ===
in the functions of your controller.
Instead of the ===
you should use just =
because you don't want to compare $scope.direction
with your string.
$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;
};
Now the animation works again.
But there are some more things to do if you want a good and correct animation.
One of them e.g. is to change your css.
If you slow down your animation you can see that the wrong slide-object
is animated.
Just change this to correct it:
.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%;
}
I switched right
to left
and changed additionally the algebraic sign.
You can find the plunk with my changes HERE.
EDIT:
I'm not sure why the animation is so buggy. I think it is because the ng-class
.
I deleted it and edited your ng-show
.
You can see the edited Plunk HERE.
It's not the best solution, but it solves your problem for now I hope.
(Maybe you can improve it with THIS fiddle)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With