 
        Touch enabled minimalistic slider written in vanilla JavaScript
Hardware accelerated transitions
Usable as a jQuery plugin
Options for custom easing effects
infinite looping ~ carousel
No compromises for fallbacks
Written in ecmascript 6
Using webpack, babel & eslint for development
Download Here
            <div class="slider js_slider">
                <div class="frame js_frame">
                    <ul class="slides js_slides">
                        <li class="js_slide">1</li>
                        <li class="js_slide">2</li>
                        <li class="js_slide">3</li>
                        <li class="js_slide">4</li>
                        <li class="js_slide">5</li>
                        <li class="js_slide">6</li>
                    </ul>
                </div>
            </div>
            
            /**
             * (optional) define here the style definitions which should be applied on the slider container
             * e.g. width including further controls like arrows etc.
             */
            .slider {}
            .frame {
                /**
                 * (optional) wrapper width, specifies width of the slider frame.
                 */
                width: 880px;
                position: relative;
                font-size: 0;
                line-height: 0;
                overflow: hidden;
                white-space: nowrap;
            }
            .slides {
                display: inline-block;
            }
            li {
                position: relative;
                display: inline-block;
                /**
                 * (optional) if the content inside the slide element has a defined size.
                 */
                width: 880px;
            }
            
    document.addEventListener('DOMContentLoaded', function () {
        var simple = document.querySelector('.js_simple');
        lory(simple, {
            infinite: 1
        });
    });
    document.addEventListener('DOMContentLoaded', function () {
        var percentage = document.querySelector('.js_percentage');
        lory(percentage, {
            infinite: 1
        });
    });
    document.addEventListener('DOMContentLoaded', function () {
        var rewind = document.querySelector('.js_rewind');
        lory(rewind, {
            rewind: true
        });
    });
    document.addEventListener('DOMContentLoaded', function () {
        var rewind_percentage = document.querySelector('.js_rewind_percentage');
        lory(rewind_percentage, {
            rewind: true
        });
    });
    document.addEventListener('DOMContentLoaded', function () {
        var variableWidth = document.querySelector('.js_variablewlidth');
        lory(variableWidth, {
            rewind: true
        });
    });
    document.addEventListener('DOMContentLoaded', function () {
        var multiSlides = document.querySelector('.js_multislides');
        lory(multiSlides, {
            infinite: 4,
            slidesToScroll: 4
        });
    });
    document.addEventListener('DOMContentLoaded', function () {
        var ease = document.querySelector('.js_ease');
        // http://easings.net/
        lory(ease, {
            infinite: 4,
            slidesToScroll: 4,
            slideSpeed: 1000,
            ease: 'cubic-bezier(0.455, 0.03, 0.515, 0.955)'
        });
    });
    document.addEventListener('DOMContentLoaded', function () {
        var events = document.querySelector('.js_events');
        function handleEvent(e) {
            var newSpan = document.createElement('span');
            var time = new Date();
            time = time.getHours() + ':' + time.getMinutes() + ':' + time.getSeconds() + ',' + time.getMilliseconds();
            var newContent = document.createTextNode('[' + time + '] Event dispatched: "' + e.type + '"');
            newSpan.appendChild(newContent);
            e.target.nextElementSibling.appendChild(newSpan);
        }
        events.addEventListener('before.lory.init', handleEvent);
        events.addEventListener('after.lory.init', handleEvent);
        events.addEventListener('before.lory.slide', handleEvent);
        events.addEventListener('after.lory.slide', handleEvent);
        events.addEventListener('on.lory.resize', handleEvent);
        events.addEventListener('on.lory.touchend', handleEvent);
        events.addEventListener('on.lory.touchmove', handleEvent);
        events.addEventListener('on.lory.touchstart', handleEvent);
        events.addEventListener('on.lory.destroy', handleEvent);
        lory(events, {
            infinite: 1
        });
    });
    "use strict";
    var lory = require('lory.js').lory;
    document.addEventListener('DOMContentLoaded', function() {
        var slider = document.querySelector('.js_slider');
        lory(slider, {
            // options going here
        });
    });
    import {lory} from 'lory.js';
    document.addEventListener('DOMContentLoaded', () => {
        const slider = document.querySelector('.js_slider');
        lory(slider, {
            // options going here
        });
    });
        <script src="js/jquery.lory.min.js"></script>
        'use strict';
        var $elements = $('.js_simple');
        $(function() {
            $elements.lory({
                infinite: 1
            });
            $elements.data().lory.slideTo(4);
            // $elements.data().lory.prev();
            // $elements.data().lory.next();
        });
        // To install dev dependencies run:
        npm install
        // To start the development server run:
        npm start
        // To lint your code run:
        npm run lint
        // To make a full new build run:
        npm run build
        // To install dev dependencies run:
        npm install
        // To start karma in chrome browser and run tests:
        npm run karma
 
        | prev: | slides to the previous slide | |
|---|---|---|
| next: | slides to the next slide | |
| slideTo: | slides to the index given as an argument: (arguments: index {number}) | |
| returnIndex: | returns the index of the current slide element | |
| setup: | binds eventlisteners, merging default and user options, setup the slides based on DOM (called once during initialisation) | Call setup if DOM or user options have changed or eventlisteners needs to be rebinded. | 
| reset: | sets the slider back to the starting position and resets the current index (called on Resize event) | |
| destroy: | unmount/destroy the instance of lory | 
| before.lory.init | fires before initialisation (first in setup function) | |
|---|---|---|
| after.lory.init | fires after initialisation (end of setup function) | |
| before.lory.slide | arguments: currentSlide, nextSlide | fires before slide change | 
| after.lory.slide | arguments: currentSlide | fires after slide change | 
| on.lory.resize | fires on every resize event | |
| on.lory.touchstart | fires on every slider touchstart event | |
| on.lory.touchmove | fires on every slider touchmove event | |
| on.lory.touchend | fires on every slider touchend event | |
| on.lory.destroy | fires when the slider instance gets destroyed |