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

CSS carrousel avec Scroll State queries / Scroll Snap

Accueil blog Démonstrations CSS MAJ : 21 novembre 2025

Votre navigateur ne supporte pas cette démonstration

Lorem ipsum

Lorem ipsum dolor sit amet consectetur, adipisicing elit. Quae, neque.

Lorem ipsum

Lorem ipsum dolor sit amet consectetur, adipisicing elit. Quae, neque. Lorem ipsum dolor sit amet consectetur, adipisicing elit. Quae, neque.

Lorem ipsum

Lorem ipsum dolor sit amet consectetur, adipisicing elit. Quae, neque.

Lorem ipsum

Lorem ipsum dolor sit amet consectetur, adipisicing elit. Quae, neque.

Lorem ipsum

Lorem ipsum dolor sit amet consectetur, adipisicing elit. Quae, neque.



<section>

<article>
<div>
<img src="image.jpg" alt height="" width="">
<h3>Lorem ipsum</h3>
<p>Lorem ipsum dolor sit amet consectetur, adipisicing elit. Quae, neque.</p>
...
</div>
</article>

<article>
<div>
<img src="image.jpg" alt height="" width="">
<h3>Lorem ipsum</h3>
<p>Lorem ipsum dolor sit amet consectetur, adipisicing elit. Quae, neque.</p>
...
</div>
</article>

<article>
<div>
<img src="image.jpg" alt height="" width="">
<h3>Lorem ipsum</h3>
<p>Lorem ipsum dolor sit amet consectetur, adipisicing elit. Quae, neque.</p>
...
</div>
</article>

<article>
<div>
<img src="image.jpg" alt height="" width="">
<h3>Lorem ipsum</h3>
<p>Lorem ipsum dolor sit amet consectetur, adipisicing elit. Quae, neque.</p>
...
</div>
</article>

<article>
<div>
<img src="image.jpg" alt height="" width="">
<h3>Lorem ipsum</h3>
<p>Lorem ipsum dolor sit amet consectetur, adipisicing elit. Quae, neque.</p>
...
</div>
</article>


</section> 







*,
*::before,
*::after {
  box-sizing: border-box;
}
  
@media (prefers-reduced-motion: no-preference){  
:root{--transition:.25s}	
  }
  
  
  
section {
overflow: auto hidden;
scroll-snap-type: x mandatory;
scroll-snap-stop: always;
max-width:80vw;
display: grid;
grid-template-columns:repeat(5, minmax(360px,1fr));
gap:10lh;
padding-inline: 5lh;
padding-block: 1lh; 
  
article {

container-type: scroll-state;
scroll-snap-align: center;
display: grid;
gap: 1ch; 
background-color: white;
border-radius: 1lh;


p {
line-clamp: 3;
font-size: 1.25rem;
font-weight: 200;
line-height: 1.5;
  } 
  

  
img{
display:block;
object-fit:cover;
width:10rem;
aspect-ratio: 1;
border-radius:1e3px
  }
  
>div{
padding:1lh;
transition: calc(var(--transition)*2);
border:2px solid transparent; 
border-radius: inherit;
box-shadow: 0px 0px 1px rgba(3, 7, 18, 0.02),
  0px 0px 3px rgba(3, 7, 18, 0.02),
  0px 0px 6px rgba(3, 7, 18, 0.02),
  0px 0px 11px rgba(3, 7, 18, 0.02),
  0px 0px 17px rgba(3, 7, 18, 0.02),
  0px 0px 24px rgba(3, 7, 18, 0.02);

@container scroll-state(snapped: x) {
  
border-color:#3ea7ea;
box-shadow: 0px 0px 1px rgba(3, 7, 18, 0.02),
  0px 0px 5px rgba(3, 7, 18, 0.02),
  0px 0px 11px rgba(3, 7, 18, 0.02),
  0px 0px 20px rgba(3, 7, 18, 0.02),
  0px 0px 31px rgba(3, 7, 18, 0.02),
  0px 0px 44px rgba(3, 7, 18, 0.02);
    }  
    
    } 

div > * {
scale:1;
place-self:center;
transition: calc(var(--transition)*2);
@container not scroll-state(snapped: x) {
 opacity: .25;
 scale:.95
 }  
  }
   }
    }