Galerie✨ Premium

Thumbnail Slider

Grande vue et rangée de miniatures-boutons : un clic, Entrée ou un glisser sur l'image fait glisser la vue, et la miniature active s'encadre de blanc.

JSThumbnailsGallery

Mis à jour le

Cet effet fait partie d'Effect.Labs — 840 effets vanilla, une partie gratuite, une partie premium. Galerie comprend 44 effets, dont 6 gratuits. Découvrir la catégorie →

3 exemples d'usage

Choisir la couverture d'un faire-part — Thumbnail Slider exemple 1

① Choisir la couverture d'un faire-part

QuandSur le configurateur de la papeterie Papyrelle, l'aperçu du faire-part occupe la colonne de gauche et quatre miniatures (feuillage, arche, soleil, marée) sont posées dessous ; à droite, le format, le papier et le prix pour 50 exemplaires. Cliquer une miniature fait glisser l'aperçu vers ce modèle.
PourquoiLa miniature sert de bouton de choix et la grande vue de preuve : on compare les modèles sans quitter la page ni ouvrir une fenêtre. Le cadre autour de la miniature active rappelle quelle couverture est sélectionnée.
Réglages--tsl-ratio: 280/176, miniatures de 52 × 36 px (--tsl-thumb-w, --tsl-thumb-h), quatre <img> (illustrations SVG) dans les diapositives et les miniatures. Cadre de la miniature active passé en brun et fond des miniatures en beige par la CSS de la scène. La capture clique la 3e miniature.
Chapitres d'un cours vidéo en ligne — Thumbnail Slider exemple 2

② Chapitres d'un cours vidéo en ligne

QuandSur la plateforme Cursivane, le module « Typographie pour le web » montre le chapitre en cours dans un grand cadre avec son titre, et les cinq chapitres en vignettes dessous, chacune avec sa durée. À droite : progression, durée du module, exercice. Cliquer une vignette change le chapitre affiché.
PourquoiLes miniatures deviennent une table des matières visuelle : on voit d'un coup d'œil combien de chapitres restent et on saute directement à celui qu'on veut revoir.
Réglages--tsl-ratio: 368/188, vignettes de 68 × 40 px alignées à gauche, durée posée en surimpression dans chaque miniature (contenu HTML du bouton), cadre actif lavande. Dans un vrai cours, chaque diapositive contiendrait l'aperçu cliquable de la vidéo.
Album d'une sortie scolaire sur téléphone — Thumbnail Slider exemple 3

③ Album d'une sortie scolaire sur téléphone

QuandDans l'espace parents de l'école des Haubrines, sur mobile : la photo de la sortie au muséum remplit la largeur de l'écran, les cinq miniatures sont alignées dessous et le bouton « Tout télécharger » termine l'écran. Les parents balaient la photo du pouce ; la miniature active se déplace en même temps.
PourquoiSur un téléphone, le glisser est le geste naturel pour feuilleter des photos ; les miniatures restent utiles pour sauter directement à une image et savoir où l'on en est dans l'album.
Réglages--tsl-ratio: 1 (photo carrée), miniatures de 26 px avec 4 px d'écart, cadre actif ambre. La capture rejoue le geste toutes les 1,1 s en envoyant au vrai code un pointerdown puis un pointerup tactiles environ 115 px plus à gauche ; le rond qui glisse est un repère dessiné par la scène.

Comment ça marche

Dans .fx-0165-root, le bloc .tsl-slider empile une fenêtre .tsl-viewport (format 2/1 par défaut, coins arrondis) et une rangée .tsl-thumbs. La fenêtre contient une piste .tsl-track où chaque .tsl-slide occupe toute la largeur ; afficher la diapositive n revient à décaler la piste de translateX(-n × 100 %) en 0,5 s.

Chaque miniature est un vrai <button> : la n-ième miniature affiche la n-ième diapositive (l'ordre fait le lien, aucun index à écrire). La miniature active porte aria-current="true", ce qui lui donne l'opacité pleine et le cadre blanc ; les autres restent à 50 %. Sur la grande vue, un glisser horizontal de plus de 50 px au doigt ou à la souris passe à la suivante ou à la précédente, en boucle, et la miniature suit.

Les images de l'acheteur se posent directement : une <img> dans une diapositive ou une miniature la couvre entièrement (object-fit: cover). Sans image, les cinq dégradés de la démo s'affichent. Le script prend chaque .fx-0165-root de la page séparément : plusieurs galeries cohabitent sans se gêner.

Accessibilité

  • Miniatures atteignables : boutons natifs, donc Tab, Entrée et Espace fonctionnent ; chacune porte un nom (« Afficher la diapositive 2 ») et la miniature en cours est signalée par aria-current. Contour :focus-visible blanc.
  • Rôles de carrousel : région aria-roledescription="carrousel" nommée ; diapositives role="group" annoncées « 2 sur 5 ». La piste est en aria-live="polite" : la diapositive choisie est lue.
  • Diapositives cachées : inert, donc un lien ou un bouton placé dans une image non affichée ne prend pas le focus.
  • Mouvement réduit : sous prefers-reduced-motion: reduce, la vue change sans glissement ; rien d'autre ne bouge seul.
  • Toucher : Pointer Events et touch-action: pan-y sur la grande vue : un geste horizontal change de photo, un geste vertical fait défiler la page.

Compatibilité navigateur

JavaScript sans dépendance (Pointer Events, aria-current comme crochet de style), aspect-ratio (Chrome 88, Firefox 89, Safari 15) et inert (Chrome 102, Firefox 112, Safari 15.5 d'après MDN). Mesuré dans Chromium 151, Firefox 153 et WebKit 26.5 (Playwright) : deux galeries dont la 2e pilotée seule, miniatures au clavier, mouvement réduit, 390 px sans débordement, glisser au doigt (Chromium) sans bloquer le défilement vertical, 0 erreur.

Chrome 102+✓ Complet (mesuré)
Firefox 112+✓ Complet (mesuré)
Safari 15.5+✓ Complet (mesuré dans WebKit)
Edge 102+✓ Complet (moteur Chromium)
Mobile iOS 15.5+✓ Moteur WebKit, non vérifié sur appareil
Android Chrome 102+✓ Complet (toucher mesuré)

Sans JavaScript, la première image et les miniatures s'affichent mais les miniatures ne font rien. Sans aspect-ratio (navigateurs de 2020), la grande vue n'a pas de hauteur : donnez-lui une hauteur fixe.

Le code

Structure HTML à coller dans votre page (le CSS + JS sont inclus avec votre achat) :

index.html — structure
<div class="fx-0165-root">
  <div class="tsl-slider" role="region" aria-roledescription="carrousel" aria-label="…">
    <div class="tsl-viewport">
      <div class="tsl-track" aria-live="polite">
        <div class="tsl-slide" role="group" aria-roledescription="diapositive" aria-label="1 sur 5"><img src="…" alt="…"></div>
        …
      </div>
    </div>
    <div class="tsl-thumbs">
      <button class="tsl-thumb" type="button" aria-label="…" aria-current="true"><img src="…" alt=""></button>
      <button class="tsl-thumb" type="button" aria-label="…"><img src="…" alt=""></button>
      …
    </div>
  </div>
</div>

Paiement unique, sans abonnement — le code est à toi pour toujours

Personnaliser

Options passées à l'API ou attributs data-* :

Option / propriétéDéfautEffet
Largeur maximale (CSS — --tsl-max-width) 640px La galerie prend la largeur de son conteneur jusqu'à cette limite ; none pour toute la largeur.
Proportions de la grande vue (CSS — --tsl-ratio) 2 / 1 Rapport largeur/hauteur de la fenêtre. Les images sont recadrées pour la remplir.
Taille des miniatures (CSS — --tsl-thumb-w / --tsl-thumb-h) 50px / 32px Largeur et hauteur de chaque bouton-miniature. La rangée passe à la ligne si elle manque de place.
Images (HTML — <img> dans .tsl-slide et .tsl-thumb) aucune : 5 dégradés « Slide 1 » à « Slide 5 » Une image par diapositive et sa version réduite dans la miniature de même rang. Gardez autant de miniatures que de diapositives.
Nom des miniatures (HTML — aria-label de .tsl-thumb) « Afficher la diapositive 1 »… Texte lu par les lecteurs d'écran ; mettez-y ce que montre l'image (« Couverture Arche »).
Miniature active (CSS — .tsl-thumb[aria-current="true"]) opacité 1, cadre #fff de 2 px Changez la couleur du cadre ou l'opacité des miniatures inactives (0,5 par défaut).

FAQ

Par leur rang : la 3e miniature de .tsl-thumbs affiche la 3e .tsl-slide. Pour réordonner, déplacez la diapositive et sa miniature ensemble.
Oui, une diapositive accepte n'importe quel HTML, y compris <video>. Les diapositives cachées sont inert mais une vidéo qui joue continue de jouer : mettez-la en pause vous-même si vous changez de diapositive pendant la lecture.
Oui : glisser de plus de 50 px horizontalement sur la grande vue, bouton gauche enfoncé, change de diapositive. Les images ne partent pas en glisser-déposer et le texte n'est pas sélectionné pendant le geste.