What is jedliSlider?
IMPORTANT: FOR NOW ONLY THE CONTINUOUS MODE IS FULLY IMPLEMENTED!
jedliSlider is lightweight carousel with multiple options and modes to use on your page, created in pure (vanilla) javascript and css.
IMPORTANT: FOR NOW ONLY THE CONTINUOUS MODE IS FULLY IMPLEMENTED!
jedliSlider is lightweight carousel with multiple options and modes to use on your page, created in pure (vanilla) javascript and css.
Because it’s easy to use, modern and will have all options that you want. Some popular carousels still use floats and a lot of unnecessary scripts/styles. My intention was to create one slider, that will contain all things i missed in other carousels. With as low code and css as possible. So you don't need to override some default styles and download multiple libraries for specific types of carousels.
jedliSlider is built on css flexbox. So will be compatible with every browser that supports flexbox.
"npm install jedlislider"
jedliSlider at NPMImport slider:
import jedliSlider from 'jedlislider/src-webpack/jedlislider.js'
and import styles (one of this):
add this files to your wesbite by script and link tag:
And one of this:
Simple html structure
<div data-item="slider">
<div>
slide 1
</div>
<div>
slide 2
</div>
<div>
slide 3
</div>
</div>
let sliderContinuousEqual = new jedliSlider(document.querySelector("[data-item='slider-continuous-equal']"), {
"mode": "continuous",
"slidesWidth": "equal",
"visibleSlides": "4",
"speed": "5",
"direction": "right",
})
let sliderContinuousEqualLeft = new jedliSlider(document.querySelector("[data-item='slider-continuous-equal-left']"), {
"mode": "continuous",
"slidesWidth": "equal",
"visibleSlides": "4",
"speed": "5",
"direction": "left",
"pauseOnHover": "true"
})
let sliderContinuousAuto = new jedliSlider(document.querySelector("[data-item='slider-continuous-auto']"), {
"mode": "continuous",
"slidesWidth": "auto",
"visibleSlides": "auto",
"speed": "5",
"direction": "right",
})
let sliderDefaultEqual = new jedliSlider(document.querySelector("[data-item='slider-default-equal']"), {
"mode": "default",
"slidesWidth": "equal",
"visibleSlides": 5,
"easing": "ease-out",
"slidesToScroll": 2,
"speed": "600",
"preventOverScroll": "true",
})
// Nav for sliderDefaultEqual
// Prev slide
document.querySelector("[data-action='slider-default-equal-prev']").addEventListener("click", () => {
sliderDefaultEqual.slidePrev();
})
// Next slide
document.querySelector("[data-action='slider-default-equal-next']").addEventListener("click", () => {
sliderDefaultEqual.slideNext();
})
// Go to specific slide
let sliderDefaultEqualGoToSlide = document.querySelector("[data-action='slider-default-equal-to-slide']");
sliderDefaultEqualGoToSlide.addEventListener('click', () => {
// Get value from input number
const value = +document.querySelector("[data-item='slider-default-equal-slide-index']").value;
sliderDefaultEqual.goToSlide(value);
})
let sliderDefaultEqual = new jedliSlider(document.querySelector("[data-item='slider-default-equal']"), {
"mode": "default",
"slidesWidth": "equal",
"visibleSlides": 5,
"easing": "ease-out",
"slidesToScroll": 2,
"speed": "600",
})
// Nav for sliderDefaultEqual
// Prev slide
document.querySelector("[data-action='slider-default-equal-prev']").addEventListener("click", () => {
sliderDefaultEqual.slidePrev();
})
// Next slide
document.querySelector("[data-action='slider-default-equal-next']").addEventListener("click", () => {
sliderDefaultEqual.slideNext();
})
let sliderDefaultEqualInfinite = new jedliSlider(document.querySelector("[data-item='slider-default-equal-infinite']"), {
"mode": "default",
"slidesWidth": "equal",
"infinite": "true",
"visibleSlides": 5,
"easing": "ease-out",
"slidesToScroll": 2,
"speed": "600",
"preventOverScroll": "false",
})
// Nav for sliderDefaultEqual
// Prev slide
document.querySelector("[data-action='slider-default-equal-infinite-prev']").addEventListener("click", () => {
sliderDefaultEqualInfinite.slidePrev();
})
// Next slide
document.querySelector("[data-action='slider-default-equal-infinite-next']").addEventListener("click", () => {
sliderDefaultEqualInfinite.slideNext();
})
let sliderDefaultEqualInfiniteAutoplay = new jedliSlider(document.querySelector("[data-item='slider-default-equal-infinite-autoplay']"), {
"mode": "default",
"slidesWidth": "equal",
"infinite": "true",
"visibleSlides": 5,
"easing": "ease-out",
"slidesToScroll": 2,
"speed": "600",
"preventOverScroll": "false",
"autoplay": "true",
"autoplaySpeed": "2500",
"pauseOnHover": "true",
})
Basic nav structure:
attr/id/class whatever to get this element
and add to your buttons attr jedli-target with number of slide that you want it to move
<div data-item="example-nav">
<button jedli-target="1" >
go to 1
</button>
<button jedli-target="2" >
go to 2
</button>
<button jedli-target="3" >
go to 3
</button>
</div>
let sliderDefaultEqualInfiniteNav = new jedliSlider(document.querySelector("[data-item='slider-default-equal-infinite-nav']"), {
"mode": "default",
"slidesWidth": "equal",
"infinite": "true",
"visibleSlides": 5,
"easing": "ease-out",
"slidesToScroll": 2,
"speed": "600",
OPTIONS FOR NAV
"generateNav": "true",
"navContainer": document.querySelector("[data-item='example-nav']"),
})
Open console and play with this slider to see effects
*Get block with slider
let sliderEventsContainer = document.querySelector("[data-item='slider-default-events']");
*Catch event init
*You have to declarate init event before declaration of slider
sliderEventsContainer.addEventListener('init', () => {
console.log("Init");
})
let sliderEventsInit = new jedliSlider(sliderEventsContainer, {
"mode": "default",
"slidesWidth": "equal",
"infinite": "true",
"visibleSlides": 5,
"easing": "ease-out",
"slidesToScroll": 2,
"speed": "600",
"preventOverScroll": "false",
})
*Catch event beforeChange
sliderEventsContainer.addEventListener('beforeChange', () => {
console.log("Before change");
})
*Catch event afterChange
sliderEventsContainer.addEventListener('afterChange', () => {
console.log("After change");
})
// Custom easing
let sliderCustomEasing = new jedliSlider(document.querySelector("[data-item='slider-custom-easing']"), {
"mode": "default",
"slidesWidth": "equal",
"infinite": "true",
"visibleSlides": 1,
"easing": "ease-out",
"slidesToScroll": 1,
"speed": "600",
"preventOverScroll": "false",
// HERE YOU DECLARATE ANIMATION:
"animationChange": "fade"
})
document.querySelector("[data-action='slider-custom-easing-prev']").addEventListener("click", () => {
sliderCustomEasing.slidePrev();
})
// Next slide
document.querySelector("[data-action='slider-custom-easing-next']").addEventListener("click", () => {
sliderCustomEasing.slideNext();
})
// Create structure, add attr jedli-category to your slides. For example:
<div data-item="slider">
<div jedli-category="first-category" >
slide 1
</div>
<div jedli-category="second-category" >
slide 2
</div>
<div jedli-category="first-category" >
slide 3
</div>
</div>
// Initialize your slider, there is no need for special options
// And trigger by the way you want function filter() on slider object
"all" to see all slides
YourSlider.filter('all');
YourSlider.filter('first-category');
YourSlider.filter('second-category');
// There is an option to set delay before filtering, so you could add custom animation of change or anything
// Option to set delay:
"filterDelay"
for example:
"filterDelay": 300,
// Events for filtering
- "beforeFilter"
- "afterFilter"
Example:
*Catch event init
*You have to declarate init events before declaration of slider
document.querySelector("[your-slider]").addEventListener('beforeInit', () => {
console.log("beforeInit");
})
document.querySelector("[your-slider]").addEventListener('afterInit', () => {
console.log("afterInit");
})
*Catch event beforeChange
document.querySelector("[your-slider]").addEventListener('beforeChange', () => {
console.log("Before change");
})
*Catch event afterChange
document.querySelector("[your-slider]").addEventListener('afterChange', () => {
console.log("After change");
})
Example:
Define your slider
let yourSlide = new jedliSlider(document.querySelector("[your-slider']"), {
options here
})
Go to prev slide or slides if 'slidesToScroll is greater than 1'
yourSlide.slidePrev();
Go to next slide or slides if 'slidesToScroll is greater than 1'
yourSlide.slideNext();
Go to specific slide
yourSlide.goToSlide(value);
"responsive": [
{
"breakpoint": 992,
"options": {
"visibleSlides": 3
}
},
{
"breakpoint": 768,
"options": {
"visibleSlides": 2
}
}
]
Option: | Default: | Description: |
mode | default | jedliSlider contain few different modes, types of carousels. Select wanted one. This option define how almost all of other options will work |
slidesWidth | equal | determinate if all slides should be same size, specified by slider; or width of every slides can be different, specifed from css |
visibleSlides | 1 | This option works when "slidesWidth" is set to "equal". Determinate how much slides will be visible |
slidesToScroll | 1 | By how many slides should slider move, on action "nextSlide" or "prevSlide" |
draggable | true | Works only in 'default'mode, turn on/off touch/drag support |
speed | 400 | Transition duration of one single change. In "continuous" mode speed is amount of ms per every single px |
easing | linear | Define easing of slider move animation |
overflow | hidden | Define if slider should have overflow hidden or not |
pauseOnHover | false | Determinate if carousel should stop animation or autoplay on hover, or for accessibility reasons - on focus at any element inside slider |
direction | left | This option works in "continuous" mode. determinate if carousel should rotate from left to right, or right to left |
preventOverScroll | true | This option works in "default" mode. Determinate if slider should recalculate distance to animate when wanted amount of slides to scroll is greater than amount of slides. For example: (You are at 4th and 5th slide, there are 6 slides. But your slides to scroll is 2. With this option set to true instead of going 2 slides, slider will move only by 1 slide. |
infinite | false | This option works in "default" mode. Set carousel to work as infinite, without end. |
autoplay | false | Slider will automatically go to next/prev slide after specified time. Slider will stop change on track hover |
autoplaySpeed | 1500 | Time after next/prev event will be triggered |
autoplayDirection | right | Determinate if slider after specified amount of time should go to next or prev slide |
arrows | false | Determinate if slider should create arrows to navigate |
arrowPrev / arrowNext | - | Allows to create arrows with custom html. Attr to handle next/prev action will be added automatically. It's necessary to set "arrows" option to true. |
animationChange | transform | Allows to define animation of changing slide |
animationChange | transform | Allows to define animation of changing slide |
animationChange | transform | Allows to define animation of changing slide |
generateNav | false | Determinate if slider should look for navContainer to generate nav |
navContainer | -- | Html element in which slider will look for elements with jedli-target attributes. Value of jedli-target in those elements will determinate index of slider to go To. |
filterDelay | 0 | Set delay before filtering, so you could add custom animation of change or anything |
responsive | - | Set new options to work from specified breakpoint |