Méthode pratique pour créer un slideshow automatique et contrôlable avec CSS3
Si vous suivez le compte @NoupeMag sur Twitter (ça marche aussi pour mon compte), vous avez certainement vu passer mon slideshow en CSS3 datant de l’an dernier.
Ce n’était pas ma première tentative de slideshow comme le présentent ces premier et second travaux datant de mai 2010.
Ce n’était pas ma première tentative de slideshow comme le présentent ces premier et second travaux datant de mai 2010.
Avant propos
La page de démonstration du slideshow full CSS3 vous propose des fichiers sources en téléchargement, profitez-en, notamment si vous souhaitez récupérer les images.
Les codes CSS fournis ici sont légèrement différents de ceux fournis dans l’archive zippée téléchargeable. En effet, la rédaction du tutoriel que vous allez lire m’a permis d’alléger, corriger et améliorer le code disponible en téléchargement. Il fera l’objet d’une refonte prochaine.
Les codes CSS3 présents sur ce tutoriel ne tiennent pas compte des préfixes parfois nécessaires (-webkit-, -moz-, -ms-, -o-) pour une question de gain de place dans le code. Ne les oubliez pas.
Enfin si les bases des langages HTML et CSS vous font défaut, n’hésitez pas à jeter un œil à cette formation HTML et CSS.
Les défauts des versions précédentes
Comme les expérimentations foireuses sont là pour faire ressortir les limites d’une technique, voyons ce qui nous manquait dans les versions précédentes (gardez-les sous les yeux pour tester, c’est mieux).
Sur la version contrôlable (la première) :
Sur la version contrôlable (la première) :
- Un saut de page est visible au clic sur les flèches ;
- Nous sommes obligés de multiplier les éléments (
div
pour les conteneurs,a
pour les flèches) ; - il faut dupliquer des règles CSS à chaque image ajoutée.
Sur la version automatique (la seconde) :
- Il n’y a pas de commandes (soit…)
- Aucune possibilité de stopper l’animation
- il faut dupliquer des règles CSS à chaque image ajoutée.
Certains de ces problèmes ne sont pas résolubles, j’ai décidé de me concentrer sur la fusion des fonctionnalités et sur la correction de certains points :
- Fusionner le slideshow automatique et contrôlable
- Ajouter une commande de stop et lecture de l’animation
- Limiter la multiplication des éléments
- Virer le saut au clic (grâce à l’astuce CSS de Vincent De Oliveira)
Les autres problèmes persisteront, vous le verrez.
À noter que ce slideshow reste expérimental même si compatible avec les derniers navigateurs du marché.
Poser les fondations
Voici du code HTML (HTML5 en l’occurrence) que j’espère suffisamment parlant.
Ce code HTML pourrait être simplifié en prenant le risque de complexifier la CSS, mais cette dernière va déjà l’être suffisamment…
Pour faire simple nous avons une section pour le slideshow qui réunie le conteneur des images (
Pour faire simple nous avons une section pour le slideshow qui réunie le conteneur des images (
.container
), la partie qui glisse (.slider
), les différentes images légendées (sous forme de figure > figcaption
) et la petite barre de défilement du temps (#timeline
).
Pour ceux qui s’interrogent sur la présence de commentaires HTML, je vous invite à lire cet autre article du blog : Display inline-block, une valeur trop peu utilisée.
Je n’ai mis aucun élément de commande pour le moment, nous verrons cela plus tard.
Voici le code CSS servant principalement à positionner, dimensionner et décorer les différents blocs, que je ne vais pas expliquer dans la mesure où ce n’est pas le cœur de l’article, mais il est un minimum commenté 😉
Avec ceci nous avons le support graphique des images. C’est un peu tout cassé, mais vous pouvez voir comment réaliser simplement un élément qui semble assez complexe, notamment au niveau des ombres et dégradés.
Gérons le débordement et l’alignement de tout ce contenu.
Gérons le débordement et l’alignement de tout ce contenu.
Nous voici sur une mise en forme plus propre, les éléments
Il ne nous reste plus qu’à présenter un peu mieux notre légende qui est actuellement planquée :
figure
sont placés sur une seule et même ligne et le débordement est caché.Il ne nous reste plus qu’à présenter un peu mieux notre légende qui est actuellement planquée :
Et voilà qui est mieux.
Nous allons maintenant nous occuper de la phase automatique du slideshow.
Nous verrons dans une troisième partie comment gérer des actions pour contrôler notre slideshow.
Nous verrons dans une troisième partie comment gérer des actions pour contrôler notre slideshow.
Animer notre contenu : phase automatique
Cette phase va être quelque peu répétitive puisque nous allons devoir créer un certain nombre d’animations grâce à la fonction CSS
@keyframes
. Pour en savoir plus sur les animations, je vous invite à lire la partie « animation » de cet article sur le timing sur Alsacréations.
Pour obtenir une animation cohérente tout le long d’un cycle, vous devez vous poser la question suivante :
Combien de temps est nécessaire pour la compréhension de chaque slide ?
Bien entendu, la réponse va dépendre du contenu, mais imaginons que nous ayons 4 étapes, pas beaucoup de texte, 6 ou 7 secondes peuvent sembler suffisantes pour chaque étape. Il reste alors à estimer la durée d’une transition d’une étape à l’autre, 1 ou 2 secondes. Avec 8 secondes multipliées par 4, ça nous fait 32 secondes d’animation pour boucler un cycle complet.
Animation du conteneur
Commençons par animer le bloc qui contient nos images et légendes en le faisant glisser. Pour cela, créons notre animation :
N’oubliez pas de préfixer également la règle @keyframes (oui ! Il faudra s’embêter à dupliquer le code de l’animation) de la sorte :
@-webkit-keyframes slider {[…]} @-moz-keyframes slider {[…]}
, etc.
Chaque étape est exprimée en pourcentage, aussi 50% signifie que nous en sommes à la 16ièmeseconde de notre animation.
Si plusieurs étapes ont la même valeur d’une propriété, ou si vous souhaitez créer un arrêt, il suffit de mettre la valeur sur la même ligne séparer par une virgule.
Par exemple, sur la première étape, nous avons 0, 20 et 100% qui cohabitent. Cela sous entend que de 0 à 20%, la valeur de
Si plusieurs étapes ont la même valeur d’une propriété, ou si vous souhaitez créer un arrêt, il suffit de mettre la valeur sur la même ligne séparer par une virgule.
Par exemple, sur la première étape, nous avons 0, 20 et 100% qui cohabitent. Cela sous entend que de 0 à 20%, la valeur de
left
est de 0, nous créons donc un arrêt. Cela signifie aussi que de 95 à 100%, la valeur de left
passe de -300% à 0. C’est un moyen facile de retourner à la valeur initiale pour créer une boucle.
Nous avons créer l’animation, il faut maintenant l’attribuer à notre élément de cette manière :
Cette syntaxe de la propriété
animation
est le raccourci de animation-name
, animation-duration
, animation-iteration-count
, dans cet ordre précisément ici.Animation de la ligne de temps
Notre petite ligne d’un pixel de hauteur servant de ligne de temps va être animée sur le même principe.
Mais avant cela, donnons-lui quelques styles de couleur.
Mais avant cela, donnons-lui quelques styles de couleur.
Il est ainsi placé précisément en tenant compte des marges autour des photos, et nous lui attribuons tout de suite une animation nommée
timeliner
qu’il nous faut déclarer comme ceci :
Ici nous savons que la ligne doit être à son maximum à quatre reprise (avant chaque changement de slide). Il y a donc 4 étapes à 640px (largeur max), et 4 (si on confond 0 et 100) à 0.
Animation de la légende
Même procédé, nous allons faire monter et descendre notre légende à chaque slide.
Puis nous accrochons cette animation à notre élément :
Je ne sais pas si vous avez vu, mais le vignettage des slides est animé. Comme vous avez compris le principe, je vous laisse vous amuser à trouver le code 😉
Nous avons désormais un slideshow qui fonctionne en mode automatique.
Maintenant, voyons comment procéder si l’on souhaite ajouter des boutons stop/marche, et suivant/précédent, ou « aller à la slide 3 », par exemple.
Maintenant, voyons comment procéder si l’on souhaite ajouter des boutons stop/marche, et suivant/précédent, ou « aller à la slide 3 », par exemple.
Contrôler notre contenu : phase manuelle
Lorsque l’on conçoit un slideshow, il est très recommandé de permettre à l’utilisateur de stopper l’animation, soit parce que ça le stresse, soit parce qu’il veut contempler une des images, soit… bref, voyons ce qu’on peut faire !
Pour rappel, nous n’avons encore aucun élément HTML pour ces contrôles, nous allons donc les rajouter progressivement.
Ces éléments de contrôles (des liens) vont cibler des ancres placés « à côté » de notre slideshow, en tant que frères indirects.
Ces éléments de contrôles (des liens) vont cibler des ancres placés « à côté » de notre slideshow, en tant que frères indirects.
Juste avant notre élément
#slideshow
, placez donc ces éléments span
:
Ceux-ci ont des classes communes (parfois) qui nous permettrons des actions groupées par la suite.
Vous comprendrez leur utilité par la suite, ne vous faites pas de souci.
Vous comprendrez leur utilité par la suite, ne vous faites pas de souci.
Bouton jouer et arrêter
Les boutons play et pause peuvent être ajoutés dans la section
#slideshow
, juste avant notre .container
.
Il n’y a aucune obligation à les placer précisément ici, il est généralement conseillé de conserver ordre d’apparition dans le DOM et ordre d’apparition à la lecture de la page. Là nous allons les placer au milieu (verticalement) du slideshow :
Ces éléments peuvent prendre leur apparence avec quelques lignes de code uniquement, et sont par défaut cachés : ils n’apparaissent qu’à certains moments bien précis que nous définirons par la suite.
Voilà, toutes ces lignes pour mettre en place nos deux liens. Ceux qui trouveront plus pertinent de charger des images ou un sprite, je ne leur en voudrais pas.
C’est bien, c’est beau, mais pas fonctionnel.
C’est bien, c’est beau, mais pas fonctionnel.
Nous allons maintenant utiliser la pseudo classe
Lorsque pause est cliqué, nous ciblons l’élément
Dans notre scénario, nous n’afficherons que le bouton utile : pause quand la lecture est effective, play lorsque la pause est en place.
target
pour agir sur notre animation en fonction du bouton que nous aurons cliqué.Lorsque pause est cliqué, nous ciblons l’élément
#sl_pause
, lorsque lecture est cliqué, c’est #sl_play
qui est ciblé.Dans notre scénario, nous n’afficherons que le bouton utile : pause quand la lecture est effective, play lorsque la pause est en place.
Le premier bloc permet de stopper les animations grâce à la propriété
Les sélecteurs sont assez spéciaux :
On procède de la même manière pour les autres éléments (
Pour en savoir plus sur les sélecteurs d’adjacence indirecte, lisez cet autre article du blog : Sélecteur d’adjacence indirecte en CSS3.
animation-play-state
. Cette propriété placée à sa valeur paused
permet de figer l’animation.Les sélecteurs sont assez spéciaux :
.sl_command:target ~ #slideshow .slider
permet de cibler « L’élément .slider
fils de #slideshow
lorsque ce dernier est indirectement frère de .sl_command
, uniquement lorsque ce dernier est ciblé. ». Autrement dit : si .sl_command
est ciblé, alors on va chercher le frère #slideshow
puis son fils .slider
pour lui appliquer un stop.On procède de la même manière pour les autres éléments (
figcaption
, #timeline
et .dots_commands
que nous verrons plus tard dans le bonux) qui ont une animation en route également.Pour en savoir plus sur les sélecteurs d’adjacence indirecte, lisez cet autre article du blog : Sélecteur d’adjacence indirecte en CSS3.
Le dernier bloc de code permet d’afficher les boutons en fonction de situation précise, je vous laisse essayer de décortiquer leur signification.
Bonux : Les flèches « suivant » et « précédent »
Il va nous falloir une paire de liens par étape de notre slideshow en gardant en tête que la flèche de gauche de notre première slide nous permet d’aller à la dernière, la flèche de droite de notre dernière slide nous permet d’aller à la première (vous me suivez ?). Lisez les
title
pour comprendre l’utilité de chaque flèche. Vous pouvez placer ces liens après nos deux liens pause et lecture.
C’est là que la pertinence du markup en prend un coup. Pour des raisons d’accessibilité (clavier ici) ces liens ne sont peut-être pas des plus utiles et pratiques à utiliser. Est peut-être à envisager l’ajout de l’attribut
Donnons quelques styles à nos boutons et cachons ceux qui ne sont pas utiles.
tabindex="-1"
pour empêcher le focus sur ces éléments. En effet, nous utiliserons un second système de navigation juste après, qui lui est peut-être plus pertinent.Donnons quelques styles à nos boutons et cachons ceux qui ne sont pas utiles.
Très bien, nous avons des flèches… mais que va-t-on bien pouvoir bouger avec ?
Sur le même principe que précédemment, nous ciblons l’un des
En fonction de l’élément ciblé, on pourrait stopper l’animation et changer les valeurs de
Oui mais non, parce qu’en fait ça ne fonctionne pas : les keyframes sont « prioritaires ».
Sur le même principe que précédemment, nous ciblons l’un des
span
abandonnés en début de code. Si vous cliquez sur une des flèches, pour le moment ça ne fait que stopper l’animation (oui, tous les span
sont porteurs de la classe .sl_command
, rappelez-vous, en en ciblant un, les animations s’arrête).En fonction de l’élément ciblé, on pourrait stopper l’animation et changer les valeurs de
left
pour le slider, de width
pour la timeline, et de bottom
pour la légende. Ça serait cool hein ?Oui mais non, parce qu’en fait ça ne fonctionne pas : les keyframes sont « prioritaires ».
C’est ce qui nous oblige à compléter notre code HTML légèrement avec ce petit morceau :
Il est déjà présent dans le code fourni initialement (premier bloc de cet article).
Cet élément nous permet d’appliquer les images en image de fond. Ces mêmes images que nous avons déjà chargé dans le HTML, nous allons les appliquer en background CSS.
C’est en faisant bouger ce nouvel élément que nous allons donner l’illusion d’un slideshow classique. Je dis bien illusion, car vous aurez compris qu’ici on se restreint à l’idée d’un vrai diaporama, avec des images, et non du contenu textuel qu’il serait difficile de « dupliquer ».
C’est en faisant bouger ce nouvel élément que nous allons donner l’illusion d’un slideshow classique. Je dis bien illusion, car vous aurez compris qu’ici on se restreint à l’idée d’un vrai diaporama, avec des images, et non du contenu textuel qu’il serait difficile de « dupliquer ».
Cette division fournie de quelques images est cachée par la partie principale du diaporama pour le moment. Lorsque nous ciblerons le contenu avec l’une de nos flèches « suivant » ou « précédent », nous cacherons ce diaporama automatique (qui se sera stoppé) pour découvrir nos slides contrôlables qui bougeront en fonction de l’élément ciblé.
Vous n’allez pas m’aimer… :
Vous n’allez pas m’aimer… :
À chaque étape nous déplaçons les images, cachons tous les liens « précédent » et « suivant » sauf ceux dont on peut avoir besoin, et on déplace la petite pastille de la navigation secondaire (voir bonus qui suit).
Bonux : « pagination » pour sauter vers une slide
Vous avez certaine souvent vu ces petits points au pied d’un slideshow qui servent un peu de pagination et qui, parfois, permettent de savoir précisément où on se trouve dans le déroulement des slides.
Nous allons en créer une. Pour commencer, ajoutons ce code HTML juste après l’élément
Nous allons en créer une. Pour commencer, ajoutons ce code HTML juste après l’élément
timeline
Puis, ces quelques lignes de CSS pour donner un style bien propre à nos petits points.
N’hésitez pas à agrandir les dimensions si ça vous semble trop petit.
N’hésitez pas à agrandir les dimensions si ça vous semble trop petit.
Rien de sorcier ici.
On s’assure simplement en dernière ligne que le premier élément ait un z-index supérieur aux autres. Nous allons nous en servir pour l’animation qui suit.
On s’assure simplement en dernière ligne que le premier élément ait un z-index supérieur aux autres. Nous allons nous en servir pour l’animation qui suit.
Nous allons créer un petit disque par dessus ces puces pour représenter le slide visible par un point d’une couleur différente. Pour ce faire nous utilisons les pseudo-éléments.
Comme nous l’avons prévu dans notre bonus précédent, nous n’avons rien besoin de gérer en plus. Ces liens ciblent les mêmes éléments que nos flèches latérales et ont donc le même effet. (stop de l’animation et slide contrôlable avec tous les effets qui y sont liés)
L’animation peut sembler compliquée, mais c’est la logique de « disparition, déplacement, apparition » multiplié par 4 (4 étapes). Pour information, jusqu’à très récemment, Google Chrome avait du mal avec les animations sur before ou after. Je ne sais pas si ça a changé, il me semble.
L’animation peut sembler compliquée, mais c’est la logique de « disparition, déplacement, apparition » multiplié par 4 (4 étapes). Pour information, jusqu’à très récemment, Google Chrome avait du mal avec les animations sur before ou after. Je ne sais pas si ça a changé, il me semble.
Et on en restera là !
Pour être sûr que tout fonctionne, j’ai effectué un test en suivant ce tutoriel et en préfixant pour Firefox uniquement, voici le résultat : Slideshow Full CSS3.
Analyse personnelle
Ce qui est bloquant est gourmand en lignes de code ici, c’est la volonté de vouloir fusionner système automatique et système contrôlable au clavier, souris ou même touché.
Ce slideshow date de novembre 2011, les techniques se sont multipliées, il existe d’autres solutions full CSS3 passant par l’utilisation détournée des éléments
label
et input
de type radio
. En contrôlant la valeur de la coche avec la pseudo-classe checked
il est possible d’agir sur les éléments, de la même manière que nous le faisons ici avec la pseudo-classe target
.
Je vous invite à regarder ce qui peut se faire ailleurs, comme par exemple sur ce Slideshow Full CSS3 Responsive.
L’espace de commentaires est à vous !
Commentaires
Enregistrer un commentaire