3 propriétés pour contrôler comment ta page défile, avec des exemples interactifs que tu peux tester directement.
Imagine un carrousel de photos ou une page qui "accroche" chaque section quand tu scrolles.
C'est exactement ce que fait scroll-snap : le scroll se verrouille automatiquement
sur les éléments que tu définis.
Il faut 2 ingrédients :
L'élément qui a le scroll (overflow)
scroll-snap-type: x mandatory;
"Sur l'axe X, verrouille toujours"
Les éléments sur lesquels on s'arrête
scroll-snap-align: center;
"Aligne-moi au centre du viewport"
Définit l'axe et la sévérité du snap.
scroll-snap-type: x mandatory;
scroll-snap-type: y proximity;
scroll-snap-type: both mandatory;
Où l'élément s'aligne quand le snap se déclenche.
scroll-snap-align: start;
scroll-snap-align: center;
scroll-snap-align: end;
Avec un swipe rapide, le navigateur peut sauter des éléments. Cette propriété l'empêche.
scroll-snap-stop: always; /* ne saute jamais */
scroll-snap-stop: normal; /* peut sauter */
Utile quand un header fixe cache le point de snap. On décale le point d'accroche.
/* Sur le conteneur */
scroll-padding-top: 80px;
/* Sur un enfant */
scroll-margin-top: 20px;
x mandatory + center
Scrolle horizontalement :
/* Le conteneur : active le snap horizontal */
.carrousel {
display: flex;
overflow-x: auto;
scroll-snap-type: x mandatory;
}
/* Chaque slide : s'aligne au centre */
.slide {
flex: 0 0 80%;
scroll-snap-align: center;
}
y mandatory + start
Scrolle verticalement :
/* Conteneur avec hauteur fixe */
.fullpage {
height: 300px;
overflow-y: auto;
scroll-snap-type: y mandatory;
}
/* Chaque section prend toute la hauteur */
.section {
height: 100%;
scroll-snap-align: start;
}
Scrolle les deux et observe la différence :
mandatory — s'arrête TOUJOURS
proximity — seulement si proche
Quand tu cliques sur un lien d'ancre (<a href="#section">),
le navigateur saute directement. Avec scroll-behavior: smooth,
il y glisse en douceur.
Par défaut : le scroll saute instantanément.
Le scroll glisse de manière fluide.
/* Sur html pour tout le site */
html {
scroll-behavior: smooth;
}
<a href="#id">element.scrollIntoView()window.scrollTo()Certains utilisateurs sont sensibles aux animations :
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
}
Change le mode puis clique sur les liens :
Par défaut, la scrollbar a le style du navigateur.
scrollbar-color te permet de choisir tes couleurs,
et scrollbar-width son épaisseur.
scrollbar-color: <couleur poignée> <couleur piste>;
/* Exemple */
scrollbar-color: #264653 #e0e0d8;
scrollbar-color: auto;
scrollbar-color: #264653 #e0e0d8;
scrollbar-width: auto;
scrollbar-width: thin;
scrollbar-width: none;
Observe la scrollbar dans chaque zone :
Sombre / clair
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
scrollbar-color: #264653 #e0e0d8;
Clair / sombre
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
scrollbar-color: #a0a090 #1a1a1a;
thin
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
scrollbar-width: thin;
scrollbar-color: #2a9d8f #f5f5f0;
none (cachée)
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
scrollbar-width: none;
/* Toujours scrollable ! */
::-webkit-scrollbar en fallback.
Tout en un coup d'oeil.
| Propriété | Sur quoi ? | Ce que ça fait | Exemple |
|---|---|---|---|
scroll-snap-type |
Conteneur | Active le snap (axe + sévérité) | x mandatory |
scroll-snap-align |
Enfants | Où l'élément s'aligne | center |
scroll-snap-stop |
Enfants | Empêche de sauter un élément | always |
scroll-padding |
Conteneur | Décale le point de snap | scroll-padding-top: 80px |
scroll-behavior |
html / conteneur | Défilement fluide vers les ancres | smooth |
scrollbar-color |
Élément scrollable | Couleurs de la barre | #264653 #e0e0d8 |
scrollbar-width |
Élément scrollable | Épaisseur de la barre | thin |