Installation
Usage
Usage
import Glider from 'paraglider'
// A simple belt slider
const glider = new Glider({
onSlide(progress, {next, previous, current, rest}, slides) {
if (previous !== null) {
slides[previous].style.transform = `translate3d(${-100 + (progress * 100)}%,0,0)`
slides[current].style.transform = `translate3d(${(progress * 100)}%,0,0)`
} else if (next !== null) {
slides[next].style.transform = `translate3d(${100 - (progress * 100)}%,0,0)`
slides[current].style.transform = `translate3d(${(progress * -100)}%,0,0)`
}
},
onEnd({next, previous, current, rest}, slides) {
rest.forEach(slide => {
slides[slide].style.transform = ''
})
slides[current].style.transform = ''
slides[previous].style.transform = 'translate3d(-100%,0,0)'
slides[next].style.transform = 'translate3d(100%,0,0)'
}
})
glider.init(document.querySelector('.glide-me'))
Wrappers
Wrapper
If you want to wrap your slider to use pagers and/or navigation you can use the provided helper. The API and configuration remains the same.
import wrapper from 'paraglider/lib/presets/wrapper'
const belt = (glider, opts) => wrapper(glider, {
...opts,
onSlide(progress, {next, previous, current, rest}, slides) {
if (previous !== null) {
slides[previous].style.transform = `translate3d(${-100 + (progress * 100)}%,0,0)`
slides[current].style.transform = `translate3d(${(progress * 100)}%,0,0)`
} else if (next !== null) {
slides[next].style.transform = `translate3d(${100 - (progress * 100)}%,0,0)`
slides[current].style.transform = `translate3d(${(progress * -100)}%,0,0)`
}
if (typeof opts.onSlide === 'function') {
opts.onSlide(progress, {next, previous, current, rest}, slides)
}
},
onEnd({next, previous, current, rest}, slides) {
[next, previous, ...rest].forEach(slide => {
slides[slide].style.transform = 'translate3d(-100%,0,0)'
})
slides[current].style.transform = ''
if (typeof opts.onEnd === 'function') {
opts.onEnd({next, previous, current, rest}, slides)
}
}
})
Multi wrapper
Allows using slideBy and visibleSlides in a wrapper. (No pager dots)
import multiWrapper from 'paraglider/lib/presets/multi-wrapper'
const multiBelt = (glider, opts) => multiWrapper(glider, {
...opts,
onInit({next, previous, current, rest}, slides) {
current.forEach((id, index) => {
slides[id].style.transform = `translate3d(${index * 100}%,0,0)`
})
},
onSlide(progress, {next, previous, current, rest}, slides, {slideBy}) {
if (previous !== null) {
if (current.length > 0) {
current.forEach((id, index) => {
slides[id].style.transform = `translate3d(${(index * 100) + (progress * 100)}%,0,0)`
})
} else {
slides[current].style.transform = `translate3d(${progress * 100}%,0,0)`
}
if (previous.length > 0) {
previous.forEach((id, index) => {
slides[id].style.transform = `translate3d(${((slideBy - 1) * -100) + (index * 100) + (progress * 100) - 100}%,0,0)`
})
} else {
slides[previous].style.transform = `translate3d(${(progress * 100) - 100}%,0,0)`
}
} else if (next !== null) {
if (current.length > 0) {
current.forEach((id, index) => {
slides[id].style.transform = `translate3d(${(index * 100) - (progress * 100)}%,0,0)`
})
} else {
slides[current].style.transform = `translate3d(${(progress * -100)}%,0,0)`
}
if (next.length > 0) {
next.forEach((id, index) => {
slides[id].style.transform = `translate3d(${(slideBy * 100) + (index * 100) - (progress * 100)}%,0,0)`
})
} else {
slides[next].style.transform = `translate3d(${100 - (progress * 100)}%,0,0)`
}
}
},
onEnd({next, previous, current, rest}, slides) {
const currentIndexes = current.length > 0 ? current : current ? current : []
slides.filter((id, i) => currentIndexes.indexOf(i) > -1).forEach(slide => {
slide.style.transform = 'translate3d-1%,0,0)'
})
current.forEach((id, index) => {
slides[id].style.transform = `translate3d(${index * 100}%,0,0)`
})
}
})
Presets
Belt
A simple belt slider
import {belt} from 'paraglider/presets'
belt(document.querySelector('.belt'))
Multi belt
A belt slider that allows having multiple visible slides.
import {multiBelt} from 'paraglider/presets'
multiBelt(document.querySelector('.belt', {visibleItems: 2}))
Cover
Covers the current slide.
import {coverRight, coverLeft, coverLeftRight} from 'paraglider/presets'
coverLeft(document.querySelector('.coverLeft'))
coverRight(document.querySelector('.coverRight'))
coverLeftRight(document.querySelector('.coverLeftRight'))
© 2017 by Gregor Adams
Configuration
Configuration
Class names
{object} classNames- Mapping of class names to be used by the plugin.
{string} [classNames.pluginLoaded='pluginLoaded']- Applied when the plugin has been loaded
{string} [classNames.init='init']- Applied when the plugin has been initialized. Removed on first interaction.
{string} [classNames.slides='slides']- This element will be used to track touches. This is the wrapper around the slides.
{string} [classNames.slide='slide']- Selector for each single slide.
{string} [classNames.current='current']- Applied to the currently visible slide
{string} [classNames.previous='previous']- Applied to the previous slide in the queue
{string} [classNames.next='next']- Applied to the next slide in the queue
{object} addClasses- Map of class names to be added to slides.
{object} [addClasses.previous=true]- Sets previous class name to slides.
{object} [addClasses.current=true]- Sets current class name to slides.
{object} [addClasses.next=true]- Sets next class name to slides.
{object} addMultiClasses- Map of class names to be added to slides using a counter.
{object} [addMultiClasses.previous=undefined]- Sets previous class name to slides using a counter.
{object} [addMultiClasses.current]- Sets current class name to slides using a counter.
{object} [addMultiClasses.next=undefined]- Sets next class name to slides using a counter.
Options
{boolean} [enableTouch=true]- Enable touch interaction.
{boolean} [enableSwipe=true]- Enable mouse/drag/swipe interaction.
{boolean} [loop=false]- Enable looping slides.
{number} [speed=250]- Animation duration when using paging.
{number} [spring=100]- Animation duration when snapping.
{number} [snapBackAt=0.25]- Amount of distance needed to snap. [0, 1]
{number} [threshold=10]- Threshold of pixels until the sliding mechanisms is triggered.
{number} [initialSlide=0]- Initially visible slide
{number} [visibleSlides=1]- Amount of visible slides
{number} [slideBy=1]- Amount of slides to slide on interaction
Loop
[loop=true] {boolean}
Looping can be disabled with this flag.
Warning! This does not work well when
visibleSlides > 1.
Issue reports welcome
Contributions welcome
import {belt} from 'paraglider/presets'
belt(document.querySelector('.belt'), {loop: false})
Visible slides
[visibleSLides=1] {number}
Show more than one slide.
Warning! This does not work well when
loop === false.
Issue reports welcome
Contributions welcome
import {multiBelt} from 'paraglider/presets'
multiBelt(document.querySelector('.belt'), {visibleSlides: 3})
Amount of next slides
[slideBy=1] {number}
Allows sliding by more than one item.
Warning! Requires
visibleSlides >= slideBy.
import {multiBelt} from 'paraglider/presets'
multiBelt(document.querySelector('.belt'), {visibleSlides: 3})
Enable Touch
[enableSwipe=true] {boolean}
Disable or enable swiping with touch.
import {belt} from 'paraglider/presets'
belt(document.querySelector('.belt'), {enableTouch: false})
Enable Swipe
[enableSwipe=true] {boolean}
Disable or enable swiping with the mouse.
import {belt} from 'paraglider/presets'
belt(document.querySelector('.belt'), {enableSwipe: false})
Initial slide
[initialSlide=0] {boolean}
Set the initially active slide
import {belt} from 'paraglider/presets'
belt(document.querySelector('.belt'), {initialSlide: 1})
Threshold
[threshold=10] {number}
Pixel value before swiping will activate (helps on iOS to optimize scrolling).
Warning! Creates a minor jump depending on the value.
10px seems to be default for most developers and similar plugins.
import {multiBelt} from 'paraglider/presets'
multiBelt(document.querySelector('.belt'), {threshold: 5})
Snap back
[snapBackAt=0.25] {number}
Progress needed to snap to the next slide. [0, 1]
import {multiBelt} from 'paraglider/presets'
multiBelt(document.querySelector('.belt'), {snapBackAt: 0.5})
Speed and duration
[speed=250] {number}
Speed defines the time the animation takes when nextSlide or prevSlide are called.
[spring=100] {number}
Spring defines the time the animation takes when touch or mouse interaction is stopped (touchend, mouseup)
import {belt} from 'paraglider/presets'
belt(document.querySelector('.belt'), {speed: 1000, spring: 300})
Add classes
addClasses {object}
previous {boolean}current {boolean}next {boolean}
Allows defining if class names should be added to the slides.
addMultiClasses {object}
previous {boolean}current {boolean}next {boolean}
Allows defining if class names should be added to the slides if multiple are visible.
current__0, current__1, ...
import {belt} from 'paraglider/presets'
belt(document.querySelector('.belt'), {addClasses: {current: true}})
Callbacks
{(null|onInit)} [onInit=null]- Callback when the slider has been created.
{(null|onDestroy)} [onDestroy=null]- Callback when the slider has been destroyed.
{(null|onSlide)} [onSlide=null]- Callback while the slider is moving.
{(null|onEnd)} [onEnd=null]- Callback while the slider stopped moving.
Initialized
[onInit=null] {null|function}
Defaults to null and does nothing. Can be a function with parameters
import Glider from 'paraglider'
const glider = new Glider({
onInit({previous, current, next, rest}, slides, options) {
slides[current].style.transform = 'translate3d(0,0,0)'
}
})
Destroyed
[onDestroy=null] {null|function}
Defaults to null and does nothing. Can be a function
import Glider from 'paraglider'
const glider = new Glider({
onDestroy() {
// ...
}
})
Sliding
[onSlide=null] {null|function}
Defaults to null and does nothing. Can be a function with parameters
import Glider from 'paraglider'
const glider = new Glider({
onSlide(progress, {previous, current, next, rest}, slides, options) {
slides[current].style.transform = 'translate3d(${100 * progress}%,0,0)'
// ...
}
})
Finished
[onEnd=null] {null|function}
Defaults to null and does nothing. Can be a function with parameters
import Glider from 'paraglider'
const glider = new Glider({
onEnd({previous, current, next, rest}, slides, options) {
slides[current].style.transform = 'translate3d(0,0,0)'
}
})
© 2017 by Gregor Adams
Example
References
References
Class Summary
| Static Public Class Summary | ||
| public |
Glider: class Paraglider plugin. |
|
Function Summary
| Static Public Function Summary | ||
| public |
belt(glider: Element, opts: PRESET_DEFAULTS): function Belt animation slider. |
|
| public |
coverLeft(glider: Element, opts: PRESET_DEFAULTS): function Cover left animation slider |
|
| public |
coverLeftRight(glider: Element, opts: PRESET_DEFAULTS): function Cover left/right animation slider |
|
| public |
coverRight(glider: Element, opts: PRESET_DEFAULTS): function Cover right animation slider |
|
| public |
dataWrapper(glider: Element, opts: DATA_DEFAULTS): function Wraps Paraglider to apply pagers and navigation buttons and autoplay. |
|
| public |
multiBelt(glider: Element, opts: PRESET_DEFAULTS): function Belt animation slider. |
|
| public |
multiWrapper(glider: Element, opts: PRESET_DEFAULTS): function Wrapper including navigation arrows. |
|
| public |
wrapper(glider: Element, opts: PRESET_DEFAULTS): function Simple wrapper including pagers and navigation arrows. |
|
| Static Private Function Summary | ||
| private |
animate(speed: integer, from: number, to: number, callback: animationCallback): function Animates from one value to the other over a given time. |
|
| private |
arrayOrValue(arr: array): any Takes an array and returns a single value if it is the only item. |
|
| private |
eitherOr(either: any, or: any): any Returns either the first or second value depending on truthness. |
|
| private |
Helper to get elements. |
|
| private |
Helper to get elements. |
|
| private |
A loop using modulo |
|
| private |
parseObject(dataset: dataset): object Parse dataset with nested object strings to a true object |
|
| private |
preventDefault(e: Event) Prevents default event |
|
| private |
toggleClass(el: Element, className: string, bool: boolean) Toggle class ponyFill to support IE11 and other awkward browsers. |
version [version] |
Variable Summary
| Static Public Variable Summary | ||
| public |
Defaults for the presets. |
|
| public |
Defaults for the presets. |
|
| Static Private Variable Summary | ||
| private |
Default classList for the plugin. |
|
Typedef Summary
| Static Public Typedef Summary | ||
| public |
callbackData: * |
|
| public |
onDestroy(options: PLUGIN_DEFAULTS | PRESET_DEFAULTS): * Callback when the Glider has been destroyed |
|
| public |
onEnd(data: callbackData, slides: Array<Element>, options: callbackOptions): * Callback when the Glider stopped moving |
|
| public |
onInit(data: callbackData, slides: Array<Element>, options: PLUGIN_DEFAULTS | PRESET_DEFAULTS): * Callback when the Glider has been created |
|
| public |
onSlide(progress: number, data: callbackData, slides: Array<Element>, options: callbackOptions): * Callback while the Glider is moving |
|
| Static Private Typedef Summary | ||
| private |
animationCallback(progress: number): * |
|
FAQ
FAQ
- Does this work in internet Explorer 9?
- Maybe, I haven't tested it.
- Does this work with other Plugins?
- If I create examples will you list them here?
- Yes definitely, simply create a pull request and add it to the
manual/EXAMPLE.mdfile
- Yes definitely, simply create a pull request and add it to the
© 2017 by Gregor Adams