На сегодняшний день в сети есть много готовых решений, которые реализуют тем или иным способом смену слайдов. Большинство из них основаны на анимации через javascript. В этой статье хочу показать какие возможности открывает AngularJS в связке с CSS3. Перед собой я ставил задачу сделать минималистичный и простой модуль, который легко дописывать и видоизменять под свои нужды вплоть до создания собственных эффектов переходов слайдов.
Демо GitHub Project
Для начала выведем все слайды, на AngularJS это делается просто при помощи директивы
в html-шаблоне:
В результате у нас есть код, который выведет все слайды (в данном примере — изображения). Теперь нужно заставить их последовательно сменятся через некоторые промежутки времени, но в AngularJS нет аналога функции
Теперь добавим в шаблоне код, который будет отображать только текущий слайд:
Если выполнить этот код, то у нас будет слайдер, который меняет изображение каждые 2 секунды, но безо всяких эффектов.
За анимацию элементов в AngularJS отвечает отдельный модуль ngAnimate. Достаточно подключить этот модуль и описать эффекты переходов в css слайды начнут плавно сменять друг друга. Пример эффекта проявления:
Теперь ко всем слайдам, у которых есть класс
Модуль ngAnimate позволяет описывать эффекты не только через css, но и через javascript, что позволяет реализовать и более сложную анимацию и приблизить её к таким как у аналогов, например, у nivoSlider.
В этой статье я рассмотрел только основные принципы, которые были положены в основу этого модуля. Сам модуль на данный момент имеет еще функционал автоплея, смены задержки между слайдами, возможность добавления элементов ручной прокрутки слайдов и возможность задания анимации для каждого слайда отдельно. Надеюсь модуль будет кому-нибудь полезен и буду благодарен всякой помощи в его развитии.
Демо GitHub Project
Смена слайдов
Для начала выведем все слайды, на AngularJS это делается просто при помощи директивы
ng-repeat
:// в контроллере задаем массив слайдов
$scope.slides = [
{ 'image': 'images/image1.png' },
{ 'image': 'images/image2.png' }
];
в html-шаблоне:
<div ng-repeat="(i, slide) in slides">
<img ng-src="{{ slide.image }}" />
</div>
В результате у нас есть код, который выведет все слайды (в данном примере — изображения). Теперь нужно заставить их последовательно сменятся через некоторые промежутки времени, но в AngularJS нет аналога функции
setInterval
, потому для реализации вечного таймера будем циклически вызывать $timeout
. Чтобы остановить такой таймер нужно воспользоваться функцией $timeout.cancel
.// функция переключения слайда
$scope.next = function() {
var total = $scope.slides.length;
if (total > 0) {
$scope.$slideIndex = ($scope.$slideIndex == total - 1) ? 0 : $scope.$slideIndex + 1;
}
};
// функция play запускает таймер, который переключает слайд и вызывает её же повторно
$scope.play = function() {
timeOut = $timeout(function() {
$scope.next();
$scope.play();
}, 2000);
};
Теперь добавим в шаблоне код, который будет отображать только текущий слайд:
<div ng-repeat="(i, slide) in slides" ng-show="i == $slideIndex">
<img ng-src="{{ slide.image }}" />
</div>
Если выполнить этот код, то у нас будет слайдер, который меняет изображение каждые 2 секунды, но безо всяких эффектов.
Эффекты переходов слайдов
За анимацию элементов в AngularJS отвечает отдельный модуль ngAnimate. Достаточно подключить этот модуль и описать эффекты переходов в css слайды начнут плавно сменять друг друга. Пример эффекта проявления:
.animation-fade.ng-hide-add,
.animation-fade.ng-hide-remove {
/* здесь прописаны эффекты проявления и исчезновения слайда */
-webkit-transition: 1s linear all;
-moz-transition: 1s linear all;
-o-transition: 1s linear all;
transition: 1s linear all;
display: block !important;
}
.animation-fade.ng-hide-add,
.animation-fade.ng-hide-remove.ng-hide-remove-active {
/* это стартовая точка анимации исчезновения и конечная точка анимации проявления */
opacity: 1;
}
.animation-fade.ng-hide-add.ng-hide-add-active,
.animation-fade.ng-hide-remove {
/* это конечная точка анимации исчезновения и стартовая точка анимации проявления */
opacity: 0;
position: absolute;
}
Теперь ко всем слайдам, у которых есть класс
animation-fade
, будет применен эффект проявления/затухания при переходах.Модуль ngAnimate позволяет описывать эффекты не только через css, но и через javascript, что позволяет реализовать и более сложную анимацию и приблизить её к таким как у аналогов, например, у nivoSlider.
Заключение
В этой статье я рассмотрел только основные принципы, которые были положены в основу этого модуля. Сам модуль на данный момент имеет еще функционал автоплея, смены задержки между слайдами, возможность добавления элементов ручной прокрутки слайдов и возможность задания анимации для каждого слайда отдельно. Надеюсь модуль будет кому-нибудь полезен и буду благодарен всякой помощи в его развитии.