Un slider en vanilla JS ultralight
Vous êtes dans l’écoconception de sites web (ou pas) et vous cherchez un slider en vanilla JS, ultralight (6 ko), adaptable et couvrant vos besoins les plus courants ? Essayez Elegant Slider, un slider que j’ai développé moi-même dans l’esprit éco-conception. Je l’utilise en production depuis plus d’un an.
Elegant Slider est un slider que j’ai développé pour mon usage pro et que j’utilise en production depuis plus d’un an maintenant.
Il est ultra-léger (5.5 ko de JS et 1.2 ko de CSS une fois mignifié), compatible tous navigateurs, responsive.
J’ai également porté attention son accessibilité, avec tous les aria-* qui vont bien.
Son intégration dans votre code est pensée pour être la plus souple et la plus simple possible.
Aperçu rapide
Ce que fait Elegant Slider
Il est pensé pour couvrir les besoins classiques.
- Animations au choix : aucune, changement d’opacité, ou translation.
- Gestion des slides infinis : il passe du dernier slide au premier (ou l’inverse) de manière totalement fluide.
- Changement de slide automatique ou déclenché par l’utilisateur.
- 100 % responsive.
- Gestion des touch events sur écran tactile.
- Interface utilisateur configurable : boutons précédent/suivant, barre de navigation, affichage du numéro du slide.
Il dispose d’une API simple, déclenche un custom event lors du changement de slide et peut être contrôler de l’extérieur.
Ce que ne fait pas Elegant Slider
- Des animations de ouf (mais les animations de base peuvent être affinée grâce à du CSS)
- Afficher plus d’un slide par écran.
Par rapport aux alternatives
- Swiffy Slider : un peu plus léger (4,2 ko), mais ne gère par le slide infini, et nécessite un script complémentaire (de 4 ko) pour pouvoir fonctionner correctement sur Safari. De plus, l’animation est forcément de type translate.
- Glide : plus de fonctionnalités et d’animations « fancy », mais tout de même 28 ko.
- Swiper : là encore, beaucoup plus riche dans les animations proposées, mais fait 100 ko mignifié !
- Sliders liés à un framewok ou une bibliothèque (Tailwind, Bootstrap…) : non seulement ils ne sont pas aussi légers, mais c’est souvent un peu la prise de tête pour isoler le code strictement nécessaire de la bibliothèque.
Tutoriel
Pour utiliser Elegant Slider, vous allez avoir besoin de deux fichiers : slider.js
et slider.css
. Vous trouverez ces deux fichiers sur mon repo Github.
HTML
Dans votre page web, collez le code HTML suivant :
<div class="slider-wrapper">
<div class="slides-tape"> <!-- add fade-transition class if needed -->
<div class="slide"></div>
<div class="slide"></div>
<div class="slide"></div>
</div>
</div>
CSS
Rendez le CSS contenu dans le fichier slider.css
accessible à votre page web, de la manière que vous préférez. Pour des questions d’efficacité, vous pouvez ou bien l’intégrer à votre fichier CSS principal, ou bien le mettre dans une balise <style> dans le <head>.
J’ai mis quelques commentaires dans ce fichier, mais vous ne devriez pas avoir besoin d’y toucher.
JavaScript
Création du slider
Le fichier slider.js
exporte la fonction createSlider, qui prend en argument le HTMLElement qui contient le slider, ainsi qu’un objet avec des paramètres optionnels.
Pour créer un slider, il suffit de trois lignes.
import createSlider from "./path/to/slider.js";
// selection du nœud
const sliderWrapper = document.querySelector(".slider-wrapper");
// creation du slider avec les options par défaut.
const mySlider = createSlider(sliderWrapper);
Paramètres
La fonction createSlider accepte un objet comme second argument optionnel.
Voici la structure de cet objet, avec les valeurs par défaut.
const mySlider = createSlider(sliderWrapper, {
// animation duration in ms (int)
animationTiming: 200,
// slide display duration in ms
// (int. 0 → manual switch between slides)
pauseTiming: 0,
// infinite loop between slides (bool)
infiniteCycle: false,
// show previous / next buttons (bool)
showArrows: true,
// show navgation dots (boolean),
showDots: true,
// show slide number, eg. 2/15 instead of dots
// (boolean, prevails on showDots option)
showSlideNumber: false,
// prevent touch events, for 100% automatic slider
preventTouchEvents: false
});
Le choix du type de transition (translate ou fade) se fait via la classe fade-transition appliquée – ou pas – sur le wrapper du slider.
Attention : à cause du positionnement absolu des slides dans le cas d’une animation de type fade, il vous faudra préciser la hauteur du slider (via les propriétés CSS height, min-height ou aspect-ratio)
API
Le changement de slide déclenche un événement slideChange sur le HTMLElement du slider.
import createSlider from "./path/to/slider.js";
const sliderWrapper = document.querySelector(".slider-wrapper");
const mySlider = createSlider(sliderWrapper);
sliderWrapper.addEventListener("slideChange", (e) => {
console.log(e.detail) // affiche le numéro du slide actif
console.log(mySlider.position) // idem
})
L’objet Slider est manipulable de l’extérieur via la méthode showSlide(int slideNumber, bool isAnimated = false) et la propriété position qui correspond au numéro du slide affiché (compté à partir de 1).
import createSlider from "./path/to/slider.js";
const sliderWrapper = document.querySelector(".slider-wrapper");
const mySlider = createSlider(sliderWrapper);
mySlider.showSlide(2); // affiche le deuxième slide avec animation
mySlider.showSlide(3, false); // affiche le 3e slide sans animation de transition
let activeSlide = mySlider.position; // numéro du slide actif
Ceci vous permet, par exemple, de créer des vignettes qui, lorsqu’on clique dessus, affiche le slide correspondant.
Démos
Démo n° 1, avec les options suivantes :
{infiniteCycle: true}
Démo n° 2, avec les options suivantes :
{
infiniteCycle: true,
showSlideNumber: true,
showArrows: false,
pauseTiming: 2500,
animationTiming: 1000
}
Démo n° 3, avec les options suivantes :
{
showArrows: false,
pauseTiming: 2500,
animationTiming: 1000,
preventTouchEvents: true
}
Conclusion
Si vous avez besoin d’un slider simple et efficace, n’hésitez pas à tester Elegant Slider. Faites-moi part de vos remarques. Et n’oubliez pas le lazy loading sur vos images ! 😊