¿Cómo puedo establecer un <table>
ancho del 100% y poner solo dentro del <tbody>
desplazamiento vertical para cierta altura?
table {
width: 100%;
display:block;
}
thead {
display: inline-block;
width: 100%;
height: 20px;
}
tbody {
height: 200px;
display: inline-block;
width: 100%;
overflow: auto;
}
<table>
<thead>
<tr>
<th>Head 1</th>
<th>Head 2</th>
<th>Head 3</th>
<th>Head 4</th>
<th>Head 5</th>
</tr>
</thead>
<tbody>
<tr>
<td>Content 1</td>
<td>Content 2</td>
<td>Content 3</td>
<td>Content 4</td>
<td>Content 5</td>
</tr>
</tbody>
</table>
Quiero evitar agregar algunos div adicionales, todo lo que quiero es una tabla simple como esta y cuando trato de cambiar la visualización table-layout
, position
y muchas cosas más en la tabla CSS no funcionan bien con un ancho del 100% solo con un ancho fijo en px.
html
css
vertical-scrolling
Marko S
fuente
fuente
Respuestas:
Para hacer que el
<tbody>
elemento se pueda desplazar, necesitamos cambiar la forma en que se muestra en la página, es decir, usarlodisplay: block;
para mostrarlo como un elemento de nivel de bloque.Como cambiamos la
display
propiedad detbody
, también debemos cambiar esa propiedad para elthead
elemento para evitar que se rompa el diseño de la tabla.Entonces tenemos:
Los navegadores web muestran los elementos
thead
ytbody
como grupo de filas (table-header-group
ytable-row-group
) de forma predeterminada.Una vez que cambiamos eso, los
tr
elementos internos no llenan todo el espacio de su contenedor.Para solucionarlo, debemos calcular el ancho de las
tbody
columnas y aplicar el valor correspondiente a lasthead
columnas a través de JavaScript.Columnas de ancho automático
Aquí está la versión jQuery de la lógica anterior:
Y aquí está la salida (en Windows 7 Chrome 32) :
DEMO DE TRABAJO .
Tabla de ancho completo, columnas de ancho relativo
Como lo necesitaba el Cartel original, podríamos expandirlo
table
al 100% dewidth
su contenedor, y luego usar un relativo ( Porcentaje )width
para cada columna de la tabla.Dado que la tabla tiene un diseño fluido , deberíamos ajustar el ancho de las
thead
columnas cuando el contenedor cambia de tamaño.Por lo tanto, deberíamos establecer el ancho de las columnas una vez que la ventana cambia de tamaño:
El resultado sería:
DEMO DE TRABAJO .
Soporte del navegador y alternativas
He probado los dos métodos anteriores en Windows 7 a través de las nuevas versiones de los principales navegadores web (incluido IE10 +) y funcionó.
Sin embargo, no funciona correctamente en IE9 y versiones posteriores.
Eso es porque en un diseño de tabla , todos los elementos deben seguir las mismas propiedades estructurales.
Al usar
display: block;
para los elementos<thead>
y<tbody>
, hemos roto la estructura de la tabla.Diseño de rediseño a través de JavaScript
Un enfoque es rediseñar el diseño de tabla (completo). Usar JavaScript para crear un nuevo diseño sobre la marcha y manejar y / o ajustar los anchos / alturas de las celdas dinámicamente.
Por ejemplo, eche un vistazo a los siguientes ejemplos:
Mesas de anidamiento
Este enfoque utiliza dos tablas anidadas con un div que contiene. La primera
table
tiene solo una celda que tiene undiv
, y la segunda tabla se coloca dentro de esediv
elemento.Consulte las tablas de desplazamiento vertical en CSS Play .
Esto funciona en la mayoría de los navegadores web. También podemos hacer la lógica anterior de forma dinámica a través de JavaScript.
Tabla con encabezado fijo en desplazamiento
Dado que el propósito de agregar una barra de desplazamiento vertical al
<tbody>
mostrar el encabezado de la tabla en la parte superior de cada fila, podríamos colocar elthead
elemento para que permanezcafixed
en la parte superior de la pantalla.Aquí hay una demostración de trabajo de este enfoque realizado por Julien .
Tiene un soporte de navegador web prometedor.
Y aquí una implementación CSS pura por Willem Van Bockstal .
La solución CSS pura
Aquí está la vieja respuesta. Por supuesto, agregué un nuevo método y perfeccioné las declaraciones CSS.
Mesa con ancho fijo
En este caso,
table
debería tener un valor fijowidth
(incluida la suma de los anchos de las columnas y el ancho de la barra de desplazamiento vertical) .Cada columna debe tener una determinada anchura y la última columna del
thead
elemento necesita una mayor anchura que es igual a la de los demás ancho + el ancho de la barra de desplazamiento vertical.Por lo tanto, el CSS sería:
Aquí está la salida:
DEMO DE TRABAJO .
Mesa con 100% de ancho
En este enfoque,
table
tiene un ancho de100%
y para cadath
ytd
, el valor de lawidth
propiedad debe ser menor que100% / number of cols
.Además, tenemos que reducir el ancho de
thead
como el valor de la anchura de la barra de desplazamiento vertical.Para hacer eso, necesitamos usar la
calc()
función CSS3 , de la siguiente manera:Aquí está la demostración en línea .
Nota: este enfoque fallará si el contenido de cada columna rompe la línea, es decir, el contenido de cada celda debe ser lo suficientemente corto .
A continuación, hay dos ejemplos simples de solución CSS pura que creé en el momento en que respondí esta pregunta.
Aquí está la jsFiddle Demo v2 .
Versión anterior: jsFiddle Demo v1
fuente
display: block
usted suelta propiedades de mesa como el ancho de la columna compartida entre la culata en T y tbody. Sé que ha solucionado esto configurando,width: 19.2%
pero en caso de que no sepamos el ancho de cada columna de antemano, esto no funcionará.height: 100%
(cuando quiere que la tabla se expanda al final de la página).ng-repeat
tablas AngularJS . No estoy seguro de por qué hay todas esas bibliotecas con encabezados de tabla fijos y qué no cuando existe esta solución.box-sizing
propiedad para que tener bordes de dos grosores diferentes no altere la alineación de la columna.En la siguiente solución, la tabla ocupa el 100% del contenedor principal, no se requieren tamaños absolutos. Es puro CSS, se utiliza diseño flexible.
Así es como se ve:
Posibles desventajas:
HTML (acortado):
CSS, con algunas decoraciones omitidas por claridad:
código completo en jsfiddle
Mismo código en MENOS para que pueda mezclarlo en:
fuente
td
debería ayudarEn los navegadores modernos, simplemente puede usar css:
fuente
<table>
con<div>
lo que tieneoverflow-y: auto;
y algomax-height
. Por ejemplo:<div style="overflow-y: auto; max-height: 400px;"><table>...</table></div>
Estoy usando
display:block
parathead
ytbody
. Por eso, el ancho de lasthead
columnas es diferente del ancho de lastbody
columnas.Para solucionar esto, uso un
jQuery
código pequeño pero solo se puede hacerJavaScript
.Aquí está mi demo de trabajo: http://jsfiddle.net/gavroche/N7LEF/
No funciona en IE 8
Mostrar fragmento de código
fuente
colNumber
variable podría ser reemplazada por un código que itera a través de las celdas reales encontradas en su lugar, y tenga en cuenta que no funciona correctamente si hay algunacolspan
s (también podría mejorarse en el código, si es necesario, pero poco probable en el tipo de tabla que probablemente desee esta función de desplazamiento).Solo CSS
para Chrome, Firefox, Edge (y otros navegadores de hoja perenne )
Simplemente
position: sticky; top: 0;
tusth
elementos:PD: si necesita bordes para elementos TH
th {box-shadow: 1px 1px 0 #000; border-top: 0;}
, ayudará (ya que los bordes predeterminados no están pintados correctamente en el desplazamiento).Para una variante de lo anterior que usa solo un poco de JS para acomodar IE11, vea esta respuesta https://stackoverflow.com/a/47923622/383904
fuente
separate
estás agregando aceite al fuego. jsfiddle.net/RokoCB/o0zL4xyw y vea una solución AQUÍ: agregue bordes a TH fijo - Soy bienvenido para sugerencias de OFC si me perdí algo.Cree dos tablas una tras otra, coloque la segunda tabla en un div de altura fija y configure la propiedad de desbordamiento en auto. También mantenga vacíos todos los td's dentro de la pantalla en la segunda tabla.
fuente
Finalmente lo entendí bien con CSS puro siguiendo estas instrucciones:
http://tjvantoll.com/2012/11/10/creating-cross-browser-scrollable-tbody/
El primer paso es configurar el
<tbody>
bloque de visualización: para que se pueda aplicar un desbordamiento y altura. A partir de ahí, las filas<thead>
deben establecerse en position: relative y display: block para que se asienten sobre el ahora desplazable<tbody>
.tbody, thead { display: block; overflow-y: auto; }
Debido a que
<thead>
está relativamente posicionada, cada celda de la tabla necesita un ancho explícitoPero desafortunadamente eso no es suficiente. Cuando una barra de desplazamiento está presente, los navegadores le asignan espacio, por lo tanto, el
<tbody>
final tiene menos espacio disponible que el<thead>
. Observe la ligera desalineación que esto crea ...La única solución que se me ocurrió fue establecer un ancho mínimo en todas las columnas, excepto en la última.
Ejemplo de codepen completo a continuación:
CSS:
HTML:
EDITAR: Solución alternativa para el ancho de la tabla al 100% (el anterior es en realidad para el ancho fijo y no respondió la pregunta):
HTML:
CSS:
Demostración: http://codepen.io/anon/pen/bNJeLO
fuente
Solución CSS para forzar a las columnas a mostrarse correctamente con un cuerpo de 'bloque'
Esta solución todavía requiere que
th
jQuery calcule y establezca los anchos.Y el Jquery / Javascript
fuente
prueba a continuación, muy simple, fácil de implementar
A continuación se muestra el enlace jsfiddle
http://jsfiddle.net/v2t2k8ke/2/
HTML:
CSS:
Jquery:
fuente
Agregando un ancho fijo a td, th después de hacer que tbody & thead display block funcione perfectamente y también podemos usar el complemento slimscroll para hacer que la barra de desplazamiento sea hermosa.
fuente
Este es el código que me funciona para crear un thead adhesivo en una mesa con un cuerpo desplazable:
fuente
Para usar "overflow: scroll" debe establecer "display: block" en thead y tbody. Y eso ensucia los anchos de columna entre ellos. Pero luego puede clonar la fila thead con Javascript y pegarla en el cuerpo como una fila oculta para mantener el ancho exacto de la columna.
http://jsfiddle.net/Julesezaar/mup0c5hk/
El css:
fuente
Prueba este jsfiddle . Esto está usando jQuery y está hecho de la respuesta de Hashem Qolami. Al principio, haz una tabla normal y luego hazla desplazable.
fuente