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

La fonction GCP Cloud pour écrire des données dans BigQuery s'exécute avec succès, mais les données n'apparaissent pas dans la table BigQuery

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

Le shell POSIX (sh) redirige stderr vers stdout et capture stderr et stdout dans des variables