/js/main.js

https://gitlab.com/x33n/hero-slider · JavaScript · 132 lines · 99 code · 20 blank · 13 comment · 12 complexity · b31ba6ecccdba3e8d6ca303b23429bc3 MD5 · raw file

  1. jQuery(document).ready(function($){
  2. var slidesWrapper = $('.cd-hero-slider');
  3. //check if a .cd-hero-slider exists in the DOM
  4. if ( slidesWrapper.length > 0 ) {
  5. var primaryNav = $('.cd-primary-nav'),
  6. sliderNav = $('.cd-slider-nav'),
  7. navigationMarker = $('.cd-marker'),
  8. slidesNumber = slidesWrapper.children('li').length,
  9. visibleSlidePosition = 0,
  10. autoPlayId,
  11. autoPlayDelay = 5000;
  12. //upload videos (if not on mobile devices)
  13. uploadVideo(slidesWrapper);
  14. //autoplay slider
  15. setAutoplay(slidesWrapper, slidesNumber, autoPlayDelay);
  16. //on mobile - open/close primary navigation clicking/tapping the menu icon
  17. primaryNav.on('click', function(event){
  18. if($(event.target).is('.cd-primary-nav')) $(this).children('ul').toggleClass('is-visible');
  19. });
  20. //change visible slide
  21. sliderNav.on('click', 'li', function(event){
  22. event.preventDefault();
  23. var selectedItem = $(this);
  24. if(!selectedItem.hasClass('selected')) {
  25. // if it's not already selected
  26. var selectedPosition = selectedItem.index(),
  27. activePosition = slidesWrapper.find('li.selected').index();
  28. if( activePosition < selectedPosition) {
  29. nextSlide(slidesWrapper.find('.selected'), slidesWrapper, sliderNav, selectedPosition);
  30. } else {
  31. prevSlide(slidesWrapper.find('.selected'), slidesWrapper, sliderNav, selectedPosition);
  32. }
  33. //this is used for the autoplay
  34. visibleSlidePosition = selectedPosition;
  35. updateSliderNavigation(sliderNav, selectedPosition);
  36. updateNavigationMarker(navigationMarker, selectedPosition+1);
  37. //reset autoplay
  38. setAutoplay(slidesWrapper, slidesNumber, autoPlayDelay);
  39. }
  40. });
  41. }
  42. function nextSlide(visibleSlide, container, pagination, n){
  43. visibleSlide.removeClass('selected from-left from-right').addClass('is-moving').one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function(){
  44. visibleSlide.removeClass('is-moving');
  45. });
  46. container.children('li').eq(n).addClass('selected from-right').prevAll().addClass('move-left');
  47. checkVideo(visibleSlide, container, n);
  48. }
  49. function prevSlide(visibleSlide, container, pagination, n){
  50. visibleSlide.removeClass('selected from-left from-right').addClass('is-moving').one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function(){
  51. visibleSlide.removeClass('is-moving');
  52. });
  53. container.children('li').eq(n).addClass('selected from-left').removeClass('move-left').nextAll().removeClass('move-left');
  54. checkVideo(visibleSlide, container, n);
  55. }
  56. function updateSliderNavigation(pagination, n) {
  57. var navigationDot = pagination.find('.selected');
  58. navigationDot.removeClass('selected');
  59. pagination.find('li').eq(n).addClass('selected');
  60. }
  61. function setAutoplay(wrapper, length, delay) {
  62. if(wrapper.hasClass('autoplay')) {
  63. clearInterval(autoPlayId);
  64. autoPlayId = window.setInterval(function(){autoplaySlider(length)}, delay);
  65. }
  66. }
  67. function autoplaySlider(length) {
  68. if( visibleSlidePosition < length - 1) {
  69. nextSlide(slidesWrapper.find('.selected'), slidesWrapper, sliderNav, visibleSlidePosition + 1);
  70. visibleSlidePosition +=1;
  71. } else {
  72. prevSlide(slidesWrapper.find('.selected'), slidesWrapper, sliderNav, 0);
  73. visibleSlidePosition = 0;
  74. }
  75. updateNavigationMarker(navigationMarker, visibleSlidePosition+1);
  76. updateSliderNavigation(sliderNav, visibleSlidePosition);
  77. }
  78. function uploadVideo(container) {
  79. container.find('.cd-bg-video-wrapper').each(function(){
  80. var videoWrapper = $(this);
  81. if( videoWrapper.is(':visible') ) {
  82. // if visible - we are not on a mobile device
  83. var videoUrl = videoWrapper.data('video'),
  84. video = $('<video loop><source src="'+videoUrl+'.mp4" type="video/mp4" /><source src="'+videoUrl+'.webm" type="video/webm" /></video>');
  85. video.appendTo(videoWrapper);
  86. // play video if first slide
  87. if(videoWrapper.parent('.cd-bg-video.selected').length > 0) video.get(0).play();
  88. }
  89. });
  90. }
  91. function checkVideo(hiddenSlide, container, n) {
  92. //check if a video outside the viewport is playing - if yes, pause it
  93. var hiddenVideo = hiddenSlide.find('video');
  94. if( hiddenVideo.length > 0 ) hiddenVideo.get(0).pause();
  95. //check if the select slide contains a video element - if yes, play the video
  96. var visibleVideo = container.children('li').eq(n).find('video');
  97. if( visibleVideo.length > 0 ) visibleVideo.get(0).play();
  98. }
  99. function updateNavigationMarker(marker, n) {
  100. marker.removeClassPrefix('item').addClass('item-'+n);
  101. }
  102. $.fn.removeClassPrefix = function(prefix) {
  103. //remove all classes starting with 'prefix'
  104. this.each(function(i, el) {
  105. var classes = el.className.split(" ").filter(function(c) {
  106. return c.lastIndexOf(prefix, 0) !== 0;
  107. });
  108. el.className = $.trim(classes.join(" "));
  109. });
  110. return this;
  111. };
  112. });