Parallax Sliders With Swiper JS and jQuery Animation

Multi Parallax Sliders project takes advantage of jQuery and Swiper.js to create a modern, mobile-friendly, and multi-slice circular scroll bar with the effect of beautiful parallax scrolling when switching between images.

vertical parallax slider, swiper slider responsive code, parallax effect slider, swiper slider parallax, swiper js tutorial, swiper slider bootstrap

How to make use of it:

1. Load the required jQuery and Swiper.js libraries within the doc.

<link rel="stylesheet" href="/path/to/cdn/swiper.min.css" />
<script src="/path/to/cdn/jquery.min.js"></script>
<script src="/path/to/cdn/swiper.min.js"></script>

2. Add photos to the slider.

<div class="multi-px-slider loading">

  <!-- Left Slider -->
  <div class="swiper-container lg-slider">
    <div class="swiper-wrapper">
      <div class="swiper-slide">
        <div class="mps-slide">
          <div class="mps-img img-lg"><img data-src="https://source.unsplash.com/TWCSYLJMoVc/1280x960" alt="" class="swiper-lazy object-fit"></div>
          <div class="swiper-lazy-preloader"></div>
        </div>
      </div>
      <div class="swiper-slide">
        <div class="mps-slide">
          <div class="mps-img img-lg"><img data-src="https://source.unsplash.com/yHaburAEFo4/1280x960" alt="" class="swiper-lazy object-fit"></div>
          <div class="swiper-lazy-preloader"></div>
        </div>
      </div>
      <div class="swiper-slide">
        <div class="mps-slide">
          <div class="mps-img img-lg"><img data-src="https://source.unsplash.com/ihzhMA2-l4Q/1280x960" alt="" class="swiper-lazy object-fit"></div>
          <div class="swiper-lazy-preloader"></div>
        </div>
      </div>
    </div>
    <div class="pattern-2" data-swiper-parallax="-50%"></div>
  </div>

  <!-- Right Slider -->
  <div class="swiper-container sm-slider">
    <div class="swiper-wrapper">
      <div class="swiper-slide">
        <div class="mps-slide">
          <div class="mps-img img-sm"><img data-src="https://source.unsplash.com/Dz5j0QKVUGY/1280x960" alt="" class="swiper-lazy object-fit"></div>
          <div class="swiper-lazy-preloader"></div>
        </div>
      </div>
      <div class="swiper-slide">
        <div class="mps-slide">
          <div class="mps-img img-sm"><img data-src="https://source.unsplash.com/HGa7kULkQWY/1280x960" alt="" class="swiper-lazy object-fit"></div>
          <div class="swiper-lazy-preloader"></div>
        </div>
      </div>
      <div class="swiper-slide">
        <div class="mps-slide">
          <div class="mps-img img-sm"><img data-src="https://source.unsplash.com/RRSXLJPbqEQ/1280x960" alt="" class="swiper-lazy object-fit"></div>
          <div class="swiper-lazy-preloader"></div>
        </div>
      </div>
    </div>
  </div>

  <!-- Controls -->
  <button type="button" class="mps-arrow mps-prev" aria-label="Previous">Previous</button>
  <button type="button" class="mps-arrow mps-next" aria-label="Next">Next</button>

  <!-- Curtain -->
  <div class="curtain"></div>

</div>

3. The essential CSS for the slider.

.object-fit { 
  width: 100%; 
  height: 100%; 
  object-fit: cover; 
} 

/* plugin overrides */
.swiper-wrapper {
  height: 100%;     
}
.swiper-slide {
  backface-visibility: hidden;
  overflow: hidden;     
}


/* slider */
.multi-px-slider {
  height: 480px;
  position: relative;
  overflow: hidden;
  display: flex;
  transition: opacity .6s ease;
}

.multi-px-slider.loading {
  visibility: hidden;
  opacity: 0;
}

.mps-slide {
  position: relative;
  width: 100%;
  height: 100%;
}

.mps-img {
  height: 100%;
  overflow: hidden;
}

/* Large slider */
.lg-slider {
  width: 60%;
}

/* Small slider */
.sm-slider {
  width: 40%;
}

/* Arrows */
.mps-arrow {
  position: absolute;
  top: 50%;
  z-index: 3;
  transform: translateY(-50%);
}

.mps-prev {
  left: 1.5em;
}

.mps-next {
  right: 1.5em;
}

/* curtain */
.curtain {      
  position: absolute;
  top: 0;
  left: 60%;
  z-index: 2;
  width: 40%;
  height: 100%;
  background-color: rgba(0,0,0,.5);
}

.is-animating .curtain {
  animation: curtain 3.75s ease-in-out;
}

@keyframes curtain {
  0% {
    left: 60%;
    width: 40%;
  }
  46% {       
    left: 0%;
    width: 60%;
  }
  53% {
    left: 0%; 
    width: 60%;     
  }
  100% {        
    left: 60%;
    width: 40%;
  }
}

.pattern-2 {
  background: url(./images/pattern-2.png) repeat-x;
  width: 330%;
  height: 80px;
  position: absolute;
  bottom: 0;
  left: 0;
  z-index: 2;
  opacity: .3;    
}

4. Enable the parallax slider.

// Params
const mpSlider = document.querySelector('.multi-px-slider');
let interleaveOffset = 0.5;

// init small slider
const smallSlider = new Swiper('.sm-slider', {
      touchRatio: 0, // disable swipe
      loop: true,
      slidesPerView: 'auto',
      preloadImages: false,
      lazy: {
        loadPrevNext: true,
        loadPrevNextAmount: 2,
      },
      watchSlidesProgress: true,
      watchSlidesVisibility: true,
      on: {
        init: function(){
          let swiper = this;
        },
        lazyImageReady: function(){
          let swiper = this;

          setTimeout(function() {
            swiper.update();
          }, 500);
        },
        progress: function(){
          let swiper = this;
          for (let i = 0; i < swiper.slides.length; i++) {
            let slideProgress = swiper.slides[i].progress,
                innerOffset = swiper.width * interleaveOffset,
                innerTranslate = slideProgress * innerOffset;
                swiper.slides[i].querySelector(".img-sm").style.transform = "translateX(" + innerTranslate + "px)";
          }
        },
        touchStart: function() {
          let swiper = this;
          for (let i = 0; i < swiper.slides.length; i++) {
              swiper.slides[i].style.transition = "";
          }
        },
        setTransition: function(speed) {
          let swiper = this;
          for (let i = 0; i < swiper.slides.length; i++) {
              swiper.slides[i].style.transition = speed + "ms";
              swiper.slides[i].querySelector(".img-sm").style.transition = speed + "ms";
          }
        }
    }
});


// init large slider
const largeSlider = new Swiper('.lg-slider', {
  parallax: true,
    loop: true,
    speed: 2000,
    slidesPerView: 'auto',
    preloadImages: false,
    lazy: {
      loadPrevNext: true,
      loadPrevNextAmount: 2,
    },
    watchSlidesProgress: true,
    watchSlidesVisibility: true,
    touchEventsTarget: 'wrapper',
    controller: {
      control: smallSlider
    },
    on: {
      init: function(){
        let swiper = this;
      },
      lazyImageReady: function(){
        let swiper = this;

        setTimeout(function() {
          swiper.update();
          mpSlider.classList.remove('loading');
        }, 500);
      },
      progress: function(){
        let swiper = this;
        for (let i = 0; i < swiper.slides.length; i++) {
          let slideProgress = swiper.slides[i].progress,
              innerOffset = swiper.width * interleaveOffset,
              innerTranslate = slideProgress * innerOffset;
              swiper.slides[i].querySelector(".img-lg").style.transform = "translateX(" + innerTranslate + "px)";
        }
      },
      touchStart: function() {
        let swiper = this;
        for (let i = 0; i < swiper.slides.length; i++) {
            swiper.slides[i].style.transition = "";
        }
      },
      setTransition: function(speed) {
        let swiper = this;
        for (let i = 0; i < swiper.slides.length; i++) {
            swiper.slides[i].style.transition = speed + "ms";
            swiper.slides[i].querySelector(".img-lg").style.transition = speed + "ms";
        }
      }
    }
});


// Set up animations
let slideDelay = 2000;
let $mpsArrow = $('.mps-arrow');

function run() {
  mpSlider.classList.add('is-animating');
}

function endAnimation() {
  mpSlider.classList.remove('is-animating');
}


// custom arrows
$mpsArrow.each((i, el) => {
const _this = $(el);

  _this.on('click', function() {

    // disable arrows
    $mpsArrow.prop('disabled', true);
    // run animation
    runAnimation();

    // go to prev/next slide
    if (_this.hasClass('mps-prev')) {
      setTimeout(() => {
      largeSlider.slidePrev();
      }, slideDelay)
    } else if (_this.hasClass('mps-next')) {
      setTimeout(() => {
      largeSlider.slideNext();
      }, slideDelay)
    }

    // detect animation end
    const curtain = document.querySelector('.curtain');
    curtain.addEventListener('animationend', () => {
      // re-enable arrows
    $mpsArrow.prop('disabled', false);
    // end animation
    endAnimation();
    });

  })

})

// check if slider is in viewport?
let mpsInViewport = true;
if (mpsInViewport) {
  $(document).off('keyup').on('keyup', function(e) {
    if (e.keyCode == '37') {
      $('.mps-prev').trigger('click');
    } else if (e.keyCode == '39') {
      $('.mps-next').trigger('click');
    }
  });
}

Parallax Image Slider With jQuery, multi-parallax-sliders Plugin/Github


See Demo And Download

Official Website(EmDashVee): Click Here

This superior jQuery/javascript plugin is developed by EmDashVee. For extra Advanced Usages, please go to the official website.

Related Posts

Confetti-Falling-Animation-Effect-party

Confetti Falling Animation Effect In JavaScript | party.js

Party.js is a JavaScript library to brighten user site experience with visual effects! Celebrate success with dom confetti! The library is written in TypeScript and compiled into…

jquery-cookie-consent

Simple jQuery Cookie Consent Plugin

jquery.cookie-consent is a simple jQuery plugin to request consent to use cookies. An easy-to-use and highly customizable cookie consent bar that informs your visitors of the use…

Timepicker-Plugin-for-jQuery

Timepicker JavaScript Plugin for jQuery Inspired by Google Calendar

jquery.timepicker is a lightweight jQuery timer plugin inspired by Google Calendar. It supports both mouse and keyboard navigation and weighs 5.5KB minified and compact. Features: Highly customizable…

angular-ngx-carousel-slider

A Lightweight, Touchable, and Responsive Angular Universal Carousel Library

ngxCarousel is a lightweight, tactile, and responsive library for creating an angular carousel. No dependencies, no more hammer. Must Read: Angular Responsive Image Slider With Lightbox Popup…

random-number-picker

Generate a Random Number Picker In Vanilla JavaScript

Random Number Picker is a Vanilla JS-based number picker that allows you to generate a random number within a specified range. Must Read: Generating Lottery Numbers Using…

Nepali-Date-Picker-jQuery-Plugin

Nepali Date Picker jQuery Plugin | nepaliDatePicker

Nepali Date Picker is a customizable, easy-to-use, and input-based date picker plugin mostly based on the Nepali calendar. Users can choose a Nepali date in the navigable…