Personal portfolio website for Regina Carvalho. Built with Famous.js library.

wallop-slider.js 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. angular.module('goApp.slider', [])
  2. .directive('wallopSlider', function () {
  3. "use strict";
  4. return {
  5. template: '<div class="wallop-slider {{animationClass}}"><ul class="wallop-slider__list"><li class="wallop-slider__item {{itemClasses[$index]}}" ng-repeat="i in images"><img src="{{i}}"></li></ul><button ng-show="images.length>1" class="st-button wallop-slider__btn wallop-slider__btn--previous btn btn--previous" ng-disabled="prevDisabled" ng-click="onPrevButtonClicked()">Anterior</button><button ng-show="images.length>1" class="st-button wallop-slider__btn wallop-slider__btn--next btn btn--next" ng-disabled="nextDisabled" ng-click="onNextButtonClicked()">Próximo</button></div>',
  6. restrict: 'EA',
  7. transclude: true,
  8. replace: false,
  9. scope: {
  10. images: '=',
  11. animation: '@',
  12. currentItemIndex: '=',
  13. onNext: '&',
  14. onPrevious: '&'
  15. },
  16. controller: function($scope, $timeout) {
  17. $scope.itemClasses = [];
  18. $scope.$watch('images', function(images) {
  19. if (images.length) {
  20. _goTo(0);
  21. }
  22. });
  23. $scope.$watch('itemClasses', function(itemClasses) {
  24. console.log('itemClasses', itemClasses);
  25. });
  26. // set animation class corresponding to animation defined in CSS. e.g. rotate, slide
  27. if ($scope.animation) {
  28. $scope.animationClass = 'wallop-slider--' + $scope.animation;
  29. }
  30. var _displayOptions = {
  31. btnPreviousClass: 'wallop-slider__btn--previous',
  32. btnNextClass: 'wallop-slider__btn--next',
  33. itemClass: 'wallop-slider__item',
  34. currentItemClass: 'wallop-slider__item--current',
  35. showPreviousClass: 'wallop-slider__item--show-previous',
  36. showNextClass: 'wallop-slider__item--show-next',
  37. hidePreviousClass: 'wallop-slider__item--hide-previous',
  38. hideNextClass: 'wallop-slider__item--hide-next'
  39. };
  40. function updateClasses() {
  41. if ($scope.itemClasses.length !== $scope.images.length) {
  42. $scope.itemClasses = [];
  43. for (var i=0; i<$scope.images.length; i++) {
  44. $scope.itemClasses.push('');
  45. }
  46. }
  47. }
  48. function _nextDisabled() {
  49. console.log('$scope.currentItemIndex', $scope.currentItemIndex, $scope.images.length);
  50. return ($scope.currentItemIndex + 1) === $scope.images.length;
  51. }
  52. function _prevDisabled() {
  53. return !$scope.currentItemIndex;
  54. }
  55. function _updatePagination() {
  56. $scope.nextDisabled = _nextDisabled();
  57. $scope.prevDisabled = _prevDisabled();
  58. }
  59. function _clearClasses() {
  60. for (var i=0; i<$scope.images.length; i++) {
  61. $scope.itemClasses[i] = '';
  62. }
  63. }
  64. // go to slide
  65. function _goTo(index) {
  66. console.log('_goTo', index);
  67. if (index >= $scope.images.length || index < 0 || index === $scope.currentItemIndex) {
  68. if (!index) {
  69. $scope.itemClasses[0] = _displayOptions.currentItemClass;
  70. }
  71. return;
  72. }
  73. _clearClasses();
  74. $scope.itemClasses[$scope.currentItemIndex] = (index > $scope.currentItemIndex) ? _displayOptions.hidePreviousClass : _displayOptions.hideNextClass;
  75. var currentClass = (index > $scope.currentItemIndex) ? _displayOptions.showNextClass : _displayOptions.showPreviousClass;
  76. $scope.itemClasses[index] = _displayOptions.currentItemClass + ' ' + currentClass;
  77. $scope.currentItemIndex = index;
  78. _updatePagination();
  79. }
  80. // button event handlers
  81. // consider using the ng-tap directive to remove delay
  82. $scope.onPrevButtonClicked = function () {
  83. _goTo($scope.currentItemIndex - 1);
  84. };
  85. $scope.onNextButtonClicked = function () {
  86. _goTo($scope.currentItemIndex + 1);
  87. };
  88. $scope.$watch('currentItemIndex', function(newVal, oldVal) {
  89. if (oldVal > newVal) {
  90. if (typeof $scope.onPrevious === 'function') {
  91. $scope.onPrevious();
  92. }
  93. } else {
  94. if (typeof $scope.onNext === 'function') {
  95. $scope.onNext();
  96. }
  97. }
  98. });
  99. }
  100. };
  101. });