Cały czas walczę z dziwactwami na iOS. Zwykle wiąże się to ze stosowaniem problemów kontekstowych. Wydaje mi się, że element position: sticky
i left: 0
staje się względny w stosunku do pierwszego wiersza w systemie iOS. iOS nie obsługuje kontekstu stosu tak samo, jak wszystkich innych przeglądarek.
Nigdy tak naprawdę nie odkryłem dokładnie, co to powoduje. Technicznie rzecz biorąc, twoja komórka iPhone'a utknęła w lewo nawet podczas przewijania, ponieważ jest względna w stosunku do swojego rodzica, który nie ma left: 0
. Zakładam, że ma to związek z tym, jak radzi sobie iOS position: sticky
. Sticky zaczyna się od względnego, a następnie zmienia się na fixed. Wszystkie inne przeglądarki w tym momencie zatrzymałyby się w lewo. Masz position: sticky;
element wewnątrz position: sticky;
elementu. To jest nowy kontekst stosowy. Wierzę, że iOS sprawia, że jest ustawiony na nadrzędny, a nie w oczekiwany sposób. Ponieważ wiersz nadrzędny nie maleft: 0
przewinie się ze wszystkim innym. Mam nadzieję, że to pomoże. Nie widziałem żadnego migotania, ale miałem kilka zepsutych komponentów w frameworku sieciowym mojej firmy po pojawieniu się iOS 13 obejmującego przewijanie i układanie kontekstów. Testowałbym na wielu urządzeniach z iOS.
edytuję po tym, jak jeszcze trochę z tym pogadałem, jestem pewien, że jest to problem kontekstowy. Podkręciłem indeks Z do 1000 tylko na komórce iPhone'a, a wiersze poniżej STILL pojawiają się nad nim.
Jeśli nie musisz obsługiwać Internet Explorera, skorzystałbym z siatek CSS, aby osiągnąć ten układ. Wtedy nie będziesz musiał się martwićposition: sticky
https://css-tricks.com/snippets/css/complete-guide-grid/
https://css-tricks.com/using-css-grid-the-right-way/
Używam go do dynamicznej zawartości dużych ilości danych w aplikacjach biznesowych, dzięki czemu może być niewiarygodnie elastyczny, jeśli zostanie odpowiednio wykorzystany.
Zaktualizowałem ponownie - jeśli nie możesz w ogóle zmienić DOM, będziesz musiał poradzić sobie z migotaniem, ponieważ nawet rozwiązanie gridowe będzie wymagało owijania wokół niektórych elementów. Tylko dla wyjaśnienia .... Dzięki rozwiązaniu gridowemu NIE musisz wiedzieć, ile kolumn lub wierszy będziesz mieć. Wyglądasz na rozłączonego w tym aspekcie. Obszary siatki również tworzą nowy kontekst stosu i sprawiają, że wszystko zależy od obszaru siatki, w którym się znajduje, jednocześnie umożliwiając elastyczne jednostki. Nie mogę ci odpowiedzieć, dopóki nie pokażesz, jak przychodzą twoje dynamiczne dane. Potrzebujemy więcej kontekstu, aby dać ci rozwiązanie kodu.
Ponownie migotanie ma miejsce, ponieważ masz lepki element umieszczony w innym lepkim elemencie. To tylko iOS i jeśli chcesz go używać w ten sposób, będziesz musiał sobie z tym poradzić.
Oto dokumentacja na temat zestawiania kontekstów i ich działania. Jak powiedziałem w komentarzu, będziesz musiał zastosować inne podejście lub po prostu sobie z tym poradzić.
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context
Również --
Ukryj przepełnienie HTML i treści. Połóż opakowanie wokół stołu. Załóż -webkit-overflow-scrolling: auto
opakowanie. Uruchom go na iOS 12, a zobaczysz, że nie miga. Jednak nie będziesz mieć przewijania. iOS13 usunął tę potrzebę, -webkit-overflow-scrolling
więc nie można jej nawet przesłonić. Jeśli nałożysz wartość touch
na, -webkit-overflow-scrolling
zaczniesz migotać. Uruchom ten kod poniżej, a zobaczysz, że nie miga. Krótko mówiąc, jak już wielokrotnie mówiłem, będziesz musiał znaleźć inne podejście. Nie możesz tego naprawić teraz, gdy iOS13 jest niedostępny i naprawdę nie chciałbyś w ogóle wyłączyć przewijania pędu.
html {
overflow: hidden;
width: 100%;
height: 100%;
}
body {
overflow: hidden;
height: 100%;
width: 100%;
}
.wrapper {
overflow: auto;
-webkit-overflow-scrolling: auto;
width: 100%;
height: 100%;
}
.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;
}
<html>
<head>
<link rel="stylesheet" href="css.css">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<div class="wrapper">
<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>
</div>
</body>
</html>