<html>
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Prism Effect Slider | Demo 3</title>
    <meta name="description" content="Prism slider using canvas globalCompositeOperation" />
    <meta name="keywords" content="prism, images, globalCompositeOperation, canvas, demo, web design, slider" />

    <!--[if IE]>
      <script src="https://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
  </head>
  <body class="demo-3">
    <div class="container">
      <header class="codrops-header">
        <h1>Prism Effect Slider</h1>
        
      </header>
      <div class="content">
        <!-- Start Demo -->

        <div class="cache">
          <!-- masks -->
          <img src="https://tympanus.net/Tutorials/PrismEffectSlider/img/masks/cube-a.svg">
          <img src="https://tympanus.net/Tutorials/PrismEffectSlider/img/masks/cube-b.svg">
          <img src="ihttps://tympanus.net/Tutorials/PrismEffectSlider/img/masks/cube-c.svg">
          <!-- photos -->
          <img src="https://tympanus.net/Tutorials/PrismEffectSlider/img/nature-a.jpg">
          <img src="https://tympanus.net/Tutorials/PrismEffectSlider/img/nature-b.jpg">
          <img src="https://tympanus.net/Tutorials/PrismEffectSlider/img/nature-c.jpg">
          <img src="https://tympanus.net/Tutorials/PrismEffectSlider/img/nature-d.jpg">
        </div>

        <div class="wrapper">
          <div class="prism-slider prism-slider--left">
            <ul class="navigation"></ul>
          </div>
          <div class="copy copy--left">
            <article>
              <h2>Nature Reveals</h2>
              <p>
                Our physical world, respect and explore,
                Where water meets land; a beautiful shore.
              </p>
              <p>
                Mountains we conquer, look down in awe,
                If you're an artist, make sure you draw.
                Nature exciting, adventurously new,
                Much more to see, than a sky that is blue.
                It offers so much, open your eyes,
                Hope of today, with every sunrise.           
              </p>
            </article>
          </div>
        </div>

        <!-- End Demo -->
      </div>
      
    </div><!-- /container -->


  </body>
</html>
header{
  height:50px !important;
}
/* Article Layout */
.wrapper {
  width: 100%;
  background: white;
}

.wrapper:after {
  content: '';
  clear: both;
  display: block;
}

.wrapper .copy {
  width: 40%;
  float: left;
  position: relative;
}

.demo-2 .wrapper .copy {
  float: right;
}

.wrapper .copy:before {
  width: 0;
  height: 0;
  float: left;
  padding-bottom: 119%;
  content: '';
}

.wrapper .copy article {
  margin: auto;
  padding: 4vw;
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
}

.wrapper .copy h2 {
  margin: 0;
  font-size: 3em;
  font-size: 4vw;
}

.wrapper .copy p:first-of-type {
  color: #b1b6ba;
  font-size: 1.5em;
  font-size: 2vw;
  margin-bottom: 1.5em;
}

.wrapper .prism-slider {
  width: 60%;
  float: right;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}

.demo-2 .wrapper .prism-slider {
  float: left;
}

/* PrismSlider */
.cache {
  display: none;
}

.prism-slider {
  width: 1200px;
  max-width: 100%;
  height: 0;
  padding-bottom: 48%;
  position: relative;
}

.prism-slider canvas {
  width: 100%;
  position: absolute;
  top: 0;
  left: 0;
}

.navigation {
  width: 100%;
  position: absolute;
  bottom: 5%;
  text-align: center;
  list-style: none;
  z-index: 1;
}

.navigation li {
  border: 3px solid #eceff1;
  width: 18px;
  height: 18px;
  margin: 0 5px;
  background: #52525a;
  border-radius: 50%;
  display: inline-block;
  cursor: pointer;
}

.navigation .active {
  background: #eceff1;
}

/* Media Queries */
@media screen and (max-width: 1024px) {
  .wrapper:after {
    display: none;
  }

  .wrapper .copy, .wrapper .prism-slider {
    width: 100%;
    float: none;
  }

  .wrapper .copy:before {
    display: none;
  }

  .wrapper .copy article {
    position: relative;
    padding: 50px;
    display: block;
  }

  .wrapper .copy h2 {
    font-size: 8vw;
  }

  .wrapper .copy p:first-of-type {
    font-size: 4vw;
  }

  .wrapper .prism-slider {
    padding-bottom: 80%;
  }

  .navigation li {
    width: 24px;
    height: 24px;
  }
}



/**
 * The slideshow controller.
 * Get settings and initialise PrismSlider for each layer,
 * add controls and events, then call slideTo method on click.
 * @return {Object} The set of public methods.
 */
var slideshow = (function(window, undefined) {

  'use strict';


  /**
   * Enum navigation classes, attributes and
   * provide navigation DOM element container.
   */
  var navigation = {
    selector: '.navigation',
    element: null,
    bullet: 'li',
    attrs: {
      active: 'active',
      index: 'data-index'
    }
  };

  /**
   * Enum main element, sizes and provide
   * main DOM element container.
   * @type {Object}
   */
  var container = {
    selector: '.prism-slider',
    element: null,
    sizes: {
      w: 1200,
      h: 960
    }
  };

  /**
   * Set of images to be used.
   * @type {Array}
   */
  var slides = [
    'https://tympanus.net/Tutorials/PrismEffectSlider/img/nature-a.jpg',
    'https://tympanus.net/Tutorials/PrismEffectSlider/img/nature-b.jpg',
    'https://tympanus.net/Tutorials/PrismEffectSlider/img/nature-c.jpg',
    'https://tympanus.net/Tutorials/PrismEffectSlider/img/nature-d.jpg'
  ];

  /**
   * Set of masks with related effects.
   * @type {Array}
   */
  var masks = [
    {
      source: 'https://tympanus.net/Tutorials/PrismEffectSlider/img/masks/cube-a.svg',
      effects: {
        flip: 'Y',
        rotate: 167 // degrees
      }
    },
    {
      source: 'https://tympanus.net/Tutorials/PrismEffectSlider/img/masks/cube-b.svg',
      effects: {
        flip: 'X',
        rotate: 90 // degrees
      }
    },
    {
      source: 'https://tympanus.net/Tutorials/PrismEffectSlider/img/masks/cube-c.svg',
      effects: {
        flip: false,
        rotate: 13 // degrees
      }
    }
  ];

  /**
   * Set global easing.
   * @type {Function(currentTime)}
   */
  var easing = Easing.easeInOutQuint;

  /**
   * Set global duration.
   * @type {Number}
   */
  var duration = 1000;

  /**
   * Container for PrismSlider instances.
   * @type {Object}
   */
  var instances = {};


  /**
   * Init.
   */
  function init() {

    getContainer_();

    initSlider_();

    initPrism_();

    addNavigation_();

    addEvents_();
  }


  /**
   * Get main container element, and store in container element.
   */
  function getContainer_() {
    container.element = document.querySelector(container.selector);
  }


  /**
   * Init Slides.
   * Create and initialise main background slider (first layer).
   * Since we'll use this as main slider no mask is given.
   */
  function initSlider_() {

    instances.slider = new PrismSlider({
      container: container,
      slides: slides,
      mask: false,
      duration: duration,
      easing: easing
    });

    // Initialise instance.
    instances.slider.init();
  }


  /**
   * Init Masks.
   * Loop masks variable and create a new layer for each mask object.
   */
  function initPrism_() {

    masks.forEach(function(mask, i) {
      // Generate reference name.
      var name = 'mask_' + i;

      instances[name] = new PrismSlider({
        container: container,
        slides: slides,
        mask: mask, // Here is the mask object.
        duration: duration,
        easing: easing
      });

      // Initialise instance.
      instances[name].init();
    });
  }


  /**
   * Add Navigation.
   * Create a new bullet for each slide and add it to navigation (ul)
   * with data-index reference.
   */
  function addNavigation_() {

    // Store navigation element.
    navigation.element = document.querySelector(navigation.selector);

    slides.forEach(function(slide, i) {

      var bullet = document.createElement(navigation.bullet);

      bullet.setAttribute(navigation.attrs.index, i);

      // When it's first bullet set class as active.
      if (i === 0) bullet.className = navigation.attrs.active;

      navigation.element.appendChild(bullet);
    });
  }


  /**
   * Add Events.
   * Bind click on bullets.
   */
  function addEvents_() {
    // Detect click on navigation elment (ul).
    navigation.element.addEventListener('click', function(e) {

      // Get clicked element.
      var bullet = e.target;

      // Detect if the clicked element is actually a bullet (li).
      var isBullet = bullet.nodeName === navigation.bullet.toUpperCase();

      // Check bullet and prevent action if animation is in progress.
      if (isBullet && !instances.slider.isAnimated) {
        // Remove active class from all bullets.
        for (var i = 0; i < navigation.element.childNodes.length; i++) {
          navigation.element.childNodes[i].className = '';
        }
        // Add active class to clicked bullet.
        bullet.className = navigation.attrs.active;

        // Get index from data attribute and convert string to number.
        var index = Number(bullet.getAttribute(navigation.attrs.index));

        // Call slideAllTo method with index.
        slideAllTo_(index);
      }

    });
  }


  /**
   * Call slideTo method of each instance.
   * In order to sync sliding of all layers we'll loop through the
   * instances object and call the slideTo method for each instance.
   * @param {Number} index The index of the destination slide.
   */
  function slideAllTo_(index) {
    // Loop PrismSlider instances.
    for (var key in instances) {
      if (instances.hasOwnProperty(key)) {
        // Call slideTo for current instance.
        instances[key].slideTo(index);
      }
    }
  }


  return {
    init: init
  };

})(window);



/**
 * Bootstrap slideshow plugin.
 * For demo purposes images are preloaded inside a div hidden with css,
 * the plugin initialisation is delayed through window.onload, in a real life
 * scenario would be better to preload images asynchronously with javascript.
 */
window.onload = slideshow.init;

External CSS

  1. https://tympanus.net/Tutorials/PrismEffectSlider/css/demo.css
  2. https://tympanus.net/Tutorials/PrismEffectSlider/css/component.css

External JavaScript

  1. https://tympanus.net/Tutorials/PrismEffectSlider/js/PrismSlider.js
  2. https://tympanus.net/Tutorials/PrismEffectSlider/js/utils/easing.js
  3. https://tympanus.net/Tutorials/PrismEffectSlider/js/utils/rAF.js
  4. //cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js