После небольшой части моего кода. Просто интересно узнать, почему ячейка "iphone" мигает только от iphone. PS. Я не могу использовать таблицу или список для структуры. Я также пытался использовать transform: translate3d(0,0,0);
.
По сути, мне нужно, чтобы первая ячейка была липкой как для левой, так и для верхней части на iPhone и iPad. Я хотел бы сделать это, используя только HTML и CSS.
ВАЖНЫЙ
Пожалуйста, не отвечайте с фиксированными решениями, я не знаю, где таблица будет размещена в теле. Там будет заголовок, какой-то контент и тд и тп
.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>
Ответы:
Я борюсь со странностями с iOS против всего остального все время. Обычно это связано с проблемами контекста. Мне кажется , что
position: sticky
иleft: 0
элемент становится относительно этой первой строку на прошивке. iOS не обрабатывает контекст стекирования так же, как все другие браузеры.Я так и не понял, что именно вызывает это. Технически ваша ячейка iPhone застревает влево, даже когда она прокручивается, потому что она относительно родительской, которой нет
left: 0
. Я предполагаю, что это связано с тем, как работает iOSposition: sticky
. Липкий начинается относительно, а затем меняется на фиксированный. Все остальные браузеры в этот момент будут привязаны к левому краю. У вас естьposition: sticky;
элемент внутриposition: sticky;
элемента. Это новый стековый контекст. Я полагаю, что iOS фиксирует это на своем родителе, а не так, как вы ожидаете Так как родительская строка не имеетleft: 0
это будет прокручивать со всем остальным. Надеюсь, это поможет. Я не видел мерцания, но у меня было несколько сломанных компонентов в веб-инфраструктуре моей компании после выхода iOS 13, включающей контексты прокрутки и стекирования. Я бы протестировал на нескольких устройствах iOS.отредактируйте, поэкспериментировав с этим, я уверен, что это проблема контекстного стека. Я проворачивал z-index до 1000 только на ячейке iphone, и над ним появляются строки ниже STILL.
Если вам не нужна поддержка Internet Explorer, я бы использовал CSS-сетки для создания этого макета. Тогда вам не придется беспокоиться о
position: sticky
https://css-tricks.com/snippets/css/complete-guide-grid/
https://css-tricks.com/using-css-grid-the-right-way/
Я использую его для динамического большого объема данных в бизнес-приложениях, поэтому он может быть невероятно гибким при правильном использовании.
Обновление снова - если вы не можете изменить DOM вообще, вам придется иметь дело с мерцанием, так как даже сеточное решение потребует оберток вокруг некоторых элементов. Просто чтобы уточнить .... С помощью сеточного решения вам НЕ нужно знать, сколько столбцов или строк у вас будет. Вы, кажется, одержимы этим аспектом. Области сетки также создают новый контекст стека и делают все относительно области сетки, в которой он находится, в то же время позволяя использовать гибкие единицы. Я не могу дать вам ответ, пока вы не покажете, как поступают ваши динамические данные. Нам нужно больше контекста, чтобы дать вам решение для кода.
Снова, мерцание происходит, потому что у вас есть липкий позиционированный элемент внутри другого липкого элемента. Это всего лишь iOS, и если вы хотите использовать его таким образом, вам придется просто разобраться с этим.
Вот документация о контекстах стека и как они работают. Как я сказал в комментарии, вам придется использовать другой подход или просто справиться с ним.
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context
Также --
Скройте переполнение вашего HTML и тела. Положите обертку вокруг стола. Положите
-webkit-overflow-scrolling: auto
на обертку. Запустите его на iOS 12, и вы увидите, что он не мерцает. Вы не будете иметь прокрутку импульса все же. iOS13 убрал необходимость,-webkit-overflow-scrolling
так что вы даже не можете переопределить его. Если поставить значениеtouch
на-webkit-overflow-scrolling
вас будет теперь получить мерцает. Запустите этот код ниже, и вы увидите, что он не мерцает. Короче говоря, как я уже говорил много раз, вам придется искать другой подход. Вы не можете исправить это сейчас, когда iOS13 вышла, и вы действительно не хотели бы отключать прокрутку импульса в любом случае.источник
Если вы переставите элементы, вы сможете добиться этого.
источник