Siguiendo un pedacito de mi código. Solo me pregunto por qué la celda "iphone" parpadea solo desde iphone. PD. No puedo usar una tabla o una lista para la estructura. También intenté usar transform: translate3d(0,0,0);
.
Básicamente, también necesito que la primera celda sea pegajosa para Left y Top en iPhone y iPad. Me gustaría hacer eso usando solo HTML y CSS.
IMPORTANTE
Por favor, no responda con soluciones fijas , no sé dónde se colocará la mesa en el cuerpo. Habrá un encabezado, algún contenido, 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>
Respuestas:
Lucho rarezas con iOS vs todo lo demás todo el tiempo. Generalmente implica problemas de contexto de apilamiento. Me parece que el elemento
position: sticky
yleft: 0
se vuelve relativo a esa primera fila en iOS. iOS no maneja el contexto de apilamiento de la misma manera que todos los otros navegadores.Realmente nunca he descubierto exactamente qué causa esto. Técnicamente, la celda de su iPhone está atascada a la izquierda incluso cuando se desplaza porque es relativa a su padre, que no tiene
left: 0
. Supongo que esto tiene que ver con cómo maneja iOSposition: sticky
. Sticky comienza relativo y luego cambia a fijo. Todos los otros navegadores en ese punto lo harían pegar a la izquierda. Tienes unposition: sticky;
elemento dentro de unposition: sticky;
elemento. Ese es un nuevo contexto de apilamiento. Creo que iOS lo hace fijo a su padre y no de la manera que esperarías. Como la fila principal no tieneleft: 0
se va a desplazar con todo lo demás. Espero que esto ayude. No vi parpadeo, pero tenía algunos componentes rotos en el marco web de mi empresa después de que salió iOS 13 que involucraba contextos de desplazamiento y apilamiento. Lo probaría en múltiples dispositivos iOS.editar después de jugar un poco más con él, estoy seguro de que es un problema de contexto de apilamiento. Elevé el índice z hasta 1000 solo en la celda del iPhone y las filas debajo de TODAVÍA aparecen encima de él.
Si no tiene que admitir Internet Explorer, usaría cuadrículas CSS para lograr este diseño. Entonces no tendrás que preocuparte por
position: sticky
https://css-tricks.com/snippets/css/complete-guide-grid/
https://css-tricks.com/using-css-grid-the-right-way/
Lo uso para contenido dinámico de datos pesados en aplicaciones comerciales, por lo que puede ser increíblemente flexible si se aprovecha adecuadamente.
Actualizado nuevamente : si no puede cambiar el DOM en absoluto, tendrá que lidiar con el parpadeo, ya que incluso la solución de cuadrícula requerirá envoltorios alrededor de algunos elementos. Solo para aclarar ... Con una solución de cuadrícula NO necesita saber cuántas columnas o filas tendrá. Parece colgado en ese aspecto. Las áreas de cuadrícula también crean un nuevo contexto de apilamiento y hacen todo lo relativo al área de cuadrícula en la que se encuentra, al tiempo que permiten unidades flexibles. No puedo darle una respuesta hasta que muestre cómo ingresan sus datos dinámicos. Necesitamos más contexto para darle una solución de código.
Nuevamente, el parpadeo está ocurriendo porque tiene un elemento colocado dentro de otro elemento fijo. Eso es solo iOS y si quieres usarlo así, tendrás que lidiar con eso.
Aquí hay documentación sobre los contextos de apilamiento y cómo funcionan. Como dije en un comentario, tendrá que adoptar un enfoque diferente o simplemente tratarlo.
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Position/Understanding_z_index/The_stacking_context
También --
Oculte el desbordamiento en su HTML y cuerpo. Pon una envoltura alrededor de la mesa. Poner
-webkit-overflow-scrolling: auto
el envoltorio. Ejecútelo en iOS 12 y verá que no parpadea. Sin embargo, no tendrás desplazamiento de impulso. iOS13 eliminó la necesidad de-webkit-overflow-scrolling
que no puedas anularlo. Si coloca el valor detouch
en la-webkit-overflow-scrolling
que tendrá ahora parpadeo. Ejecute este código a continuación y verá que no parpadea. En pocas palabras, como he dicho muchas veces, tendrá que encontrar un enfoque diferente. No puede arreglar esto ahora que iOS13 está fuera y realmente no hubiera querido deshabilitar el desplazamiento de impulso de todos modos.fuente
Si reorganiza los elementos, puede lograr esto.
fuente