Press "Enter" to skip to content

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.

Be First to Comment

    Leave a Reply

    Your email address will not be published. Required fields are marked *