Seguindo um pequeno pedaço do meu código. Apenas querendo saber por que a célula "iphone" está piscando apenas no iphone. PS. Não posso usar uma tabela ou uma lista para a estrutura. Eu também tentei usar transform: translate3d(0,0,0);
.
Basicamente, eu preciso que a primeira célula seja pegajosa tanto para esquerda quanto para cima no iPhone e iPad também. Eu gostaria de fazer isso usando apenas HTML e CSS.
IMPORTANTE
Por favor, não responda com soluções fixas , não sei onde a mesa será colocada no corpo. Haverá um cabeçalho, algum conteúdo, 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>
Respostas:
Eu luto com esquisitices com iOS vs tudo o mais o tempo todo. Geralmente, envolve problemas de contexto de empilhamento. Parece-me que o elemento
position: sticky
eleft: 0
se torna relativo à primeira linha no iOS. O iOS não lida com o contexto de empilhamento da mesma forma que todos os outros navegadores.Eu nunca realmente descobri exatamente o que causa isso. Tecnicamente, a célula do seu iPhone fica presa à esquerda, mesmo quando está rolando, porque é relativa ao pai que não possui
left: 0
. Estou assumindo que isso tem a ver com a forma como o iOS lidaposition: sticky
. O adesivo começa relativo e depois muda para fixo. Todos os outros navegadores nesse ponto o fariam à esquerda. Você tem umposition: sticky;
elemento dentro de umposition: sticky;
elemento. Esse é um novo contexto de empilhamento. Acredito que o iOS o torna fixo ao pai e não da maneira que você esperaria. Como a linha pai não temleft: 0
vai rolar com todo o resto. Eu espero que isso ajude. Não vi cintilação, mas havia alguns componentes danificados na estrutura da web da minha empresa depois que o iOS 13 foi lançado, envolvendo contextos de rolagem e empilhamento. Eu testaria em vários dispositivos iOS.editar depois de brincar um pouco mais, tenho certeza de que é um problema de empilhamento de contexto. Aumentei o índice z até 1000 apenas na célula do iphone e as linhas abaixo AINDA aparecem acima dela.
Se você não precisa dar suporte ao Internet Explorer, eu usaria grades CSS para obter esse layout. Então você não terá que se preocupar
position: sticky
https://css-tricks.com/snippets/css/complete-guide-grid/
https://css-tricks.com/using-css-grid-the-right-way/
Eu o uso para conteúdo pesado de dados dinâmicos em aplicativos de negócios, para que possa ser incrivelmente flexível se aproveitado adequadamente.
Atualizado novamente - Se você não pode alterar o DOM, precisará lidar com a oscilação, pois mesmo a solução de grade exigirá wrappers em torno de alguns elementos. Apenas para esclarecer .... Com uma solução de grade, você NÃO precisa saber quantas colunas ou linhas você terá. Você parece pendurado nesse aspecto. As áreas de grade também criam um novo contexto de empilhamento e tornam tudo relativo à área de grade em que está, permitindo unidades flexíveis. Não posso responder até que você mostre como os dados dinâmicos estão chegando. Precisamos de mais contexto para fornecer uma solução de código.
Novamente, a tremulação está acontecendo porque você tem um elemento posicionado dentro de outro elemento. Isso é apenas iOS e se você quiser usá-lo dessa maneira, precisará lidar com isso.
Aqui está a documentação sobre os contextos de empilhamento e como eles funcionam. Como afirmei em um comentário, você terá que adotar uma abordagem diferente ou apenas lidar com ela.
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context
Além disso --
Oculte o excesso no seu HTML e corpo. Coloque um invólucro em volta da mesa. Coloque
-webkit-overflow-scrolling: auto
a embalagem. Execute-o no iOS 12 e você verá que não pisca. Você não terá rolagem de momento. O iOS13 removeu a necessidade do,-webkit-overflow-scrolling
para que você não possa substituí-lo. Se você colocar o valor detouch
em-webkit-overflow-scrolling
, agora ficará piscando. Execute este código abaixo e você verá que ele não pisca. Para encurtar a história, como já disse muitas vezes, você precisará encontrar uma abordagem diferente. Você não pode consertar isso agora que o iOS13 está fora e realmente não gostaria de desativar a rolagem de momento.fonte
Se você reorganizar os elementos, poderá conseguir isso.
fonte