HTML5 et CSS3 suffisent pour créer un slider (diaporama) qui défile tout seul, sans une ligne de JavaScript.
Je vous propose un tutoriel dont le concept vient de Geoffrey Crofte, sur Creative Juiz (CSS3 – Créer un slideshow automatique et contrôlable), permettant de créer un slider (diaporama) en HTML5 / CSS3 et ce, sans JavaScript. Les animations CSS qu’il utilise fonctionnent dans tous les navigateurs actuels, sans préfixe -webkit- ou -moz- : Chrome, Edge, Firefox et Safari reconnaissent animation et @keyframes depuis 2015 au plus tard (voir la compatibilité de @keyframes sur MDN) : le code ci-dessous s’en passe donc.
Démonstration en ligne / sources
Fichiers de démonstrations sans utilisation de jQuery.
Démonstration en ligne du diaporama en HTML5 présenté dans ce tutoriel.
#1 – Le pattern HTML5
Ce que j’appelle le pattern, c’est tout simplement ce dont nous aurons besoin pour que notre slider fonctionne. C’est un peu la maquette HTML5 de notre slider, sans y intégrer de boucle PHP…
En HTML5, la balise <section> regroupe des contenus sur un même thème, tandis que les <div> restent réservées aux blocs sans signification particulière, utiles à la mise en forme (voir le standard HTML). Ensuite, nous mettrons nos slides dans une balise <figure>, qui associe une image à sa légende <figcaption> (ici, le titre du slide).
Voici la base de notre slider. J’utilise le site Fakeimg pour générer de fausses images, mais libre à vous de mettre vos images pour autant qu’elles respectent le format, chacune avec un texte alternatif qui la décrit à la place de alt="", sauf si sa légende dit déjà tout. Vous remarquerez que pour une question d’optimisation, je n’utilise pas de liste. Tout simplement, parce que ça ne me sert à rien… A ce code, nous ajouterons une timeline.
Astuce : afin d’éviter tout espace non désirable entre les images, je vous conseille de commenter vos indentations.
#2 – Le CSS3
Premièrement, concentrons-nous sur la mise en forme de ce slider :
Grâce à ce bout de code CSS, vous pouvez d’ores et déjà voir le container du slider prendre forme. Évidement, nous n’en resterons pas là. Nous allons gérer les débordement, les bordures, la taille totale du slider (taille = taille des slides x nombre de slides = 400%) :
Les largeurs fixes de 640 pixels de la première version débordaient de l’écran des smartphones : le slider s’adapte désormais à la largeur disponible, jusqu’à 640 pixels, et aspect-ratio conserve les proportions de 640 × 310 des images. object-fit: cover recadre une image d’un autre format au lieu de la déformer. Enfin, overflow: hidden sert de solution de secours aux navigateurs qui ne connaissent pas overflow: clip, dont je vous explique l’intérêt plus bas.
Vous pouvez voir que notre container à meilleur allure et que nos images sont masquées. Ensuite, nous allons nous occuper de nos légendes <figcaption> qui sont pour l’instant masquées également :
Vous devriez avoir quelque chose dans ce goût là :
#3 – L’animation
Pour la phase animation, il est nécessaire de se poser quelques question :
- Combien de temps nécessaire à la lecture du slide ?
- Combien de temps va durer la transition ?
- Combien ai-je de slides ?
Ces questions sont nécessaires car elles vont nous permettre de calculer notre temps total, notre temps d’animation, et notre temps de lecture.
En ayant ces valeurs, nous allons fixer les keyframes pour animer nos slides :
En créant ces keyframes, je boucle comme suit :
- A 0% du déroulement de l’animation, le slider, qui je vous le rappelle est égale à 400% de la taille d’un slide, n’est pas décalé ;
- Entre 20 et 25%, mon animation s’exécute ;
- A 25%, c’est-à-dire à 1/4 du déroulement de notre animation, je décale « slider » de -100% ;
- Entre 45 et 50%, mon animation s’exécute ;
- A 50%, je décale de 200% ;
- Entre 70 et 75%, mon animation s’exécute ;
- A 75%, je décale de 300% ;
- Entre 95 et 100%, mon animation s’exécute ;
- A 100%, je revient à 0 de décalage ;
Maintenant que nos keyframes sont fixées, nous allons déclarer ce que constitue l’animation slider. Retournez plus haut dans votre code, cherchez #slideshow .slider et ajoutez ceci :
En déclarant ceci, je donne à l’animation slider, un timer de 32 secondes… 32/4 => 8 secondes pour la lecture et l’animation. l’animation se déroule sur 5% du temps total, c’est-à-dire 1,6 secondes… Donc nos slides sont affichées en 6,4 secondes. Un peu de mathématiques, ça fait jamais de tort ! 🙂
Allez-y retester votre slider…. Et oui ça marche, vous en doutiez ?
Nous allons maintenant faire de même avec notre fameuse timeline…
Notre animation :
Nos keyframes :
De la même façon que les slides, les keyframes décrivent les étapes de l’animation. La timeline atteint sa largeur maximale 4 fois par cycle, à la fin de l’affichage de chaque slide (20, 45, 70 et 95 %), et revient à 0 au début, à la fin et à chaque changement de slide (0, 25, 50, 75 et 100 %). Sa largeur maximale, calc(100% - 30px), est celle des images, quelle que soit la taille de l’écran.
Avec le même procédé, nous allons définir l’animation de la légende pour chaque slide.
Nos keyframes :
Chaque légende remonte au début de l’affichage de son slide, reste visible, puis redescend sous l’image juste avant la transition suivante.
L’animation :
Reste l’accessibilité. Un slider qui défile tout seul gêne les personnes sensibles aux animations, qui peuvent demander à leur système de les réduire : la requête média prefers-reduced-motion permet de respecter ce réglage. Le tutoriel du W3C sur les carrousels recommande aussi de mettre l’animation en pause au survol de la souris et quand le clavier atteint le slider :
Au survol, l’animation se fige. Au clavier, comme pour les visiteurs qui demandent moins d’animations, elle s’arrête et les slides défilent à la main : le lien sélectionné reste ainsi visible. C’est la raison d’être d’overflow: clip : avec overflow: hidden seul, le cadre resterait décalé une fois le clavier parti, et le slider afficherait les mauvais slides. Le critère 2.2.2 des WCAG demande en outre de pouvoir mettre en pause, arrêter ou masquer tout contenu qui bouge automatiquement pendant plus de 5 secondes : le W3C conseille pour cela un bouton qui arrête et relance l’animation, à prévoir si votre site doit être pleinement accessible.
#4 – L’intégration dans WordPress
Une fois votre slider effectué, voici comment l’intégrer à WordPress. Évitez de coller le CSS dans le fichier style.css de votre thème : la prochaine mise à jour du thème effacerait vos modifications. Le plus simple consiste à créer une petite extension (voyez comment créer un plugin de fonctions) : dans un dossier wp-content/plugins/wpc-slider/, enregistrez tout le CSS de ce tutoriel dans un fichier slider.css, puis ajoutez ce fichier wpc-slider.php :
La fonction wpc_slider_shortcode() remplace la boucle query_posts() de la première version de ce tutoriel, une fonction que sa documentation officielle déconseille. Elle crée le code court [wpc_slider], qui affiche les 4 derniers articles dotés d’une image mise en avant, et ne charge la feuille de style, avec wp_enqueue_style(), que sur les pages qui affichent le slider. Les liens sont collés les uns aux autres pour éviter le décalage des images, et celles-ci sont chargées tout de suite (eager) : en chargement différé, les slides cachés ne se chargeraient qu’au moment d’apparaître.
Activez l’extension depuis Extensions > Extensions installées, puis insérez [wpc_slider] dans un bloc Code court, dans une page ou un article. Avec un thème à blocs, pour placer le slider dans un modèle de l’éditeur de site (Apparence > Éditeur), utilisez plutôt un bloc HTML personnalisé : dans un modèle, le bloc Code court ajoute des paragraphes dans le HTML du slider, qui ne fonctionne plus. Le CSS est calculé pour 4 slides : si vous changez leur nombre, recalculez les keyframes.
Pour des images fixes plutôt que vos derniers articles, collez le HTML du pattern (la version avec les commentaires) dans un bloc HTML personnalisé, et chargez la feuille de style sur tout le site en ajoutant wp_enqueue_style( 'wpc-slider' ); à la fin de la fonction wpc_slider_register_style().
Une alternative sans animation : le carrousel scroll-snap
Si le défilement automatique n’est pas indispensable, les propriétés CSS scroll-snap donnent un carrousel que l’internaute fait défiler lui-même, au doigt, au pavé tactile ou avec la barre de défilement : chaque image se cale d’elle-même dans le cadre, et la question de la pause ne se pose plus. Le HTML se limite à une suite de figures :
Ces propriétés fonctionnent dans tous les navigateurs actuels (voir la compatibilité de scroll-snap-type sur MDN). Ce carrousel se place lui aussi dans un bloc HTML personnalisé, avec son CSS chargé de la même façon.
Si vous m’avez suivi jusqu’ici vous savez désormais coder un diaporama en HTML5 / CSS3 pour WordPress !
Si vous préférez une version animée en JavaScript, découvrez comment créer un slider personnalisé avec jQuery.
34 réponses
Bonjour
Je trouve le tutoriel super bien, je ‘en sert tout en gardant la licence, juste je veux ajouter dans chaque image slide un lien hypertexte mais j’arrive pas a le faire ce n’est pas par ce que je ne sais pas non, mais je perd de la qualité du slide s’il vous plait comment arriver a ça? Merci beaucoup/
C’est super, seulement sur mon site j’ai besoin de mettre plus que 4 photos, quelle partie du code dois-je modifier pour pouvoir insérer au moins 10 photos dans ce slide?
bonjour ou bonsoir
apparemment il n’y à personne sur se forum, pas un seul conseil, aucune aide, merci beaucoup
j’ai compris le principe et trouver la solution, je ne connaissais pas cet technique étant autodidacte, la persévérance paye toujours, les forums ne servent à rien si il n’y a pas d’entraide
Bonjour,
je tiens à rappeler que les contributeurs du projet WordPress Channel sont tous des bénévoles et les tutoriels fournis ici doivent servir de base de travail pour apprendre.
Nous répondons dans la mesure du possible et de nos disponibilités.
Si vous attendez un support rapide, passez par le formulaire de contact et nous vous proposons une intervention dans le cadre d’une prestation.
re salut
j’ai oublier de préciser que que j’ai mit la valeur a 100% pour que la première image s’intègre parfaitement mais les autres images sont décaler et donc je ne l ai vois pas.
bonjours a tous,
vraiment terrible le tuto exactement se que je cherchais, tout fonctionne parfaitement en taille 640px, seulement voila je l’ai placer dans la sidebar,la div du slider est de 294×185.
je n’arrive pas a contrôler les @keyframes slider, j’ai beau regarder différents tuto traitant du sujet et rien n’y fait
je ne comprend pas a quoi correspond ces valeurs, disons que j’ai a peu près comprit que il y a un temps pour afficher l image un temps pour la laisser afficher et un autre temps pour afficher la suivante mais quand je change ces valeurs l’effet désiré ne fonctionne pas;
j’ai modifier le % et left mais rien ne s’affiche
@keyframes slider {
0%, 20%, 100% { left: 0 }
25%, 45% { left: -0% }
50%, 70% { left: -160% }
75%, 95% { left: -300% }
pouvez vous m’aider a comprendre comment on calcule tous ca, par ailleur dans le tuto il est question de :
je vous le rappelle est égale à 400% de la taille d’un slide, n’est pas décalé ;
comment a t’il calculer les 400% par rapport au slide de 640px
4 slides * 100% => 400 %.
Ne pas oubliez de commenter les espaces blancs du au retour de ligne et à l’indentation. Les espaces blancs génère du décalage.
Les keyframes ne doivent pas être changer si tu as 4 slides. tu dois juste adapter les taille fixe dans le CSS.
Bonjour,
Merci pour cet article, super intéressant!! Toutefois, comme une personne ayant commentée avant moi, j’ai également un problème avec les images. Seule la première apparaît correctement. Savez-vous ce qui pourrait expliquer cela?
Merci!
Bonjour,
je suis super bluffée car j’ai presque réussi en suivant votre tuto; mais pourquoi avoir choisi un query_post au lieu d’une image pour l’exemple? ça m’aurait permis d’aller au bout 😉
merci
Bonjour !
J’essaye d’utiliser ce tutoriel pour réaliser le slider que vous proposez en l’intégrant dans un article de mon site. La largeur étant un peu trop importante (maximum 520 de large), j’ai procédé à des ajustements de largeur qui fonctionne mais un problème persiste : je n’ai qu’une seule image qui apparaît dans le slider (même si je renseigne plusieurs adresse pour 4 images). il s’agit de la première image.
Pourriez-vous m’indiquer la démarche à suivre ? Cela peut-il venir du CSS ou plutôt du HTML ?
Merci beacoup par avance,
Très cordialement,
E.
Hello,
Merci pour la mention et cette adaptation à WordPress.
Bonne continuation.
Bonjour,
très beau slider, merci pour ce travail.
Je me casse le tête pour insérer plusieurs images (11 en tout) mais je n’y arrive pas.
S’il vous plaît, voulez-vous m’aider ?
Merci.
Aurélien Denis merci bcp pour l article , je me demande est ce que j’ai le droit d’utiliser ton slider dans un projet qu je peux commercialiser merci de me répondre .
bon courage pour la suite
Je laisse le soin à Christopher de te répondre, c’est lui l’auteur du tutoriel. 😉
Merci 😉
Bonjour,
Vous pouvez disposer de ce tuto comme bon vous semble.
Seul condition, citer tout de même la source dans votre code.
Je ne suis par contre pas responsable des dégâts encourus dans la mise en page du site de votre client si votre intégration se passe mal.
Merci bcp Christopher 🙂
d’abord je te remercie pour ce bout de code interessant , par contre j’aimerais savoir ce que je devrais ajouter ou modifier pour le slider repart a zero , c-a-d apres le slider 4 il passe directement au slider 1 et non pas cet effet de marche-arriere affiche’ actuellement
. Merci d’avance 🙂
Merci pour ce code vraiment sympa. J’ai essayé et tout fonctionne à merveille.
Est-il possible d’ajouter le passage manuel d’une slide à l’autre ? Et peut-on ajouter des vignettes pour savoir où on en est dans le diaporama ?
Avant tout je veux vous remercier pour ce tres bon travail, en occurrence j’ai essayé d’adapter le script pour une résolution de 900 x 420 mais sans sucés , merci de m’aider à trouver une solution !
pourquoi toujours vouloir se passer de javascript? il ne m’a jamais posé problème et il est indispensable à tout site internet donc autant s’en servir, c’est comme les animations, tout le monde veut les réaliser en css3 alors qu’en javascript on est sur que tout les navigateurs le prendrons bien en compte 😉
Ce tutoriel a bien évidemment un côté expérimental. Mais le recours au CSS3 au lieu de JavaScript est de plus en plus fréquent vu les navigateurs le gèrent de mieux en mieux et que les gens finissent par mettre à jour eux aussi. Autant avoir recours à des technologies gérées nativement plutôt qu’à des bout de JS (mais je n’ai rien contre jQuery et cie). 😉
Mais avec JavaScript, on peut adapter ça selon le nombre d’images du slider, donc en particulier lorsqu’on utilise des CMS, où le client sera amené à faire des changements, c’est dommage de le restreindre « bêtement » à avoir un nombre d’images fixes, non ?
Un système de diaporama moderne dispose bien évidemment d’une gestion en back-office via un champ de type galerie. L’utilisateur glisse / dépose les images et le développeur peut les récupérer en PHP. Le CSS et le JavaScript sont là pour gérer les styles et les animations si besoin.
Bonjour,
Étant en train de tester Twenty Thirtteen, votre article m’a vivement intéressé.
Je ne suis pas un spécialiste mais je suis arrivé à ce résultat : http://www.test.blog-csnd.fr/slider-css3-html5/
Par contre impossible d’afficher correctement les effets 3D de décoration du cadre, donc j’ai simplifié.
Merci de votre aide précieuse.
Cordialement.
Ahh, c’est pas mal. Parcontre, je ne comprend pas avec les styles d’ombrages… Si l’animation fonctionne. A priori, les effet d’ombres également.
Bonjour Christopher,
Moi non plus mais je cherche… Pour l’instant, j’ai supprimé tous les effets d’ombrage. Les boutons Play/Pause fonctionnent mais j’ai de la peine avec les boutons de commande sous le slider. Bon on avance…
Cordialement
Pareil, j’aurais bien aimé voir un demo pour illustrer ton article 🙂
Tu pourrais aussi pousser le système (sans problème de compatibilité) en utilisant des labels et des input:checkbox pour faire un système de pager qui désactives l’animation en boucle et permet de faire le focus sur une des image.
C’est au menu (si je puis dire). Je ferais un article bonux… Mais pour l’instant j’ai quelques soucis de compatibilité avec les pseudo-classes before et after. J’ai bien intégrer les boutons play/pause. les pastilles de sélections et les flèches gauche/droite me pose quelques problèmes… Bien retord.
@julio : Si c’est bien préfixé comme je l’ai fait. Mozilla dernières versions, Chrome dernières versions, IE à partir de la version 10. Je te fais fis des OS, je n’ai pas testé…
Évidement, ce n’ai pas cross-browser, c’est surtout les propriétés CSS3 d’animations qui doivent être gérées.
Je vais joindre une démo HTML5/CSS3 après… Normalement, l’article n’était pas supposé apparaitre avant fin de semaine. Aurélien travaille plus vite que moi ^^
@tweetpressfr : On peut faire une rétro-compatibilité, mais ça reviendrait à utiliser du js… Donc au final, aucun intérêt. Sinon, effectivement, j’ai 2 ans… J’ai voulu certainement corriger mon age, mais je dû mal le taper… Ça fait plus d’un an que j’écris pour wpchannel quand même.
Par ce tuto, je voulais montrer ce qu’il était possible de faire en CSS3/HTML5. C’est un exemple parmi tant d’autre. Dés que les utilisateurs auront compris comment tout ça fonctionne, on risque de voir émerger pas mal de truc bien sympa…. Et franchement; j’ai hâte de voir ça 🙂
Oui j’étais chaud bouillant hier ! 🙂
@Julio a priori les versions les plus récentes des navigateurs principaux, après pour la rétro-compatibilité c’est une autre chose.
« Christopher, 2 ans. » > précoce, bravo ! Doit y avoir une coquille dans la bio ^^
Mais, sympa, ça peut en dépanner plus d’un.
Hello, sympa tout ça, quel est la compatibilité avec les navigateurs ? J’aurais bien aimé voir une démo :p
Salut Julio,
La structure étant très très proche de celle de mon slideshow, je pense que cette démo est plutôt parlante pour ce qui est de la compatibilité :
http://creativejuiz.fr/trytotry/juizy-slideshow-full-css3-html5/
Bonne journée 🙂