Pourquoi le débordement-y est-il requis pour un effet de parallaxe CSS ?

I have created a barebones parallax demo. This works fine, as you can see if you run the snippet below. However, it stops working if I remove the following CSS rule:

main {
overflow-y: auto;
}

Pourquoi est-il nécessaire d'inclure une règle pour une barre de défilement verticale, alors qu'il n'est pas nécessaire de faire défiler verticalement ?


body {
margin: 0;
}
main {
width:100vw;
height:100vh;
perspective: 2px;
/* overflow-y MUST be set to a certain value for parallax to work
* WORKS:
* + auto
* + hidden
* + overlay
* + scroll
* FAILS:
* - clip
* - inherit
* - initial
* - revert
* - unset
* - visible
*/
overflow-y: auto;
}
div {
position: absolute;
top: 0;
width: 99vw;
height: 100%;
}
div:nth-child(1) {
left: 0;
background-color: #900;
}
div:nth-child(2) {
left: 49.5vw;
background: rgba(0,192,0,0.5);
height: 80%;
top: 10%;
transform: translateZ(1px) scale(0.5);
z-index: 1;
}
div:nth-child(3) {
left: 99vw;
background-color: #009;
}

<body>
<main>
<div></div
><div></div
><div></div>
</main>
</body>

Solution du problème

Pourquoi est-il nécessaire d'inclure une règle pour une barre de défilement verticale, alors qu'il n'est pas nécessaire de faire défiler verticalement ?

Vous devez faire défiler verticalement mais vous devez faire défiler mainl'écran et non l'écran. Il y a un petit piège ici car la suppression du défilement du mainfera apparaître le défilement par défaut de l'écran et vous pensez que les deux sont identiques mais non. Nous devons faire défiler le principal car la perspective y est définie.

Réduisez légèrement la largeur/hauteur et vous comprendrez mieux. maintenant, si vous supprimez/ajoutez un débordement, vous verrez que c'est différent


body {
margin: 0;
}
main {
width: 90vw;
height: 90vh;
perspective: 2px;
overflow-y: auto;
}
div {
position: absolute;
top: 0;
width: 99vw;
height: 100%;
}
div:nth-child(1) {
left: 0;
background-color: #900;
}
div:nth-child(2) {
left: 49.5vw;
background: rgba(0, 192, 0, 0.5);
height: 80%;
top: 10%;
transform: translateZ(1px) scale(0.5);
z-index: 1;
}
div:nth-child(3) {
left: 99vw;
background-color: #009;
}

<main>
<div></div>
<div></div>
<div></div>
</main>

Commentaires

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"