Selon CanIUse , il existe un problème connu avec Safari et position:sticky
dans un élément overflow:auto
:
Un parent dont le débordement est défini sur auto empêchera la position: sticky de fonctionner dans Safari
Cependant, c'est le cas d'utilisation exact dont j'ai besoin. J'ai un div à défilement, qui est divisé en deux colonnes. La colonne de droite doit être collante et ne jamais bouger, même lorsque la div est entièrement défilée. La raison pour laquelle j'utilise position:sticky
dans la colonne de droite est que je souhaite que l'utilisateur puisse faire défiler la colonne de gauche avec le curseur sur la colonne de droite. Et c’était la seule solution qui, à mon avis, avait fonctionné.
Voici un exemple de travail pour Firefox/Chrome: http://cssdeck.com/labs/zfiuz4pc La zone orange reste fixe pendant le défilement, mais pas dans Safari. .
L'exemple ci-dessus contient des enveloppes inutiles à mon problème, mais je voulais reproduire le plus fidèlement possible l'environnement dans lequel je veux que ce code fonctionne. Le contenu de base de celui-ci est que j'ai ceci:
<div class="modal-content">
<div class="left-content">
</div>
<div class="sticky-element">
</div>
</div>
Et le CSS:
.modal-content {
display: flex;
overflow: auto;
flex-flow: row nowrap;
}
.left-content {
flex: 0 0 300px;
}
.sticky-element {
position: sticky;
top: 0;
right: 0;
width: 200px;
}
Encore une fois, cela fonctionne dans FF/Chrome mais pas dans Safari. Existe-t-il une solution de contournement pour que cela fonctionne dans tous les navigateurs? Ou y a-t-il une approche différente que je peux utiliser pour maintenir la possibilité de défilement même avec le curseur de la souris sur l'élément collant?
J'ai eu cette solution de quelqu'un d'autre:
http://cssdeck.com/labs/bu0nx69w
Fondamentalement, au lieu de position:sticky
, utilisez position:fixed
pour le panneau de droite. La clé consiste également à vous will-change:transform
dans un div parent (dans l'exemple ci-dessus, dans .modal-content
) afin que position:fixed
devienne fixe par rapport à ce parent et non dans la fenêtre d'affichage. C'est une petite astuce soignée
je ne peux pas vraiment tester cela pour le safari en ce moment, mais cela a toujours été une alternative pour moi lors de la création d'un pied de page collant, par exemple:
<!DOCTYPE html>
<html>
<head>
<title>sticky side div</title>
<style type="text/css">
.maindiv{
position: relative;
display: inline-block;
background-color: forestgreen;
width: calc(100vw - 150px);
height: 100%;
overflow: auto;
}
.sidediv{
position: fixed;
display: inline-block;
background-color: lightyellow;
float: right;
width: 100px;
height: 100%;
}
</style>
</head>
<body>
<div class="maindiv">
Lorem 45
</div>
<div class="sidediv">
Lorem 30
</div>
<div class="maindiv">
Lorem 100
</div>
<div class="maindiv">
Lorem 900
</div>
</body>
</html>
une fois que vous connaissez la largeur de votre contenu correct, ajoutez-y un peu plus de px, puis utilisez le css calc function
pour vous assurer que les autres div ne s'y glissent pas
il existe également un bogue connu avec vh et vw dans Safari 7. Vous pouvez le corriger en définissant height: héritez des éléments #child dont les parents ont vh
hauteurs ou vw
largeurs
mais ma meilleure recommandation, si vous n’allez pas chercher de l’aide d’un navigateur à l’autre est d’utiliser CSS Grids