¿Existe una técnica CSS / JavaScript entre navegadores para mostrar una tabla HTML larga de modo que los encabezados de las columnas permanezcan fijos en la pantalla y no se desplace con el cuerpo de la tabla? Piense en el efecto de "congelar paneles" en Microsoft Excel.
Quiero poder desplazarme por el contenido de la tabla, pero siempre poder ver los encabezados de columna en la parte superior.
javascript
css
html-table
Cheekysoft
fuente
fuente
thead th { position: sticky; top: 0; }
. Safari necesita un prefijo de proveedor:-webkit-sticky
Respuestas:
Estuve buscando una solución para esto por un tiempo y descubrí que la mayoría de las respuestas no funcionan o no son adecuadas para mi situación, así que escribí una solución simple con jQuery.
Este es el esquema de la solución:
A continuación se muestra el código en una demostración ejecutable.
Esta solución funciona en Chrome e IE. Como se basa en jQuery, esto también debería funcionar en otros navegadores compatibles con jQuery.
fuente
Esto se puede resolver limpiamente en cuatro líneas de código.
Si solo le interesan los navegadores modernos, un encabezado fijo se puede lograr mucho más fácilmente mediante el uso de transformaciones CSS. Suena extraño, pero funciona muy bien:
El soporte para transformaciones CSS está ampliamente disponible, excepto para Internet Explorer 8-.
Aquí está el ejemplo completo para referencia:
Mostrar fragmento de código
fuente
$(this).addClass('border')
cambia el resto de las características de la tabla fuentes, tamaño, color que paso en la clase de borde. Pero, no agrega líneas al encabezado fijo. Aprecio, cualquier entrada sobre cómo solucionar estoAcabo de terminar de armar un complemento jQuery que tomará una tabla única válida usando HTML válido (debe tener un thead y tbody) y generará una tabla que tenga encabezados fijos, pie de página fijo opcional que puede ser un encabezado clonado o cualquier contenido que eligió (paginación, etc.). Si desea aprovechar los monitores más grandes, también cambiará el tamaño de la tabla cuando se cambie el tamaño del navegador. Otra característica adicional es poder desplazarse lateralmente si las columnas de la tabla no pueden caber todas a la vista.
http://fixedheadertable.com/
en github: http://markmalek.github.com/Fixed-Header-Table/
Es extremadamente fácil de configurar y puede crear sus propios estilos personalizados. También utiliza esquinas redondeadas en todos los navegadores. Tenga en cuenta que acabo de lanzarlo, por lo que todavía es técnicamente beta y hay muy pocos problemas menores que estoy solucionando.
Funciona en Internet Explorer 7, Internet Explorer 8, Safari, Firefox y Chrome.
fuente
También creé un complemento que soluciona este problema. Mi proyecto: jQuery.floatThead ha existido durante más de 4 años y es muy maduro.
No requiere estilos externos y no espera que su tabla tenga un estilo particular. Es compatible con Internet Explorer9 + y Firefox / Chrome.
Actualmente (2018-05) tiene:
Muchas (no todas) de las respuestas aquí son trucos rápidos que pueden haber resuelto el problema que tenía una persona, pero no funcionarán para todas las mesas.
Algunos de los otros complementos son antiguos y probablemente funcionen muy bien con Internet Explorer, pero se romperán en Firefox y Chrome.
fuente
TL; DR
Si apuntas a los navegadores modernos y no tienes necesidades de estilo extravagantes: http://jsfiddle.net/dPixie/byB9d/3/ ... Aunque la versión grande cuatro también es bastante dulce, esta versión maneja el ancho del fluido mucho mejor.
¡Buenas noticias para todos!
Con los avances de HTML5 y CSS3 esto ahora es posible, al menos para los navegadores modernos. La implementación ligeramente hackeada que se me ocurrió se puede encontrar aquí: http://jsfiddle.net/dPixie/byB9d/3/ . Lo he probado en FX 25, Chrome 31 e IE 10 ...
HTML relevante (inserte un doctype HTML5 en la parte superior de su documento):
¡¿Pero cómo?!
En pocas palabras, tiene un encabezado de tabla, que oculta visualmente haciendo 0px de alto, que también contiene divs utilizados como encabezado fijo. El contenedor de la tabla deja suficiente espacio en la parte superior para permitir el encabezado absolutamente posicionado, y la tabla con barras de desplazamiento aparece como cabría esperar.
El código anterior usa la clase posicionada para posicionar la tabla absolutamente (la estoy usando en un cuadro de diálogo de estilo emergente) pero también puede usarla en el flujo del documento eliminando la
positioned
clase del contenedor.Pero ...
No es perfecto Firefox se niega a hacer que la fila del encabezado sea de 0px (al menos no encontré ninguna forma) pero obstinadamente la mantiene en un mínimo de 4px ... No es un gran problema, pero dependiendo de su estilo se enredará con sus bordes, etc.
La tabla también está utilizando un enfoque de columna falsa donde el color de fondo del contenedor en sí se utiliza como fondo para los divs de encabezado, que son transparentes.
Resumen
En general, puede haber problemas de estilo según sus requisitos, especialmente bordes o fondos complicados. También puede haber problemas con la computabilidad, aún no lo he verificado en una amplia variedad de navegadores (comente con sus experiencias si lo prueba), pero no encontré nada parecido, así que pensé que valía la pena publicarlo de todas formas ...
fuente
<section>
elemento, debe tener una altura limitada solo para forzarlo a desbordarse y mostrar el desplazamiento. Cualquier diseño que haga que el contenedor se desborde funcionaría. Si encuentra un caso en el que no aparece, publique un enlace a un violín.padding-top
valor codificado también significa que si el texto del encabezado de la tabla está en más de una línea, aparecerá en la parte superior de las celdas de la tabla. Lástima, porque esto funciona como un encanto la mayor parte del tiempo. Muy buen truco con eldiv
en elth
de moverse por el tema columna de dimensionamiento mayoría de las otras soluciones tienen.Todos los intentos de resolver esto desde fuera de la especificación CSS son sombras pálidas de lo que realmente queremos: cumplir con la promesa implícita de THEAD.
Este problema de encabezados congelados para una tabla ha sido una herida abierta en HTML / CSS durante mucho tiempo.
En un mundo perfecto, habría una solución de CSS puro para este problema. Desafortunadamente, no parece haber una buena en su lugar.
Las discusiones sobre estándares relevantes sobre este tema incluyen:
ACTUALIZACIÓN : Firefox se envió
position:sticky
en la versión 32. ¡Todos ganan!fuente
thead th { position: sticky; top: 0; }
. ¿Podemos actualizar esta respuesta para indicar esto claramente?Aquí hay un complemento jQuery para encabezados de tabla fijos. Permite que toda la página se desplace, congelando el encabezado cuando llega a la parte superior. Funciona bien con las tablas de Bootstrap de Twitter .
Repositorio de GitHub: https://github.com/oma/table-fixed-header
No , no desplazarse únicamente contenido de la tabla. Busque otras herramientas para eso, como una de estas otras respuestas. Usted decide qué se adapta mejor a su caso.
fuente
La mayoría de las soluciones publicadas aquí requieren jQuery. Si está buscando una solución independiente del marco, pruebe Grid: http://www.matts411.com/post/grid/
Está alojado en Github aquí: https://github.com/mmurph211/Grid
No solo admite encabezados fijos, también admite columnas y pies de página fijos a la izquierda, entre otras cosas.
fuente
La propiedad CSS
position: sticky
tiene un gran soporte en la mayoría de los navegadores modernos (tuve problemas con Edge, ver más abajo).Esto nos permite resolver el problema de los encabezados fijos con bastante facilidad:
Safari necesita un prefijo de proveedor:
-webkit-sticky
.Para Firefox, tuve que agregar
min-height: 0
a uno los elementos principales. Olvidé exactamente por qué esto era necesario.Lamentablemente, la implementación de Microsoft Edge parece ser solo semi-funcional. Al menos, tuve algunas celdas de tabla parpadeantes y desalineadas en mis pruebas. La mesa todavía era utilizable, pero tenía importantes problemas estéticos.
fuente
position: sticky;
la tabla dentro de un div que tieneoverflow: scroll;
,overflow-x: scroll;
ooverflow-y: scroll;
. parece ser la mejor y más simple solución para encabezados de tabla fijos y columnas en navegadores modernos. Esta respuesta necesita ser votada a la cima.Una tabla de desplazamiento CSS pura más refinada
Todas las soluciones CSS puras que he visto hasta ahora, por inteligentes que sean, carecen de cierto nivel de pulido o simplemente no funcionan correctamente en algunas situaciones. Entonces, decidí crear el mío ...
caracteristicas:
Aquí hay un par de violines que muestran las opciones de ancho automático y fluido:
Ancho y altura del fluido (se adapta al tamaño de la pantalla): jsFiddle ( tenga en cuenta que la barra de desplazamiento solo aparece cuando es necesario en esta configuración, por lo que es posible que tenga que reducir el marco para verlo)
Ancho automático, altura fija (más fácil de integrar con otro contenido): jsFiddle
La configuración de Ancho automático, Altura fija probablemente tenga más casos de uso, por lo que publicaré el código a continuación.
El método que utilicé para congelar la fila del encabezado es similar al de d-Pixie, así que consulte su publicación para obtener una explicación. Hubo una gran cantidad de errores y limitaciones con esa técnica que solo se pudieron solucionar con un montón de CSS adicional y un contenedor div adicional o dos.
fuente
Un simple complemento jQuery
Esta es una variación de la solución de Mahes. Puedes llamarlo como
$('table#foo').scrollableTable();
La idea es:
thead
ytbody
entable
elementos separadostable
en undiv.scrollable
div.scrollable
realmente se desplaceEl CSS podría ser:
Advertencias
Dicho esto, funciona para mis propósitos y eres libre de tomarlo y modificarlo.
Aquí está el complemento:
fuente
:)
Solución no tan limpia, pero pura de HTML / CSS.
Actualizado para IE8 + JSFiddle ejemplo
fuente
Soporte para pie de página fijo
Extendí la función de Nathan para soportar también un pie de página fijo y una altura máxima. Además, la función establecerá el CSS en sí, y solo debe admitir un ancho.
Uso:
Altura fija:
Altura máxima (si el navegador admite la opción 'altura máxima' de CSS):
Guión:
fuente
De alguna manera terminé
Position:Sticky
trabajando bien en mi caso:fuente
Dos divs, uno para encabezado, uno para datos. Haga que el div de datos se pueda desplazar y use JavaScript para establecer que el ancho de las columnas en el encabezado sea el mismo que el ancho de los datos. Creo que los anchos de las columnas de datos deben ser fijos en lugar de dinámicos.
fuente
Me doy cuenta de que la pregunta permite JavaScript, pero aquí hay una solución CSS pura que trabajé que también permite que la tabla se expanda horizontalmente. Fue probado con Internet Explorer 10 y los últimos navegadores Chrome y Firefox. Un enlace a jsFiddle está en la parte inferior.
El HTML:
Y el CSS:
http://jsfiddle.net/HNHRv/3/
fuente
Para aquellos que probaron la buena solución dada por Maximilian Hils, y no lograron que funcionara con Internet Explorer, tuve el mismo problema (Internet Explorer 11) y descubrí cuál era el problema.
En Internet Explorer 11, la transformación de estilo (al menos con traducir) no funciona
<THEAD>
. Resolví esto aplicando el estilo a todo<TH>
en un bucle. Eso funciono. Mi código JavaScript se ve así:En mi caso, la tabla era un GridView en ASP.NET. Primero pensé que era porque no tenía
<THEAD>
, pero incluso cuando lo forcé a tener uno, no funcionó. Entonces descubrí lo que escribí arriba.Es una solución muy agradable y simple. En Chrome es perfecto, en Firefox un poco desigual, y en Internet Explorer aún más desigual. Pero en general, una buena solución.
fuente
Desearía haber encontrado la solución de @ Mark antes, pero fui y escribí la mía antes de ver esta pregunta SO ...
El mío es un complemento jQuery muy liviano que admite encabezado fijo, pie de página, extensión de columna (colspan), cambio de tamaño, desplazamiento horizontal y un número opcional de filas para mostrar antes de que comience el desplazamiento.
jQuery.scrollTableBody (GitHub)
Siempre que tenga una tabla con adecuada
<thead>
,<tbody>
y (opcional)<tfoot>
, todo lo que necesita hacer es esto:fuente
Encontré esta solución: mueva la fila del encabezado en una tabla sobre la tabla con datos:
fuente
Al aplicar el complemento jQuery StickyTableHeaders a la tabla, los encabezados de las columnas se pegarán en la parte superior de la ventana gráfica a medida que se desplaza hacia abajo.
Ejemplo:
fuente
Me gusta la respuesta de Maximillian Hils pero tuve algunos problemas:
Para deshacerme del parpadeo, utilizo un tiempo de espera para esperar hasta que el usuario haya terminado de desplazarse, luego aplico la transformación, por lo que el encabezado no es visible durante el desplazamiento.
También he escrito esto usando jQuery, una ventaja de eso es que jQuery debería manejar los prefijos de proveedor por usted
La tabla está envuelta en un div con la clase
table-container-fixed
.Configuré el colapso del borde para que se separe porque, de lo contrario, perdemos bordes durante la traducción, y elimino el borde de la tabla para evitar que el contenido aparezca justo encima de la celda donde estaba el borde durante el desplazamiento.
Hago el
th
fondo blanco para cubrir las celdas debajo, y agrego un borde que coincide con el borde de la tabla, que está diseñado con Bootstrap y se desplaza fuera de la vista.fuente
Use la última versión de jQuery e incluya el siguiente código JavaScript.
fuente
Esta no es una solución exacta para la fila de encabezado fija, pero he creado un método bastante ingenioso para repetir la fila de encabezado a lo largo de la tabla larga, pero manteniendo la capacidad de ordenar.
Esta pequeña opción ordenada requiere el complemento jQuery
tablesorter
. Así es como funciona:HTML
Obviamente, mi tabla tiene muchas más filas que esta. 193 para ser exactos, pero puede ver dónde se repite la fila del encabezado. La fila de encabezado de repetición se configura mediante esta función:
jQuery
fuente
Mucha gente parece estar buscando esta respuesta. Lo encontré enterrado en una respuesta a otra pregunta aquí: Sincronizando el ancho de columna de las tablas en dos marcos diferentes, etc.
De las docenas de métodos que he probado, este es el único método que encontré que funciona de manera confiable para permitirle tener una tabla inferior desplazable con la tabla de encabezado con los mismos anchos.
Así es como lo hice, primero mejoré el jsfiddle de arriba para crear esta función, que funciona en ambos
td
yth
(en caso de que tropiece con otros que usanth
para diseñar sus filas de encabezado).A continuación, debe crear dos tablas, tenga en cuenta que la tabla de encabezado debe tener un
TD
espacio adicional para dejar espacio en la tabla superior para la barra de desplazamiento, de esta manera:Luego haz algo como:
Esta es la única solución que encontré en Stack Overflow que funciona a partir de muchas preguntas similares que se han publicado, que funciona en todos mis casos.
Por ejemplo, probé el complemento jQuery stickytables que no funciona con durandal, y el proyecto Google Code aquí https://code.google.com/p/js-scroll-table-header/issues/detail?id=2
Otras soluciones que implican la clonación de las tablas, tienen un rendimiento deficiente o son malas y no funcionan en todos los casos.
No hay necesidad de estas soluciones demasiado complejas. Simplemente haga dos tablas como los ejemplos a continuación y llame a la función setHeaderTableWidth como se describe aquí y boom, ya está .
Si esto no funciona para usted, probablemente estaba jugando con su propiedad de tamaño de caja CSS y necesita configurarla correctamente. Es fácil arruinar su contenido CSS por accidente. Hay muchas cosas que pueden salir mal, así que ten cuidado / ten cuidado con eso. Este enfoque funciona para mí .
fuente
Aquí hay una solución con la que terminamos trabajando (para hacer frente a algunos casos extremos y versiones anteriores de Internet Explorer, eventualmente también desvanecimos la barra de título en el desplazamiento y luego la desvanecimos cuando finaliza el desplazamiento, pero en los navegadores Firefox y WebKit esta solución simplemente funciona , supone un colapso de borde: colapso.
La clave de esta solución es que una vez que aplica el colapso del borde , las transformaciones CSS funcionan en el encabezado, por lo que es solo cuestión de interceptar eventos de desplazamiento y configurar la transformación correctamente. No necesitas duplicar nada. A menos que este comportamiento se implemente correctamente en el navegador, es difícil imaginar una solución más liviana.
JSFiddle: http://jsfiddle.net/podperson/tH9VU/2/
Se implementa como un simple complemento jQuery. Simplemente hace que su thead sea pegajoso con una llamada como $ ('thead'). Sticky (), y se quedarán. Funciona para varias tablas en una página y secciones de encabezado a la mitad de tablas grandes.
fuente
border: 2px solid red;
ath
, desplazarse, y verá el problema. Se me ocurrió esta solución más básica: jsfiddle.net/x6pLcor9/19Aquí hay una respuesta mejorada a la publicada por Maximilian Hils .
Este funciona en Internet Explorer 11 sin parpadeo alguno:
fuente
Desarrollé un plugin jQuery simple y liviano para convertir una tabla HTML bien formateada en una tabla desplazable con encabezado y columnas fijas.
El complemento funciona bien para hacer coincidir el posicionamiento de píxel a píxel de la sección fija con la sección desplazable. Además, también puede congelar la cantidad de columnas que siempre estarán a la vista al desplazarse horizontalmente.
Demostración y documentación: http://meetselva.github.io/fixed-table-rows-cols/
Repositorio de GitHub: https://github.com/meetselva/fixed-table-rows-cols
A continuación se muestra el uso de una tabla simple con un encabezado fijo,
fuente
fuente
Adicional a la respuesta de @Daniel Waltrip. La tabla debe encerrarse con div
position: relative
para poder trabajarposition:sticky
. Así que me gustaría publicar mi código de muestra aquí.CSS
HTML
Manifestación
fuente