One Page Scroll With Parallax Effect - FullPageScroll

File Size: 3.15 KB
Views Total: 1944
Last Update:
Publish Date:
Official Website: Go to website
License: MIT
   
One Page Scroll With Parallax Effect - FullPageScroll

A fullscreen, touch-enabled vertical page slider that listens for Wheel/Keydown/Touch events and slides between content sections with a subtle parallax effect.

Well-suited for one page scrolling website, single page web app, full-page product presentation, and much more. Keyboard navigation (up/down keys) is supported as well.

See Also:

How to use it:

1. Add content sections as slides to the page slider.

<div class="slider">
  <div class="slide active">
    <div class="bg"></div>
  </div>
  <div class="slide queue">
    <div class="bg"></div>
  </div>
  <div class="slide queue">
    <div class="bg"></div>
  </div>
  <div class="slide queue">
    <div class="bg"></div>
  </div>
</div>

2. The main styles for the page slider.

/* Make the slider fullscreen */
html,
body,
.slider,
.slide,
.bg {    
  margin: 0;
  width: 100%;
  height: 100%;
  overflow: hidden;        
}

/* Main styles */
.slider {
  background: #000;       
}
.slide {
  background: #000;
  position: absolute;
  top: 0;
  left: 0;
  transform: translate3d(0,0,0);
  transition: 800ms;   
}
.bg {
  background-position: center;
  background-repeat: no-repeat;
  background-size: cover;
  transition: 800ms;
}

/* Transitions */
.queue {
  transform: translate3d(0, 100%, 0);           
}
.prev {
  transform: translate3d(0,-50%,0); 
}
.prev .bg {
  opacity: 0.5;   
}
.bounce {
  transition: 300ms; 
}
.slide:first-child.bounce {
  transform: translate3d(0,10%,0);          
} 
.slide:last-child.bounce {
  transform: translate3d(0,-10%,0);          
}

3. Add background images to your content.

.slide:nth-child(1) .bg {
  background-image: url(1.jpg);  
}

.slide:nth-child(2) .bg {
  background-image: url(2.jpg);  
}

.slide:nth-child(3) .bg {
  background-image: url(3.jpg);  
}

.slide:nth-child(4) .bg {
  background-image: url(4.jpg); 
}

4. The main JavaScript to enable the page slider. Copy and paste the following JS snippets after jQuery library and you're done.

<script src="/path/to/cdn/jquery.min.js"></script>
$(document).ready(function () {
  var timeStart = 0;

  function wheely(e) {
    var y = e.originalEvent.deltaY;
    var timeStop = new Date().getTime();
    var timeDiff = timeStop - timeStart;
    if (timeDiff > 200) {
      if (y > 0) {
        nextSlide();
      }
      if (y < 0) {
        prevSlide();
      }
    }
    timeStart = timeStop;
  }

  function prevSlide() {
    if ($(".active").is(":first-child")) {
      if (!$(".slider").hasClass("dragging")) {
        $(".slide:first-child").addClass("bounce");
        setTimeout(function () {
          $(".slide:first-child").removeClass("bounce");
        }, 300);
      }
    } else {
      $(".active")
        .removeClass("active")
        .addClass("queue")
        .prev()
        .removeClass("prev")
        .addClass("active");
    }
  }

  function nextSlide() {
    if ($(".active").is(":last-child")) {
      if (!$(".slider").hasClass("dragging")) {
        $(".slide:last-child").addClass("bounce");
        setTimeout(function () {
          $(".slide:last-child").removeClass("bounce");
        }, 300);
      }
    } else {
      $(".active")
        .removeClass("active")
        .addClass("prev")
        .next()
        .removeClass("queue")
        .addClass("active");
    }
  }

  function hotkeys(e) {
    if (e.keyCode == 38) {
      prevSlide();
    }

    if (e.keyCode == 40) {
      e.preventDefault();
      nextSlide();
    }
  }

  function dragStart(e) {
    e.preventDefault();
    if (e.type == "touchstart") {
      $(document).off("mousedown", dragStart);
      startPoint = e.originalEvent.touches[0].pageY;
    } else {
      startPoint = e.pageY;
    }
    dragDist = 0;
    $(document).on("touchmove mousemove", dragMove);
  }

  function dragMove(e) {
    if (e.type == "touchmove") {
      var movePoint = e.originalEvent.touches[0].pageY;
    } else {
      var movePoint = e.pageY;
    }
    dragDist = ((movePoint - startPoint) / $(".slider").height()) * 100;

    $(".slider").addClass("dragging");

    $(".slide, .bg").css({
      transition: "0ms",
    });

    if (dragDist < 0) {
      $(".active .bg").css({
        opacity: 1 + dragDist / 200,
      });
      $(".active")
        .css({
          transform: "translate3d(0," + dragDist / 2 + "%,0)",
        })
        .next()
        .css({
          transform: "translate3d(0," + (100 + dragDist) + "%,0)",
        });
    }

    if (dragDist > 0) {
      $(".active")
        .css({
          transform: "translate3d(0," + dragDist + "%,0)",
        })
        .prev()
        .css({
          animation: "none",
          transform: "translate3d(0," + (-50 + dragDist / 2) + "%,0)",
        })
        .find(".bg")
        .css({
          opacity: 0.5 + dragDist / 200,
        });
    }
  }

  function dragEnd() {
    $(document).off("touchmove mousemove", dragMove);
    $(".slide, .bg").removeAttr("style");
    if (dragDist > 20) {
      prevSlide();
    }
    if (dragDist < -20) {
      nextSlide();
    }

    setTimeout(function () {
      $(".slider").removeClass("dragging");
    }, 800);
  }

  $(document).on("wheel", wheely);
  $(document).on("keydown", hotkeys);
  $(document).on("touchstart mousedown", dragStart);
  $(document).on("touchend mouseup", dragEnd);
});

This awesome jQuery plugin is developed by Mishka-Sakhelashvili. For more Advanced Usages, please check the demo page or visit the official website.