<div id="main">
</div>
body {
  transform: scale(1);
  position: absolute;
  margin: 0;
  padding: 0;
  background: #92b1dd;
}

#main {
  overflow:hidden;
  border: 1px solid #f1f5fb;
  width:640px;
  height:480px;
  position:absolute;
  left:50px;
  top:20px;
}
var waterBG = "https://s3-us-west-2.amazonaws.com/s.cdpn.io/498726/water-back.png";
var waterFG = "https://s3-us-west-2.amazonaws.com/s.cdpn.io/498726/water-front.png";

function verticalParallax(parallaxPanel, parallaxPanel2, directionY, speedY, distanceFactor, zoomFactor, zFactor){

  distanceFactor = (distanceFactor) ? distanceFactor:.5;
  zoomFactor = (zoomFactor) ? zoomFactor:1;
  zFactor = (zFactor) ? zFactor:0;

  var parallaxPanelY = Number(parallaxPanel.dataset.y);
  var parallaxPanel2Y = Number(parallaxPanel2.dataset.y);
  var height = Number(parallaxPanel.dataset.height);

  if (directionY === 1){
    parallaxPanelY += speedY*distanceFactor;
    parallaxPanelY = (parallaxPanelY > height) ? 0:parallaxPanelY;
    parallaxPanel2Y = (parallaxPanelY < height) ? parallaxPanelY-height:parallaxPanelY+height;

    parallaxPanel2Y = zoomFactor * parallaxPanel2Y;
    parallaxPanelY = zoomFactor * parallaxPanelY;
  }else{
    parallaxPanelY = parallaxPanelY - (speedY*distanceFactor);
    parallaxPanelY = (parallaxPanelY < height && parallaxPanelY > (-1*height)) ? parallaxPanelY:0;
    parallaxPanel2Y = (parallaxPanelY > (-1*height)) ? parallaxPanelY+height:parallaxPanelY-height;

    parallaxPanel2Y = zoomFactor * parallaxPanel2Y;
    parallaxPanelY = zoomFactor * parallaxPanelY;
  }

  parallaxPanel.dataset.y = parallaxPanelY;
  parallaxPanel2.dataset.y = parallaxPanel2Y;

  parallaxPanel.style[ cssPrefix.cssTransform ] = "translate3d(0px, " + parallaxPanelY + "px, " + zFactor + "px) scale(" + zoomFactor + ")";
  parallaxPanel2.style[ cssPrefix.cssTransform ] = "translate3d(0px, " + parallaxPanel2Y + "px, " + zFactor + "px) scale(" + zoomFactor + ")";

}


function horizontalParallax(parallaxPanel, parallaxPanel2, directionX, speedX, distanceFactor, zoomFactor, zFactor){

  distanceFactor = (distanceFactor) ? distanceFactor:.5;
  zoomFactor = (zoomFactor) ? zoomFactor:1;
  zFactor = (zFactor) ? zFactor:0;

  var parallaxPanelX = Number(parallaxPanel.dataset.x);
  var parallaxPanel2X = Number(parallaxPanel2.dataset.x);
  var width = Number(parallaxPanel.dataset.width);

  if (directionX === 1){
    parallaxPanelX += speedX*distanceFactor;
    parallaxPanelX = (parallaxPanelX > width) ? 0:parallaxPanelX;
    parallaxPanel2X = (parallaxPanelX < width) ? parallaxPanelX-width:parallaxPanelX+width;

    parallaxPanel2X = zoomFactor * parallaxPanel2X;
    parallaxPanelX = zoomFactor * parallaxPanelX;
  }else{
    parallaxPanelX = parallaxPanelX - (speedX*distanceFactor);
    parallaxPanelX = (parallaxPanelX < width && parallaxPanelX > (-1*width)) ? parallaxPanelX:0;
    parallaxPanel2X = (parallaxPanelX > (-1*width)) ? parallaxPanelX+width:parallaxPanelX-width;

    parallaxPanel2X = zoomFactor * parallaxPanel2X;
    parallaxPanelX = zoomFactor * parallaxPanelX;
  }

  parallaxPanel.dataset.x = parallaxPanelX;
  parallaxPanel2.dataset.x = parallaxPanel2X;

  parallaxPanel.style[ cssPrefix.cssTransform ]  = "translate3d("+parallaxPanelX+"px, 0px, " + zFactor + "px) scale(" + zoomFactor + ")";
  parallaxPanel2.style[ cssPrefix.cssTransform ] = "translate3d("+parallaxPanel2X+"px, 0px, " + zFactor + "px) scale(" + zoomFactor + ")";

}

function update(){
  // use one of the two approaches to manage the parallax scrolling

  // 1 - HORIZONTAL
  // horizontalParallax(bg1, bg2, -1, 10, .5);
  // horizontalParallax(fg1, fg2, -1, 10, 1);

  // OR

  // 2 - VERTICAL
  verticalParallax(bg1, bg2, 1, 5, .15);
  verticalParallax(fg1, fg2, 1, 5, .25);

  window.requestAnimationFrame(update);
}

function parallaxLayer(imageURL, width, height, x, y, className){

  var parallax = document.createElement("div");

  parallax.dataset.x = x;
  parallax.dataset.y = y;
  //parallax.dataset.width = width;
  parallax.dataset.height = height;
  parallax.className = (className) ? className : "";
  parallax.style.background = "url(" + imageURL + ")";
  parallax.style.width = width + "px";
  parallax.style.height = height + "px";
  // parallax.style.backgroundSize = width + "px " + height + "px";
  parallax.style.position = "absolute";
  // parallax.style.display = "block";
  parallax.style[cssPrefix.cssTransform + "Origin"] = "0px 0px";

      var container = document.getElementById("main");
  container.appendChild(parallax);

  return parallax;
}

var fg1;
var fg2;
var bg1;
var bg2;

function prepareExample() {

    // background layer
  bg1 = parallaxLayer(waterBG, 640, 480, 0, 0, "parallax");
  bg2 = parallaxLayer(waterBG, 640, 480, 0, 0, "parallax");

  // foreground layer
  fg1 = parallaxLayer(waterFG, 640, 480, 0, 0, "");
  fg2 = parallaxLayer(waterFG, 640, 480, 0, 0, "");

  window.requestAnimationFrame(update);
}

// on load
window.addEventListener("load", function load(event){
    window.removeEventListener("load", load, false); //remove listener, no longer needed
  prepareExample();
},false);

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://s3-us-west-2.amazonaws.com/s.cdpn.io/498726/cssPrefix.js