Necesito crear una tabla html (o algo similar) con un encabezado fijo y una primera columna fija.
Todas las soluciones que he visto hasta ahora usan Javascript o jQuery
para configurar scrollTop / scrollLeft, pero no funciona sin problemas en navegadores móviles, así que estoy buscando una solución CSS pura.
Encontré una solución para una columna fija aquí: jsfiddle.net/C8Dtf/20/ pero no sé cómo puedo mejorarla para que el encabezado también sea fijo.
Quiero que funcione en navegadores webkit o use algunas css3
características, pero repito, no quiero usarlo Javascript
para desplazarse.
EDITAR: Este es un ejemplo del comportamiento que quiero lograr: https://web.archive.org/web/20130829032141/http://datatables.net/release-datatables/extras/FixedColumns/css_size.html
fuente
position
comportamiento complejo a filas y celdas, pero no entiendo bien dónde es aplicable o no.Respuestas:
Una solución CSS pura real con una fila de encabezado fija y una primera columna
Tuve que crear una tabla con un encabezado fijo y una primera columna fija usando CSS puro y ninguna de las respuestas aquí era lo que quería.
La
position: sticky
propiedad admite tanto pegarse a la parte superior (como he visto que se usa más) como a los lados en las versiones modernas de Chrome, Firefox y Edge. Esto se puede combinar con unadiv
que tiene laoverflow: scroll
propiedad de brindarle una tabla con encabezados fijos que se pueden colocar en cualquier lugar de su página:Coloque su mesa en un recipiente:
Úselo
overflow: scroll
en su contenedor para habilitar el desplazamiento:Como señaló Dagmar en los comentarios, el contenedor también requiere un
max-width
y unmax-height
.Utilice
position: sticky
tener celdas de la tabla se adhieren a la orilla ytop
,right
oleft
para elegir el borde de palo para:Como MarredCheese mencionó en los comentarios, si su primera columna contiene
<td>
elementos en lugar de<th>
elementos, puede usarlostbody td:first-child
en su CSS en lugar detbody th
Para que el encabezado de la primera columna se pegue a la izquierda, use:
Mostrar fragmento de código
https://jsfiddle.net/qwubvg9m/1/
fuente
width
de su primera columna, puede usarloposition: sticky
en las celdas de su segunda columna con unleft
valor igual al de su primera columnawidth
: jsfiddle.net/wvypo83c/794<td>
elementos en lugar de<th>
elementos, puede usarlostbody td:first-child
en su CSS en lugar detbody th
.Hoy en día, esto se puede lograr usando CSS solo con
position: sticky
propiedad.Aquí va un fragmento:
(jsFiddle: https://jsfiddle.net/hbqzdzdt/5/ )
Respecto a la compatibilidad. Funciona en todos los navegadores principales, pero no en IE. Hay un polyfill para
position: sticky
pero nunca lo probé.fuente
Esto no es tarea fácil.
El siguiente enlace es a una demostración funcional:
Enlace actualizado de acuerdo con el comentario de lanoxx
http://jsfiddle.net/C8Dtf/366/
Solo recuerda agregar estos:
No veo ninguna otra forma de lograrlo. Especialmente no usando solo css.
Esto es mucho por lo que pasar. Espero que esto ayude :)
fuente
"bFilter": false
"bInfo" : false
a la.dataTable()
llamadathead
se encuentra en su propia mesa que no está unido a los cambios detd
elementos, de modo que si un texto de la celda es largo, lath
anchura no se ajustará en consecuencia.Todas estas sugerencias son geniales y todo, pero solo están arreglando el encabezado o una columna, no ambas, o están usando javascript. La razón: no cree que se pueda hacer con CSS puro. La razón:
Si fuera posible hacerlo, necesitaría anidar varios divs desplazables uno dentro del otro, cada uno con un desplazamiento en una dirección diferente. Luego, necesitaría dividir su tabla en tres partes: el encabezado fijo, la columna fija y el resto de los datos.
Multa. Pero ahora el problema: puede hacer que uno de ellos se quede quieto cuando se desplaza, pero el otro está anidado dentro del área de desplazamiento del primero y, por lo tanto, está sujeto a desplazarse fuera de la vista, por lo que no se puede fijar en su lugar en la pantalla. 'Ah-ha' dices 'pero de alguna manera puedo usar la posición absoluta o fija para hacer eso', no, no puedes. Tan pronto como lo haga, perderá la capacidad de desplazarse por ese contenedor. Es una situación de la gallina y el huevo: no puedes tener ambos, se cancelan entre sí.
Creo que la única solución es a través de javascript. Debe separar completamente los tres elementos y mantener sus posiciones sincronizadas a través de javascript. Hay buenos ejemplos en otras publicaciones de esta página. Este también vale la pena verlo:
http://tympanus.net/codrops/2014/01/09/sticky-table-headers-columns/
fuente
Hice algunos cambios en jsfiddle. Esto podría ser lo que estás intentando hacer.
He codificado los títulos de esta manera:
Y también agregué algunos estilos.
Espero que esto sea lo que quieres :)
fuente
Un ejemplo usando solo CSS:
fuente
div
. Es eldiv
que permite el desplazamiento de filas mientras el encabezado permanece en el mismo lugar. Este enfoque funcionó para mis necesidades.Para corregir tanto los encabezados como las columnas, puede usar el siguiente complemento:
Actualizado en julio de 2019
Recientemente también surgió una solución CSS pura que se basa en la propiedad CSS
position: sticky;
( aquí para obtener más detalles al respecto) aplicada a cadaTH
elemento (en lugar de su contenedor principal)fuente
Encontré una excelente solución de Paul O'Brien para el problema y me gustaría compartir el enlace: https://codepen.io/paulobrien/pen/LBrMxa
Eliminé el estilo del pie de página:
fuente
Recientemente tuve que crear una solución con un grupo de encabezado fijo y una primera columna fija. Dividí mi tabla en div y usé jquery para capturar el desplazamiento de la ventana.
http://jsfiddle.net/TinT/EzXub/2346/
fuente
Un compañero de trabajo y yo acabamos de lanzar un nuevo proyecto de GitHub que proporciona una directiva Angular que puede usar para decorar su mesa con encabezados fijos: https://github.com/objectcomputing/FixedHeader
Se basa solo en css y angular, con una directiva que agrega algunos divs. No se requiere jQuery.
Esta implementación no tiene tantas funciones como otras implementaciones, pero si su necesidad es simplemente agregar tablas fijas, creemos que esta podría ser una buena opción.
fuente
Después de dos días luchando con Internet Explorer 9 + Chrome + Firefox (Windows) y Safari (Mac), encontré un sistema que es
Resultado:
HTML:
CSS:
fuente
div.cost_center table{border-collapse: collapse;}
y el tercer título tiene que ser algo que encaje dentro de los 60px (en este ejemplo)Las respuestas existentes se adaptarán a la mayoría de las personas, pero para aquellos que buscan agregar sombras debajo del encabezado fijo y a la derecha de la primera columna (fija), aquí hay un ejemplo de trabajo (CSS puro):
http://jsbin.com/nayifepaxo/1/edit?html,output
El truco principal para que esto funcione es usar
::after
para agregar sombras a la derecha de cada una de las primerastd
en cada unatr
:Me tomó un tiempo (demasiado ...) hacer que todo funcionara, así que pensé que lo compartiría para aquellos que se encuentran en una situación similar.
fuente
Mostrar fragmento de código
Necesito arreglar el pie de página del encabezado
fuente
Algo como esto puede funcionar para usted ... Probablemente requerirá que haya establecido anchos de columna para su fila de encabezado.
http://jsfiddle.net/vkhNC/
Actualizar:
No estoy convencido de que el ejemplo que dio sea posible solo con CSS. Me encantaría que alguien me demostrara que estoy equivocado. Esto es lo que tengo hasta ahora . No es el producto terminado, pero podría ser un comienzo para usted. Espero que esto le oriente en una dirección útil, dondequiera que sea.
fuente
Otra solución es usar AngularJS. El módulo AngularUI tiene una directiva llamada
ng-grid
que admite una función llamada fijación de columnas. No es CSS 100% puro, pero tampoco lo son las otras soluciones.http://angular-ui.github.io/ng-grid/#columnPinning
fuente
Ejemplo de CSS puro:
http://jsfiddle.net/cCarlson/L98m854d/
Inconveniente: la estructura / lógica del encabezado fijo depende bastante de dimensiones específicas, por lo que la abstracción probablemente no sea una opción viable .
fuente
Posición: sticky no funciona para algunos elementos como (thead) en Chrome y otros navegadores webkit como safari.
Pero funciona bien con (th)
O visite mi ejemplo de codepen :
fuente
Creo que esto te ayudará: https://datatables.net/release-datatables/extensions/FixedHeader/examples/header_footer.html
En pocas palabras, si sabe cómo crear una tabla de datos, solo necesita agregar esta línea jQuery a su parte inferior:
bottom: true // es para hacer que el encabezado Inferior sea fijo también.
fuente
Si solo desea usar HTML y CSS puros, tengo una solución para su problema:
en este jsFiddle puede ver una solución sin script que proporciona una tabla con un encabezado fijo. No debería ser un problema adaptar el marcado para una primera columna fija también. Solo necesitaría crear una tabla de posición absoluta para la primera columna dentro de
hWrapper
-div y reposicionarvWrapper
-div.Proporcionar contenido dinámico no debería ser un problema utilizando motores tentadores del lado del servidor o del lado del navegador, mi solución funciona bien en todos los navegadores modernos y navegadores más antiguos desde IE8 en adelante.
fuente
Solo necesito cambiar el estilo como
Demostración: https://plnkr.co/edit/Qxy5RMJBXmkaJAOjBtQn?p=preview
fuente