- :checked
- aspect-ratio
- grid
- transform
- translate
- transition
La construction du slider en HTML :
<div class=slider><!-- Notre conteneur global -->
<input name="slider" id=slide_img1 type="radio" checked><!-- même nom pour tous les input / identifiant unique -->
<nput name="slider" id=slide_img2 type="radio">
<input name="slider" id=slide_img3 type="radio">
<input name="slider" id=slide_img4 type="radio">
<ul>
<li class=img1>
<img src=image.jpg alt height="" width="">
</li>
<li class=img2>
<img src=image.jpg alt height="" width="">
</li>
<li class=img3>
<img src=image.jpg alt height="" width="">
</li>
<li class=img4>
<img src=image.jpg alt height="" width="">
</li>
</ul>
<div class=precedent>
<label class=img1 for=slide_img1></label>
<label class=img2 for=slide_img2></label>
<label class=img3 for=slide_img3></label>
<label class=img4 for=slide_img4></label>
</div>
<div class=suivant>
<label class=img1 for=slide_img1></label>
<label class=img2 for=slide_img2></label>
<label class=img3 for=slide_img3></label>
<label class=img4 for=slide_img4></label>
</div>
<div class=puces>
<label class="img1" for=slide_img1>
<span class=actif_puces></span>
</label>
<label class="img2" for=slide_img2>
<span class=actif_puces></span>
</label>
<label class="img3" for=slide_img3>
<span class=actif_puces></span>
</label>
<label class="img4" for=slide_img4>
<span class=actif_puces></span>
</label>
</div>
</div><!-- fin conteneur global -->
Voici comment procéder en CSS :
-
Création du conteneur principal
On crée un élément
divqui englobe le slider. La longueur du slider sera à définir selon vos besoins (dans notre exemple, il s'agit de 720 pixels). Au lieu d'utiliser le positionnement CSS, nous allons déployer le slider avec le modèle de rendu CSS Grid layout, beaucoup plus simple.Nous prenons soin de placer tous nos éléments qui se trouveront à l'intérieur du conteneur avec la propriété
grid-areasur la même ligne ainsi que la même rangée.Pour s'assurer que le conteneur global rétrécisse dans la fenêtre du navigateur (viewport), nous déclarons la propriété
max-widthavec la longueur souhaitée. Nous allons également déclarer dans cet élémentdivla propriétéoverflowavec la valeurhidden. Nous verrons pourquoi plus loin. -
La navigation
La deuxième étape consiste à mettre en place la navigation avec des élements
inputde typeradioqui vont servir à déclencher le défilement des photos. Chaque élémentinputaura un identifiant unique mais posséderont tous un nom commun avec l'attribut HTMLname. Ce dernier point est essentiel au bon fonctionnement du slider.Nous plaçons l'attribut HTML
checkedà l'intérieur du premier élementinput. Cela signifie que la première action est enclenchée et laisse donc apparaître la première image. -
Le slider
A présent, nous construisons une liste non ordonnée avec l'élément
ulqui contiendra nos photos. Nous allons utiliser le modèle de rendu flexbox de manière à aligner les images les unes à la suite des autres. C'est pourquoi nous avons déclaré la propriétéoverflowet la valeurhiddensur le conteneur principal, ceci afin de n'afficher qu'une seule image. Sans cette propriété, nous verrions toutes les photographies.Les éléments
lide la liste étant devenus des boîtes flexibles, nous ajoutons la propriété raccourcieflexavec pour valeur0 0 100%. De plus, ces éléments servent de conteneur aux images. Aussi, pour permettre aux éléments de la navigation d'apparaître, nous déclarons un contexte d'empilement négatif avecz-index:-1. Nous ajoutons également une transition pour donner l'effet de glissement (slide). Dans cet exemple, nous avons choisi400ms, mais vous pouvez déterminer une durée plus ou moins longue.Il est toujours préférable d'ajouter une hauteur et une largeur sur l'élément
imgdans le code HTML. Il suffit ensuite d'ajouter les propriétésheightetwidthen CSS respectivement àautoet100%.Si vous souhaitez ajouter des images qui ont de tailles différentes et/ou au format portrait, il faudra procéder à quelques ajustements. Dans cet exemple, le ratio des images est de 3/2 (720 x 480). La propriété
aspect-ratiova nous aider à respecter le rapport d'aspect. Il faudra ajouter la valeur3/2à l'élémentimg. De plus, la propriété d'imageobject-fitet la valeurcoverva permettre de conserver ce rapport. -
Les éléments de contrôle
Ici, notre slider possède à la fois des flèches précédentes et suivantes ainsi que des puces. Cela signifie qu'il y a deux types de contrôle. Nous allons placer à l'intérieur de chaque type de contrôle des éléments
labelsqui seront associés aux élémentsinputque nous avons évoqués à l'étape 2.Nous aurons donc trois conteneurs à la suite de notre liste d'images. Un élément
divcontenant quatre labels pour les flèches précédentes, un élementdivavec le même nombre de labels en ce qui concerne les flèches suivantes et enfin quatre autres labels contenus dans un dernier élémentdivpour la navigation à puces.Il nous faut dès lors placer tous ces éléments. Le modèle Grid layout que nous avons déclaré sur notre conteneur principal va nous y aider avec notamment la propriété raccourcie
place-self. Les flèches précédentes au centre à gauche, les flèches suivantes au centre à droite et les puces au centre en bas.En ce qui concerne les flèches, nous les faisons toutes disparaître (avec
display : none) pour faire apparaître celles dont nous avons besoin. Par exemple, sur la première image, nous laissons apparaître la flèche précédente (dernier label) qui mène à la dernière image du slider et la flèche suivante (deuxième label) qui mène à la deuxième image.Les puces, quant à elles, restent visibles constamment. Seul l'état visuel change pour montrer qu'une puce est activée quand nous cliquons dessus.
Nous utiliserons la pseudo-classe
:checkedpour réaliser toutes ces actions. Il faudra juste porter une attention particulière aux éléments visés. -
Transformations CSS
Pour finir, il nous faut obtenir l'effet de slide. Nous allons utiliser pour ce faire les transformations CSS. C'est pourquoi nous allons appliquer une translation via la propriété
transformsur l'axe x (ligne horizontale) qui aura pour effet de faire glisser chaque image vers la gauche ou la droite selon l'ordre dans lequel on clique sur les éléments de contrôle.Nous allons ensuite séparer la transition en quatre étapes de
100%jusqu'à atteindre400%, c'est-à-dire la taille complète du conteneur qui englobe les images.
*,
*::after,
*::before{
box-sizing: border-box
}
label{cursor:pointer}
.slider {
display: grid;
overflow: hidden;
max-width: 720px;
border-radius: 0.75rem;
margin:5rem auto;
}
.slider> * {
grid-area: 1/1;
}
.slider ul {
list-style-type: none;
padding: 0;
margin: 0;
display: flex;
}
.slider ul li{
z-index:-1;
flex: 0 0 100%;
transition: translate .4s;
}
.slider ul li img {
aspect-ratio:3/2;
object-fit: cover;
width: 100%;
display: block;
height:auto;
user-select: none;
}
#slide_img2:checked ~ ul > li{translate:-100% 0}
#slide_img3:checked ~ ul > li{translate:-200% 0}
#slide_img4:checked ~ ul > li {translate:-300% 0}
/******************fleches**************************/
.precedent{place-self: center left; }
.suivant{place-self: center right;}
.slider > .precedent > label,
.slider > .suivant > label{
display: none;
background-color:#000;
justify-content: center;
align-items: center;
}
.slider > .precedent > label::after,
.slider > .suivant > label::after{
display: block;
content:'';
width:clamp(1.25rem,1rem + 1vw,1.75rem);
height:clamp(1.25rem,1rem + 1vw,1.75rem);
pointer-events: none;
border-top: 2px solid #fff;
}
.slider > .precedent > label::after{
rotate: -45deg;
border-left: 2px solid #fff;
border-top-left-radius: 2px;
}
.slider > .suivant > label::after{
rotate: 45deg;
border-right: 2px solid #fff;
border-top-right-radius: 2px;
}
.slider > .suivant label,
.slider > .precedent label{
width:clamp(3rem,1rem + 3vw,4rem);
height:clamp(3rem,1rem + 3vw,4rem);
}
#slide_img1:checked ~ .precedent > label.img4,
#slide_img1:checked ~ .suivant > label.img2,
#slide_img2:checked ~ .precedent > label.img1,
#slide_img2:checked ~ .suivant > label.img3,
#slide_img3:checked ~ .precedent > label.img2,
#slide_img3:checked ~ .suivant > label.img4,
#slide_img4:checked ~ .precedent > label.img3,
#slide_img4:checked ~ .suivant > label.img1{
display:flex;
}
/***************************navigation puces bas********************************/
.puces {
display: flex;
gap: 1rem;
padding: 1rem;
place-self: end center;
}
.puces label{
background-color: white;
border-radius: 50%;
width: 1rem;
height: 1rem;
width:clamp(1rem, 2vw, 1.5rem);
height:clamp(1rem, 2vw, 1.5rem);
}
/********************simulation lien actif sur les puces******************************/
#slide_img1:checked ~ .puces > label.img1> .actif_puces,
#slide_img2:checked ~ .puces > label.img2 > .actif_puces,
#slide_img3:checked ~ .puces > label.img3 > .actif_puces,
#slide_img4:checked ~ .puces > label.img4 > .actif_puces{
border-radius: inherit;
display: flex;
height: inherit;
width: inherit;
background-color: black;
}
/********************************navigation puces bas****************************/