Me gustaría poder "ajustar" la presentación de una tabla HTML para agregar una característica única: al desplazarme hacia abajo por la página para que la tabla esté en la pantalla pero las filas de encabezado estén fuera de la pantalla, me gustaría que los encabezados permanezcan visible en la parte superior del área de visualización.
Esto sería conceptualmente como la función "congelar paneles" en Excel. Sin embargo, una página HTML puede contener varias tablas y solo me gustaría que suceda para la tabla que está actualmente a la vista, solo mientras está a la vista.
Nota: He visto una solución en la que el área de datos de la tabla se puede desplazar mientras los encabezados no se desplazan. Esa no es la solución que estoy buscando.
html
html-table
Craig McQueen
fuente
fuente
Respuestas:
Echa un vistazo a jQuery.floatThead ( demos disponibles ) que es muy bueno, también puede funcionar con DataTables e incluso puede funcionar dentro de un
overflow: auto
contenedor.fuente
Hice una solución de prueba de concepto usando jQuery .
Ver muestra aquí.
Ahora tengo este código en un repositorio de bitbucket de Mercurial . El archivo principal es
tables.html
.Soy consciente de un problema con esto: si la tabla contiene anclas, y si abre la URL con el ancla especificada en un navegador, cuando se carga la página, la fila con el ancla probablemente estará oscurecida por el encabezado flotante.
Actualización 2017-12-11: veo que esto no funciona con Firefox (57) y Chrome (63) actuales. No estoy seguro de cuándo y por qué esto dejó de funcionar, o cómo solucionarlo. Pero ahora, creo que la respuesta aceptada por Hendy Irawan es superior.
fuente
floatingHeaderRow.css("top", Math.min(scrollTop - offset.top, $(this).height() - floatingHeaderRow.height()) + "px");
afloatingHeaderRow.css("top", scrollTop + "px");
como ocurre con el código que tenía el encabezado de la tabla estaba saltando final de la página a desaparecer con el tiempo fuera de la página.// Copy cell widths from original header
parte del código). @ Craig McQueen, edite su respuesta para que nadie más cometa este error.Craig, refiné un poco tu código (entre otras cosas, ahora usa position: fixed) y lo envolví como un complemento jQuery.
Pruébelo aquí: http://jsfiddle.net/jmosbech/stFcx/
Y obtenga la fuente aquí: https://github.com/jmosbech/StickyTableHeaders
fuente
Si está apuntando a navegadores modernos que cumplen con css3 ( soporte de navegador: https://caniuse.com/#feat=css-sticky ) puede usar
position:sticky
, lo que no requiere JS y no romperá el diseño de la tabla. y td de la misma columna. Tampoco requiere un ancho de columna fijo para funcionar correctamente.Ejemplo para una sola fila de encabezado:
Para los cabezas con 1 o 2 filas, puede usar algo como esto:
Es posible que deba jugar un poco con la propiedad superior del último hijo cambiando el número de píxeles para que coincida con la altura de la primera fila (+ el margen + el borde + el relleno, si corresponde), por lo que la segunda fila se pega hacia abajo abajo el primero.
Además, ambas soluciones funcionan incluso si tiene más de una tabla en la misma página: el
th
elemento de cada una comienza a quedar fijo cuando su posición superior es la indicada en la definición de CSS y simplemente desaparece cuando toda la tabla se desplaza hacia abajo. Entonces, si hay más mesas, todas funcionan de la misma manera.¿Por qué usar last-child before y first-child after en el css?
Debido a que el navegador representa las reglas CSS en el mismo orden en que las escribe en el archivo CSS y, por lo tanto, si solo tiene 1 fila en el elemento thead, la primera fila es simultáneamente la última fila y la regla del primer hijo necesita para anular el último hijo. Si no, tendrá un desplazamiento de la fila de 30 px desde el margen superior, lo que supongo que no desea.
Un problema conocido de posición: pegajoso es que no funciona en los elementos o filas de la tabla: debe apuntar a los elementos. Saltar este problema se resolverá en futuras versiones del navegador.
fuente
thead tr+tr th
para apuntar a la segunda fila.Posibles alternativas
js-floating-table-headers
js-floating-table-headers (Código de Google)
En drupal
Tengo un sitio Drupal 6. Estaba en la página de "módulos" de administrador, ¡y noté que las tablas tenían esta característica exacta!
Mirando el código, parece ser implementado por un archivo llamado
tableheader.js
. Aplica la función en todas las tablas con la clasesticky-enabled
.Para un sitio de Drupal, me gustaría poder utilizar ese
tableheader.js
módulo tal cual para el contenido del usuario.tableheader.js
no parece estar presente en las páginas de contenido del usuario en Drupal. Publiqué un mensaje en el foro para preguntar cómo modificar el tema de Drupal para que esté disponible. Según una respuesta,tableheader.js
se puede agregar a un tema de Drupal usandodrupal_add_js()
en el tema de latemplate.php
siguiente manera:fuente
He encontrado este problema muy recientemente. Desafortunadamente, tuve que hacer 2 tablas, una para el encabezado y otra para el cuerpo. Probablemente no sea el mejor enfoque, pero aquí va:
Esto funcionó para mí, probablemente no sea la forma elegante, pero funciona. Investigaré para ver si puedo hacer algo mejor, pero permite varias tablas.
Lea sobre la propiedad de desbordamiento para ver si se ajusta a sus necesidades
fuente
Esto es realmente complicado tener un encabezado adhesivo en su mesa. Tenía el mismo requisito pero con asp: GridView y luego me pareció que realmente tenía un encabezado adhesivo en gridview. Hay muchas soluciones disponibles y me llevó 3 días probar todas las soluciones, pero ninguna de ellas pudo satisfacerlas.
El problema principal que enfrenté con la mayoría de estas soluciones fue el problema de alineación. Cuando intenta hacer que el encabezado flote, de alguna manera la alineación de las celdas del encabezado y las celdas del cuerpo se desvían.
Con algunas soluciones, también tuve el problema de superponer el encabezado en las primeras filas del cuerpo, lo que hace que las filas del cuerpo se oculten detrás del encabezado flotante.
Así que ahora tenía que implementar mi propia lógica para lograr esto, aunque tampoco lo considero una solución perfecta, pero esto también podría ser útil para alguien,
A continuación se muestra la tabla de muestra.
Nota : La tabla está envuelta en un DIV con un atributo de clase igual a 'titular de la tabla'.
A continuación se muestra el script JQuery que agregué en el encabezado de mi página html.
y, por último, a continuación se muestra la clase CSS para propósitos de coloración
Entonces, la idea de esta lógica es colocar la tabla en un div de soporte de tabla y crear un clon de ese titular en el lado del cliente cuando se carga la página. Ahora oculte el cuerpo de la tabla dentro del soporte de clon y coloque la parte restante del encabezado sobre el encabezado original.
La misma solución también funciona para asp: gridview, debe agregar dos pasos más para lograr esto en gridview,
En el evento OnPrerender del objeto gridview en su página web, configure la sección de la tabla de la fila del encabezado igual a TableHeader.
Y envuelve tu cuadrícula
<div class="table-holder"></div>
.Nota : si su encabezado tiene controles en los que se puede hacer clic, es posible que deba agregar más script jQuery para pasar los eventos generados en el encabezado clonado al encabezado original. Este código ya está disponible en el complemento jQuery sticky-header creado por jmosbech
fuente
El uso
display: fixed
de lathead
sección debería funcionar, pero para que solo funcione en la tabla actual a la vista, necesitará la ayuda de JavaScript. Y será complicado porque necesitará averiguar los lugares de desplazamiento y la ubicación de los elementos relativos a la ventana gráfica, que es una de las principales áreas de incompatibilidad del navegador.Eche un vistazo a los populares marcos de JavaScript (jQuery, MooTools, YUI, etc., etc.) para ver si pueden hacer lo que quiere o hacer que sea más fácil hacer lo que quiere.
fuente
position: fixed
. Lo siento, no funcionó en Chrome.Si utiliza una tabla de pantalla completa, quizás le interese configurar th para mostrar: fijo; y arriba: 0; o pruebe un enfoque muy similar a través de css.
Actualizar
Simplemente construya rápidamente una solución de trabajo con iframes (html4.0). Este ejemplo NO cumple con la norma, sin embargo, podrá solucionarlo fácilmente:
externo.html
test.html
fuente
La respuesta más simple solo usando CSS: D !!!
fuente
¡Esa prueba de concepto que hiciste fue genial! Sin embargo, también encontré este complemento jQuery que parece estar funcionando muy bien. ¡Espero eso ayude!
fuente
Es frustrante que lo que funciona muy bien en un navegador no funciona en otros. Lo siguiente funciona en Firefox, pero no en Chrome o IE:
fuente
px
? ¿Es esa unidad heredada utilizada por personas en el 90 cuando un dispositivo de visualización tenía 72 ppp?