var app = angular.module('plunker', ['ngAnimate']);
app.controller('MainCtrl', function($scope) {
$scope.images = [{
image: 'https://c2.staticflickr.com/6/5135/5516993121_10f879e777_b.jpg'
}, {
image: 'https://c2.staticflickr.com/6/5057/5493576767_b71d1e71b6_b.jpg'
}, {
image: 'https://c2.staticflickr.com/6/5017/5493573511_748c1c86c3_b.jpg'
}, {
image: 'https://farm4.staticflickr.com/3861/14631739185_4e8d59b8b6.jpg'
}, {
image: 'https://farm3.staticflickr.com/2935/14445331407_6b565dce71.jpg'
}, {
image: 'https://farm4.staticflickr.com/3866/14628491121_97658bffc7.jpg'
}, {
image: 'https://farm3.staticflickr.com/2902/14631739625_c595bbd99c.jpg'
}, {
image: 'https://farm6.staticflickr.com/5471/14445119289_ae85e6f520.jpg'
}, {
image: 'https://farm6.staticflickr.com/5482/14628491991_2284e75e33.jpg'
}];
});
app.directive('slider', function () {
return {
restrict: 'EA',
scope: {
images: '=images',
group: '=group'
},
controller: function ($scope) {
$scope.group = $scope.group || 1;
$scope.currentIndex = 0;
$scope.direction = 'left';
var init = function () {
var images = [];
var source = [];
angular.copy($scope.images, source);
for (var i = 0; i < source.length; i + $scope.group) {
if (source[i]) {
images.push(source.splice(i, $scope.group));
}
}
$scope.setCurrent(0);
$scope.slides = images;
};
$scope.$watch('group', init);
$scope.setCurrent = function (index) {
$scope.direction = (index > $scope.currentIndex) ? 'left' : 'right';
$scope.currentIndex = index;
};
$scope.isCurrent = function (index) {
return $scope.currentIndex === index;
};
$scope.next = function () {
$scope.direction = 'left';
$scope.currentIndex = $scope.currentIndex < $scope.slides.length-1 ? ++$scope.currentIndex : 0;
};
$scope.prev = function () {
$scope.direction = 'right';
$scope.currentIndex = $scope.currentIndex > 0 ? --$scope.currentIndex : $scope.slides.length-1;
};
},
templateUrl: "slider.html",
// template: '<div class="slides group-{{group}}"><div ng-repeat="slide in slides"><div ng-show="isCurrent($index)" class="slide slide-animation"><div ng-repeat="item in slide" class="image"><img ng-src="{{item.image}}" /></div></div></div><div class="controls"><div class="navigation"><a ng-click="prev()" class="prev">< Prev</a><a ng-click="next()" class="next">Next ></a></div><ul class="pagination"><li ng-repeat="slide in slides" ng-click="setCurrent($index)"><span>{{$index+1}}</span></li></ul></div></div>',
link: function (scope, element, attrs) {
scope.$watch('currentIndex', function (value, previousValue) {
console.log(value, previousValue);
});
}
};
});
app.animation('.slide-animation', function () {
return {
beforeAddClass: function (element, className, done) {
var scope = element.scope();
if (className === 'ng-hide') {
var finishPoint = element.parent().width();
if(scope.direction !== 'right') {
finishPoint = -finishPoint;
}
TweenMax.to(element, 0.5, {left: finishPoint, onComplete: done });
} else {
done();
}
},
removeClass: function (element, className, done) {
var scope = element.scope();
if (className === 'ng-hide') {
element.removeClass('ng-hide');
var startPoint = element.parent().width();
if(scope.direction === 'right') {
startPoint = -startPoint;
}
TweenMax.fromTo(element, 0.5, { left: startPoint }, {left: 0, onComplete: done });
} else {
done();
}
}
};
});
<!DOCTYPE html>
<html ng-app="plunker">
<head>
<meta charset="utf-8" />
<title>AngularJS Plunker</title>
<link rel="stylesheet" href="style.css" />
</head>
<body ng-controller="MainCtrl">
<slider images="images" group="imagesPerSlide"></slider>
<p>
<label>Images per slide</label>
<select ng-model="imagesPerSlide">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
</p>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/gsap/1.12.1/TweenMax.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.19/angular.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.19/angular-animate.min.js"></script>
<script src="app.js"></script>
<script>angular.element(document.getElementsByTagName('head')).append(angular.element('<base href="' + window.location.pathname + '" />'));</script>
</body>
</html>
body {
font-family: sans-serif;
}
.slides {
width: 70%;
height: 200px;
margin: 0 auto;
position: relative;
overflow: hidden;
}
.slide {
width: 100%;
position: absolute;
}
.slide .image {
display: inline-block;
}
.slides.group-1 {
height: 600px;
}
.slides.group-2 {
height: 330px;
}
.slides.group-3 {
height: 200px;
}
.group-1 .image {
width: 100%;
}
.group-2 .image {
width: 50%;
}
.group-3 .image {
width: 33%;
}
.slide img {
width: 100%;
height: auto;
}
.controls {
color: #fff;
clear: both;
text-align: center;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
.navigation a {
position: absolute;
top: 50%;
margin-top: -0.5em;
display: inline-block;
padding: 0.5em;
background: #fff;
background: rgba(255,255,255, .6);
cursor: pointer;
}
.navigation .prev {
left: 0;
}
.navigation .next {
right: 0;
}
.pagination {
position: absolute;
bottom:0.5em;
left: 0;
right: 0;
list-style: none;
margin: 0;
padding: 0;
text-align:center;
font-size: 0.8em;
}
.pagination li {
display: inline-block;
cursor: pointer;
border-radius: 2em;
width: 1em;
height: 1em;
padding: 0.5em;
background: #ccc;
margin: 0.25em;
}
<div class="slides group-{{group}}">
<div ng-repeat="slide in slides">
<div ng-show="isCurrent($index)" class="slide slide-animation">
<div ng-repeat="item in slide" class="image">
<img ng-src="{{item.image}}" />
</div>
</div>
</div>
<div class="controls">
<div class="navigation">
<a ng-click="prev()" class="prev">< Prev</a>
<a ng-click="next()" class="next">Next ></a>
</div>
<ul class="pagination">
<li ng-repeat="slide in slides" ng-click="setCurrent($index)">
<span>{{$index+1}}</span>
</li>
</ul>
</div>
</div>