Après un petit bout de mon code. Je me demande simplement pourquoi la cellule "iphone" scintille uniquement depuis l'iphone. PS. Je ne peux pas utiliser de table ou de liste pour la structure. J'ai aussi essayé d'utiliser transform: translate3d(0,0,0);
.
Fondamentalement, j'ai besoin que la première cellule soit collante à la fois pour Left et Top sur iPhone et iPad. J'aimerais le faire uniquement en HTML et CSS.
IMPORTANT
S'il vous plaît, ne répondez pas avec des solutions fixes , je ne sais pas où la table sera placée dans le corps. Il y aura un en-tête, du contenu, etc., etc.
.table {
width: 2000px;
position: relative;
}
.tr {
overflow: visible;
display: block;
white-space: nowrap;
font-size: 0;
}
.tc {
border: 1px solid #DDD;
display: inline-block;
width: 100px;
height: 100px;
text-align: center;
font-size: 12px;
}
.trh {
background: #000;
color: #FFF;
position: -webkit-sticky;
position: sticky;
top: 0;
z-index: 1;
}
.tc.first {
background: #000;
color: #FFF;
position: -webkit-sticky;
position: sticky;
left: 0;
}
<div class="table">
<div class="tr trh">
<div class="tc first">Iphone</div>
<div class="tc">value</div>
<div class="tc">value</div>
<div class="tc">value</div>
<div class="tc">value</div>
<div class="tc">value</div>
<div class="tc">value</div>
<div class="tc">value</div>
<div class="tc">value</div>
</div>
<div class="tr">
<div class="tc first">a set</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">2</div>
</div>
<div class="tr">
<div class="tc first">a set</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
</div>
<div class="tr">
<div class="tc first">a set</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
</div>
<div class="tr">
<div class="tc first">a set</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
</div>
<div class="tr">
<div class="tc first">a set</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
</div>
<div class="tr">
<div class="tc first">a set</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
</div>
<div class="tr">
<div class="tc first">a set</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
</div>
<div class="tr">
<div class="tc first">a set</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
<div class="tc">0</div>
</div>
</div>
Réponses:
Je lutte contre les bizarreries avec iOS vs tout le reste tout le temps. Cela implique généralement des problèmes de contexte d'empilement. Il me semble que le
position: sticky
left: 0
élément et devient relatif à cette première ligne sur iOS. iOS ne gère pas le contexte d'empilement de la même manière que tous les autres navigateurs.Je n'ai jamais vraiment compris exactement ce qui cause cela. Techniquement, votre cellule iPhone est bloquée à gauche même lorsqu'elle défile, car elle est relative à son parent qui ne l'a pas
left: 0
. Je suppose que cela a à voir avec la façon dont iOS gèreposition: sticky
. Sticky démarre relatif puis passe à fixe. Tous les autres navigateurs à ce moment-là le feraient coller à gauche. Vous avez unposition: sticky;
élément à l'intérieur d'unposition: sticky;
élément. C'est un nouveau contexte d'empilement. Je crois qu'iOS le fixe à son parent et non pas comme on pourrait s'y attendre. Étant donné que la ligne parent n'a pasleft: 0
ça va défiler avec tout le reste. J'espère que ça aide. Je n'ai vu aucun scintillement, mais j'ai eu quelques composants cassés dans le cadre Web de mon entreprise après la sortie d'iOS 13 impliquant des contextes de défilement et d'empilement. Je testerais sur plusieurs appareils iOS.modifier après avoir joué un peu plus avec lui, je suis convaincu que c'est un problème de contexte d'empilement. J'ai monté le z-index jusqu'à 1000 sur la cellule iphone uniquement et les rangées en dessous apparaissent TOUJOURS au-dessus.
Si vous n'avez pas à prendre en charge Internet Explorer, j'utiliserais des grilles CSS pour réaliser cette mise en page. Vous n'aurez plus à vous soucier
position: sticky
https://css-tricks.com/snippets/css/complete-guide-grid/
https://css-tricks.com/using-css-grid-the-right-way/
Je l'utilise pour le contenu lourd de données dynamiques dans les applications commerciales, il peut donc être incroyablement flexible s'il est exploité correctement.
Mis à jour à nouveau - Si vous ne pouvez pas du tout changer le DOM, vous devrez faire face au scintillement car même la solution de grille nécessitera des wrappers autour de certains éléments. Juste pour clarifier .... Avec une solution de grille, vous n'avez PAS besoin de savoir combien de colonnes ou de lignes vous aurez. Vous semblez accroché à cet aspect. Les zones de grille créent également un nouveau contexte d'empilement et font tout par rapport à la zone de grille dans laquelle il se trouve tout en autorisant des unités flexibles. Je ne peux pas vous répondre tant que vous n'aurez pas montré comment vos données dynamiques arrivent. Nous avons besoin de plus de contexte pour vous donner une solution de code.
Encore une fois, le scintillement se produit parce que vous avez un élément positionné collant à l'intérieur d'un autre élément collant. C'est juste iOS et si vous voulez l'utiliser comme ça, vous devrez simplement vous en occuper.
Voici de la documentation sur les contextes d'empilement et leur fonctionnement. Comme je l'ai dit dans un commentaire, vous allez devoir adopter une approche différente ou simplement y faire face.
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context
Aussi --
Cachez le débordement sur votre HTML et votre corps. Mettez un emballage autour de la table. Mettez
-webkit-overflow-scrolling: auto
l'emballage. Exécutez-le sur iOS 12 et vous verrez qu'il ne scintillera pas. Cependant, vous n'aurez pas l'élan de défilement. iOS13 a supprimé la nécessité de la-webkit-overflow-scrolling
pour que vous ne puissiez même pas la remplacer. Si vous mettez la valeur detouch
sur,-webkit-overflow-scrolling
vous obtiendrez maintenant un scintillement. Exécutez ce code ci-dessous et vous verrez qu'il ne scintillera pas. Pour faire court, comme je l'ai dit à plusieurs reprises, vous devrez trouver une approche différente. Vous ne pouvez pas résoudre ce problème maintenant que iOS13 est sorti et que vous n'auriez vraiment pas voulu désactiver le défilement de l'élan de toute façon.la source
Si vous réorganisez les éléments, vous pouvez y parvenir.
la source