Aller au contenu principal
Guillaume Duverger Code & graphisme icodink.com Création de sites web modernes et graphisme

CSS Slider avancé avec contrôles (::scroll-marker-group)

Accueil blog Démonstrations CSS MAJ : 25 juillet 2025

Votre navigateur ne supporte pas cette démonstration

Si la démonstration ne fonctionne pas, activez la fonctionnalité : #enable-experimental-web-platform-features via le drapeau chrome://flags.



<div class="slider">


<div data-src="url(image1.jpg)">
<img src="image1.jpg" alt loading="lazy"> 
</div>


<div data-src="url(image2.jpg)">
<img src="image2.jpg" alt loading="lazy"> 
</div>

<div data-src="url(image3.jpg)">
<img src="image3.jpg" alt loading="lazy"> 
</div>


<div data-src="url(image4.jpg)">
<img src="image4.jpg" alt loading="lazy"> 
</div>
	
</div>






*,*::before,*::after{box-sizing: border-box}

	
.slider{

display:grid;
max-width:800px;
width:100%;
grid-auto-columns:100%;
grid-auto-flow:column;
gap:1.5rem;
background-color:#f1f1f1;
scrollbar-width:none;
anchor-name:--slider;
overflow-x:auto;
overscroll-behavior-x:contain;
scroll-snap-type:x mandatory;
scroll-marker-group: after;
	
	
	}
	
.slider::scroll-marker-group {

display: flex;
flex-flow: wrap;
margin-top:1rem;
gap: 1rem;
min-height: 70px;
align-items: center;
	
    }
	
.slider>div{

	--miniature: attr(data-src type(<image>), "");
    }
	
.slider >div::scroll-marker {

      content:" ";
      aspect-ratio: 1;
      width: 4rem;
      opacity:.6;
      cursor: pointer;
     border:1px solid;
      justify-content: center;
      transition: 0.5s ease-out;
      background: var(--miniature, transparent);
      background-size: cover;
      background-repeat: no-repeat;
      }
	
 .slider >div::scroll-marker:where(:hover, :active, :focus,:target-current) {
	  opacity:1
	 
	}
	
	
.slider img{
	
vertical-align: middle;
scroll-snap-align:center;
width:100%;
height:100%;
object-fit:cover;

}
	

	
	
.slider::scroll-button(*){
cursor:pointer;
position:absolute;
z-index:1;
position-anchor:--slider;
margin:1rem;
border-radius:9999px;
height:2.5cap;
aspect-ratio:1;
border:none;
background-color:#fff;
font-size:clamp(1rem,2vw + 1rem,2rem);
color:#000;
transition:opacity .25s,filter .5s;

	}
	
.slider::scroll-button(left),
.slider::scroll-button(right){

text-box: trim-both cap alphabetic;	
content:'';
position-area:var(--pa);

}			
		
.slider::scroll-button(right){
	
content:'❯';	
--pa: span-inline-start;
	
	}
				
.slider::scroll-button(left){
	
content:'❮';
--pa: span-inline-end;
						
}

	
	
.slider::scroll-button(*):not(:focus-visible):hover{
		
filter:invert(1) 
			
			}
	

	
.slider::scroll-button(*):disabled{
	
		opacity:0;
		cursor:not-allowed;
		interactivity:inert
	}
		

	
@media (prefers-reduced-motion: no-preference){
	
	.slider{scroll-behavior:smooth}
	
	}