with vertical una tbody tabla poner horizontal hacer fija con como bootstrap html css scroll html-table overflow

vertical - Cómo mostrar la barra de desplazamiento en una tabla html



table with scroll on tbody (6)

Estoy escribiendo una página donde necesito una tabla html para mantener un tamaño establecido. Necesito los encabezados en la parte superior de la tabla para permanecer allí en todo momento, pero también necesito el cuerpo de la tabla para desplazarme sin importar cuántas filas se agreguen a la tabla.

Quiero que se vea como el método 2 en esta url: http://www.cssplay.co.uk/menu/tablescroll.html

He intentado hacer esto pero no aparece la barra de desplazamiento:

<table border=1 id="qandatbl" align="center"> <tr> <th class="col1">Question No</th> <th class="col2">Option Type</th> <th class="col1">Duration</th> </tr> <tbody> <tr> <td class=''qid''></td> <td class="options"></td> <td class="duration"></td> </tr> </tbody> </table>

CSS:

tbody { height:80em; overflow:scroll; }


¿Algo como esto?

http://jsfiddle.net/TweNm/

La idea es envolver la <table> en un <div> no estáticamente ubicado que tiene una propiedad overflow:auto CSS. Luego coloque los elementos en el <thead> absolutamente.

HTML

<div id="table-wrapper"> <div id="table-scroll"> <table> <thead> <tr> <th><span class="text">A</span></th> <th><span class="text">B</span></th> <th><span class="text">C</span></th> </tr> </thead> <tbody> <tr> <td>1, 0</td> <td>2, 0</td> <td>3, 0</td> </tr> <tr> <td>1, 1</td> <td>2, 1</td> <td>3, 1</td> </tr> <tr> <td>1, 2</td> <td>2, 2</td> <td>3, 2</td> </tr> <tr> <td>1, 3</td> <td>2, 3</td> <td>3, 3</td> </tr> <tr> <td>1, 4</td> <td>2, 4</td> <td>3, 4</td> </tr> <tr> <td>1, 5</td> <td>2, 5</td> <td>3, 5</td> </tr> <tr> <td>1, 6</td> <td>2, 6</td> <td>3, 6</td> </tr> <tr> <td>1, 7</td> <td>2, 7</td> <td>3, 7</td> </tr> <tr> <td>1, 8</td> <td>2, 8</td> <td>3, 8</td> </tr> <tr> <td>1, 9</td> <td>2, 9</td> <td>3, 9</td> </tr> <tr> <td>1, 10</td> <td>2, 10</td> <td>3, 10</td> </tr> <!-- etc... --> <tr> <td>1, 99</td> <td>2, 99</td> <td>3, 99</td> </tr> </tbody> </table> </div> </div>

CSS

#table-wrapper { position:relative; } #table-scroll { height:150px; overflow:auto; margin-top:20px; } #table-wrapper table { width:100%; } #table-wrapper table * { background:yellow; color:black; } #table-wrapper table thead th .text { position:absolute; top:-20px; z-index:2; height:20px; width:35%; border:1px solid red; }


Cabe destacar que, dependiendo de su propósito (el mío fue el resultado de la autocomplementación de una barra de búsqueda), es posible que desee que la altura sea modificable y que la barra de desplazamiento solo exista si la altura excede esa altura.

Si quieres eso, reemplaza la height: x; con max-height: x; y overflow:scroll con overflow:auto .

Además, puede usar overflow-x y overflow-y si lo desea, y obviamente lo mismo funciona horizontalmente con width : x;


La respuesta aceptada proporcionó un buen punto de partida, pero si cambia el tamaño del marco, cambia el ancho de las columnas o incluso cambia los datos de la tabla, los encabezados se desordenarán de varias maneras. Cada otro ejemplo que he visto tiene problemas similares, o impone algunas restricciones serias en el diseño de la tabla.

Sin embargo, creo que finalmente resolví todos estos problemas. Tomó mucho CSS, pero el producto final es tan confiable y fácil de usar como una tabla normal.

Aquí hay un ejemplo que tiene todas las características requeridas para replicar la tabla a la que hace referencia el OP: jsFiddle

Los colores y los bordes tendrían que cambiarse para que sean idénticos a la referencia. La información sobre cómo hacer ese tipo de cambios se proporciona en los comentarios de CSS.

Aquí está el código:

/*the following html and body rule sets are required only if using a % width or height*/ /*html { width: 100%; height: 100%; }*/ body { box-sizing: border-box; width: 100%; height: 100%; margin: 0; padding: 0 20px 0 20px; text-align: center; background: white; } .scrollingtable { box-sizing: border-box; display: inline-block; vertical-align: middle; overflow: hidden; width: auto; /*if you want a fixed width, set it here, else set to auto*/ min-width: 0/*100%*/; /*if you want a % width, set it here, else set to 0*/ height: 188px/*100%*/; /*set table height here; can be fixed value or %*/ min-height: 0/*104px*/; /*if using % height, make this large enough to fit scrollbar arrows + caption + thead*/ font-family: Verdana, Tahoma, sans-serif; font-size: 15px; line-height: 20px; padding: 20px 0 20px 0; /*need enough padding to make room for caption*/ text-align: left; } .scrollingtable * {box-sizing: border-box;} .scrollingtable > div { position: relative; border-top: 1px solid black; height: 100%; padding-top: 20px; /*this determines column header height*/ } .scrollingtable > div:before { top: 0; background: cornflowerblue; /*header row background color*/ } .scrollingtable > div:before, .scrollingtable > div > div:after { content: ""; position: absolute; z-index: -1; width: 100%; height: 100%; left: 0; } .scrollingtable > div > div { min-height: 0/*43px*/; /*if using % height, make this large enough to fit scrollbar arrows*/ max-height: 100%; overflow: scroll/*auto*/; /*set to auto if using fixed or % width; else scroll*/ overflow-x: hidden; border: 1px solid black; /*border around table body*/ } .scrollingtable > div > div:after {background: white;} /*match page background color*/ .scrollingtable > div > div > table { width: 100%; border-spacing: 0; margin-top: -20px; /*inverse of column header height*/ /*margin-right: 17px;*/ /*uncomment if using % width*/ } .scrollingtable > div > div > table > caption { position: absolute; top: -20px; /*inverse of caption height*/ margin-top: -1px; /*inverse of border-width*/ width: 100%; font-weight: bold; text-align: center; } .scrollingtable > div > div > table > * > tr > * {padding: 0;} .scrollingtable > div > div > table > thead { vertical-align: bottom; white-space: nowrap; text-align: center; } .scrollingtable > div > div > table > thead > tr > * > div { display: inline-block; padding: 0 6px 0 6px; /*header cell padding*/ } .scrollingtable > div > div > table > thead > tr > :first-child:before { content: ""; position: absolute; top: 0; left: 0; height: 20px; /*match column header height*/ border-left: 1px solid black; /*leftmost header border*/ } .scrollingtable > div > div > table > thead > tr > * > div[label]:before, .scrollingtable > div > div > table > thead > tr > * > div > div:first-child, .scrollingtable > div > div > table > thead > tr > * + :before { position: absolute; top: 0; white-space: pre-wrap; color: white; /*header row font color*/ } .scrollingtable > div > div > table > thead > tr > * > div[label]:before, .scrollingtable > div > div > table > thead > tr > * > div[label]:after {content: attr(label);} .scrollingtable > div > div > table > thead > tr > * + :before { content: ""; display: block; min-height: 20px; /*match column header height*/ padding-top: 1px; border-left: 1px solid black; /*borders between header cells*/ } .scrollingtable .scrollbarhead {float: right;} .scrollingtable .scrollbarhead:before { position: absolute; width: 100px; top: -1px; /*inverse border-width*/ background: white; /*match page background color*/ } .scrollingtable > div > div > table > tbody > tr:after { content: ""; display: table-cell; position: relative; padding: 0; border-top: 1px solid black; top: -1px; /*inverse of border width*/ } .scrollingtable > div > div > table > tbody {vertical-align: top;} .scrollingtable > div > div > table > tbody > tr {background: white;} .scrollingtable > div > div > table > tbody > tr > * { border-bottom: 1px solid black; padding: 0 6px 0 6px; height: 20px; /*match column header height*/ } .scrollingtable > div > div > table > tbody:last-of-type > tr:last-child > * {border-bottom: none;} .scrollingtable > div > div > table > tbody > tr:nth-child(even) {background: gainsboro;} /*alternate row color*/ .scrollingtable > div > div > table > tbody > tr > * + * {border-left: 1px solid black;} /*borders between body cells*/

<div class="scrollingtable"> <div> <div> <table> <caption>Top Caption</caption> <thead> <tr> <th><div label="Column 1"></div></th> <th><div label="Column 2"></div></th> <th><div label="Column 3"></div></th> <th> <!--more versatile way of doing column label; requires 2 identical copies of label--> <div><div>Column 4</div><div>Column 4</div></div> </th> <th class="scrollbarhead"/> <!--ALWAYS ADD THIS EXTRA CELL AT END OF HEADER ROW--> </tr> </thead> <tbody> <tr><td>Lorem ipsum</td><td>Dolor</td><td>Sit</td><td>Amet consectetur</td></tr> <tr><td>Lorem ipsum</td><td>Dolor</td><td>Sit</td><td>Amet consectetur</td></tr> <tr><td>Lorem ipsum</td><td>Dolor</td><td>Sit</td><td>Amet consectetur</td></tr> <tr><td>Lorem ipsum</td><td>Dolor</td><td>Sit</td><td>Amet consectetur</td></tr> <tr><td>Lorem ipsum</td><td>Dolor</td><td>Sit</td><td>Amet consectetur</td></tr> <tr><td>Lorem ipsum</td><td>Dolor</td><td>Sit</td><td>Amet consectetur</td></tr> <tr><td>Lorem ipsum</td><td>Dolor</td><td>Sit</td><td>Amet consectetur</td></tr> <tr><td>Lorem ipsum</td><td>Dolor</td><td>Sit</td><td>Amet consectetur</td></tr> <tr><td>Lorem ipsum</td><td>Dolor</td><td>Sit</td><td>Amet consectetur</td></tr> <tr><td>Lorem ipsum</td><td>Dolor</td><td>Sit</td><td>Amet consectetur</td></tr> <tr><td>Lorem ipsum</td><td>Dolor</td><td>Sit</td><td>Amet consectetur</td></tr> <tr><td>Lorem ipsum</td><td>Dolor</td><td>Sit</td><td>Amet consectetur</td></tr> </tbody> </table> </div> Faux bottom caption </div> </div> <!--[if lte IE 9]><style>.scrollingtable > div > div > table {margin-right: 17px;}</style><![endif]-->


Si se pone duro cuando todas las soluciones mencionadas no funcionan (como me pasó a mí), haz esto:

  • Crea dos tablas. Uno para el encabezado y otro para el cuerpo
  • Proporcione a las dos tablas diferentes contenedores / div principales
  • Estilice el div de la segunda tabla para permitir el desplazamiento vertical de su contenido.

Así, en tu HTML

<div class="table-header-class"> <table> <thead> <tr> <th>Ava</th> <th>Alexis</th> <th>Mcclure</th> </tr> </thead> </table> </div> <div class="table-content-class"> <table> <tbody> <tr> <td>I am the boss</td> <td>No, da-da is not the boss!</td> <td>Alexis, I am the boss, right?</td> </tr> </tbody> </table> </div>

A continuación, diseñe el elemento primario de la segunda tabla para permitir el desplazamiento vertical, en su CSS

.table-content-class { overflow-y: scroll; // use auto; or scroll; to allow vertical scrolling; overflow-x: hidden; // disable horizontal scroll }


Tienes que insertar tu tabla en un div que tenga un tamaño fijo, y en el estilo div tienes que configurar el desbordamiento: scroll.


Tuve el mismo problema que tú.

Lo resolví por separado a 2 tablas.

Una tabla es la fila del encabezado.

Los segundos también son etiqueta <table> , pero envueltos por <div> con altura estática y desplazamiento de desbordamiento.