HTML表格的宽度为100%,在tbody中具有垂直滚动


423

如何设置<table>100%的宽度并仅在<tbody>垂直滚动条中放置一定的高度?

体内垂直滚动

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>

我想避免添加一些额外的div,我想要的只是这样的简单表,并且当我尝试更改显示时table-layoutposition以及CSS表中的更多内容仅在以px为固定宽度的情况下不能100%地正常工作。


我不是很确定你想要实现什么。看一下这个:jsfiddle.net/CrSpu并告诉您希望它如何表现
x4rf41 2013年

2
我知道,但是看起来.. th和td未显示完整宽度。.postimg.org/image/mgd630y61
Marko S


Answers:


674

为了使<tbody>元素可滚动,我们需要更改元素在页面上的显示方式,即使用display: block;将其显示为块级元素。

由于我们改变了 display属性tbody,因此我们应该将该属性更改为thead element的以防止破坏表布局。

因此,我们有:

thead, tbody { display: block; }

tbody {
    height: 100px;       /* Just for the demo          */
    overflow-y: auto;    /* Trigger vertical scroll    */
    overflow-x: hidden;  /* Hide the horizontal scroll */
}

Web浏览器将theadtbody元素显示为行组table-header-grouptable-row-group默认情况下,)。

一旦我们改变了,内部 tr元素将无法填充其容器的整个空间。

为了解决这个问题,我们必须计算tbody列的宽度并将相应的值应用于thead通过JavaScript列。

自动宽度列

这是上述逻辑的jQuery版本:

// Change the selector if needed
var $table = $('table'),
    $bodyCells = $table.find('tbody tr:first').children(),
    colWidth;

// Get the tbody columns width array
colWidth = $bodyCells.map(function() {
    return $(this).width();
}).get();

// Set the width of thead columns
$table.find('thead tr').children().each(function(i, v) {
    $(v).width(colWidth[i]);
});    

这是输出(在Windows 7 Chrome 32上)

体内垂直滚动

工作演示

全宽表,相对宽度列

根据原始海报的需要,我们可以将其扩大tablewidth其容器的100%,然后对表的每一列使用相对值(Percentagewidth

table {
    width: 100%; /* Optional */
}

tbody td, thead th {
    width: 20%;  /* Optional */
}

由于表格具有(某种)流体布局,因此在调整thead容器大小时,我们应该调整列的宽度。

因此,一旦调整窗口大小,我们应该设置列的宽度:

// Adjust the width of thead cells when *window* resizes
$(window).resize(function() {
    /* Same as before */ 
}).resize(); // Trigger the resize handler once the script runs

输出为:

机身内部带有垂直滚动的流体工作台

工作演示


浏览器支持和替代

我已经通过新版本的主要Web浏览器(包括IE10 +)在Windows 7上测试了上述两种方法,并且该方法有效。

但是,它 工作 正常 上IE9及以下。

这是因为表格布局中,所有元素都应遵循相同的结构属性。

通过使用display: block;<thead><tbody>元素,我们把这个表结构。

通过JavaScript重新设计布局

一种方法是重新设计(整个)表布局。使用JavaScript动态创建新的布局并处理和/或动态调整单元格的宽度/高度。

例如,看下面的例子:

嵌套表

这种方法使用两个包含一个div的嵌套表。第一个表table只有一个具有的单元格,div第二个表位于该div元素内。

CSS Play上检查Vertical滚动表

这适用于大多数Web浏览器。我们还可以通过JavaScript动态地执行上述逻辑。

具有固定标题的表格滚动

由于向中添加垂直滚动条的目的<tbody>是在每行顶部显示表格标题,因此我们可以将元素定位theadfixed在屏幕代替的顶部。

这是Julien进行的这种方法的工作演示。 它具有有前途的Web浏览器支持。

而且在这里一个纯CSS通过实施威廉·Bockstal


纯CSS解决方案

这是旧答案。当然,我添加了一个新方法并完善了CSS声明。

固定宽度桌

在这种情况下,table应该具有固定的值width (包括列宽和垂直滚动条的宽度之和)

应具有特定的宽度,元素的最后一列thead需要更大的宽度,该宽度等于其他列的宽度 + 垂直滚动条的宽度

因此,CSS将为:

table {
    width: 716px; /* 140px * 5 column + 16px scrollbar width */
    border-spacing: 0;
}

tbody, thead tr { display: block; }

tbody {
    height: 100px;
    overflow-y: auto;
    overflow-x: hidden;
}

tbody td, thead th {
    width: 140px;
}

thead th:last-child {
    width: 156px; /* 140px + 16px scrollbar width */
}

这是输出:

固定宽度桌

工作演示

宽度为100%的桌子

在这种方法中,每个table的宽度为100%th且属性td的值width应小于100% / number of cols

此外,我们需要减少宽度thead作为的值宽度垂直滚动条。

为此,我们需要使用CSS3 calc()函数,如下所示:

table {
    width: 100%;
    border-spacing: 0;
}

thead, tbody, tr, th, td { display: block; }

thead tr {
    /* fallback */
    width: 97%;
    /* minus scroll bar width */
    width: -webkit-calc(100% - 16px);
    width:    -moz-calc(100% - 16px);
    width:         calc(100% - 16px);
}

tr:after {  /* clearing float */
    content: ' ';
    display: block;
    visibility: hidden;
    clear: both;
}

tbody {
    height: 100px;
    overflow-y: auto;
    overflow-x: hidden;
}

tbody td, thead th {
    width: 19%;  /* 19% is less than (100% / 5 cols) = 20% */
    float: left;
}

这是在线演示

注意:如果每列的内容都使行中断,则该方法将失败,即,每个单元格的内容应足够短


在下面,有两个简单的纯CSS解决方案示例,它们是我在回答此问题时创建的。

这是jsFiddle Demo v2

旧版本:jsFiddle Demo v1


17
display: block您松散表的属性时,thead和tbody之间将共享列的宽度。我知道您已通过设置解决了此问题,width: 19.2%但是如果我们事先不知道每列的宽度,则将无法使用。
2014年

10
此代码似乎假定主体单元格始终比标题单元格宽。
亚当·多纳休

2
何时height: 100%(当您希望表格扩展到页面底部时)不起作用。
2015年

2
AngularJS ng-repeat表也可以很好地工作。不确定为什么所有这些库都具有固定的表头,如果有此解决方案,为什么不行。
chakeda '16

2
您可以使用该box-sizing属性对此进行更多改进,以使具有两个不同厚度的边框不会影响列对齐。
里卡

89

在下面的解决方案中,表占据了父容器的100%,不需要绝对大小。它是纯CSS,使用了flex布局。

外观如下: 在此处输入图片说明

可能的缺点:

  • 垂直滚动条始终可见,无论是否需要;
  • 表布局是固定的-列不会根据内容宽度调整大小(您仍然可以显式设置所需的任何列宽度);
  • 有一个绝对大小-滚动条的宽度,对于我能够检查的浏览器来说大约是0.9em。

HTML(缩短):

<div class="table-container">
    <table>
        <thead>
            <tr>
                <th>head1</th>
                <th>head2</th>
                <th>head3</th>
                <th>head4</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>content1</td>
                <td>content2</td>
                <td>content3</td>
                <td>content4</td>
            </tr>
            <tr>
                <td>content1</td>
                <td>content2</td>
                <td>content3</td>
                <td>content4</td>
            </tr>
            ...
        </tbody>
    </table>
</div>

CSS,为清楚起见,省略了一些装饰:

.table-container {
    height: 10em;
}
table {
    display: flex;
    flex-flow: column;
    height: 100%;
    width: 100%;
}
table thead {
    /* head takes the height it requires, 
    and it's not scaled when table is resized */
    flex: 0 0 auto;
    width: calc(100% - 0.9em);
}
table tbody {
    /* body takes all the remaining available space */
    flex: 1 1 auto;
    display: block;
    overflow-y: scroll;
}
table tbody tr {
    width: 100%;
}
table thead, table tbody tr {
    display: table;
    table-layout: fixed;
}

jsfiddle上的完整代码

LESS中的相同代码,因此您可以将其混合使用:

.table-scrollable() {
  @scrollbar-width: 0.9em;
  display: flex;
  flex-flow: column;

  thead,
  tbody tr {
    display: table;
    table-layout: fixed;
  }

  thead {
    flex: 0 0 auto;
    width: ~"calc(100% - @{scrollbar-width})";
  }

  tbody {
    display: block;
    flex: 1 1 auto;
    overflow-y: scroll;

    tr {
      width: 100%;
    }
  }
}

2
感谢您的解决方案!有一个小错误。。。您为thead设置了两次宽度,我发现从宽度线中减去1.05em会更好一点:jsfiddle.net/xuvsncr2/170
TigerBear 2015年

1
字符的内容数量如何?在行单元格中添加更多字符或单词时会弄乱
Limon

我认为制定一些合适的包装政策td应该会有所帮助
tsayen

任何类似的解决方案,但都不需要100%的宽度?
亚历山德拉·佩雷拉·努内斯

2
@tsayen调整窗口大小时,如何阻止它放大和重叠?
clearshot66

31

在现代浏览器中,您可以简单地使用css:

th {
  position: sticky;
  top: 0;
  z-index: 2;
}

8
这个咒语是不完整的...愿意举一个例子,或者至少是详尽的?
利亚姆'18

工作良好,但仅适用于 如果我们将位置设置为固定在广告上,则它将不起作用。
维沙尔18'Feb

固定thead应该添加到W3C中!
sonichy

2
当您<table><div>has overflow-y: auto;和some 包装时,此答案有效max-height。例如:<div style="overflow-y: auto; max-height: 400px;"><table>...</table></div>
Minwork

从2020年开始,这将是选定的答案(以及@Minwork的更新)
Christophe Vidal

18

我正在使用display:blockfor theadtbody。因此,thead列的宽度不同于列的宽度tbody

table {
    margin:0 auto; 
    border-collapse:collapse;
}
thead {
    background:#CCCCCC;
    display:block
}
tbody {
    height:10em;overflow-y:scroll;
    display:block
}

为了解决这个问题,我使用了小的jQuery代码,但是只能用它完成JavaScript

var colNumber=3 //number of table columns    

for (var i=0; i<colNumber; i++) {
  var thWidth=$("#myTable").find("th:eq("+i+")").width();
  var tdWidth=$("#myTable").find("td:eq("+i+")").width();      
  if (thWidth<tdWidth)                    
      $("#myTable").find("th:eq("+i+")").width(tdWidth);
  else
      $("#myTable").find("td:eq("+i+")").width(thWidth);           
}  

这是我的工作演示: http //jsfiddle.net/gavroche/N7LEF/

在IE 8中不起作用


这是我发现的最佳/最简单的解决方案,它允许使用非固定的列宽(例如.NET DataGrid控件)。对于“生产”,该colNumber变量可以用代码代替,该代码将对找到的实际单元格进行迭代,并且注意,如果有任何变量,它将无法正确处理colspan(如果需要,也可以在代码中进行改进,但在类型上不太可能表可能需要此滚动功能)。
JonBrave 2014年

这可以(以某种方式)起作用,但是当窗口的大小小于表格的大小时(因为它忽略了滚动条的宽度),因此无法应对。
Gone Coding

是的,如果您将表格宽度限制为设定的宽度,则标题和单元格将不再匹配
Craig

最佳答案,也是最简单的答案
Charles Okwuagwu

18

仅CSS

适用于Chrome,Firefox,Edge(和其他常绿浏览器)

只是position: sticky; top: 0;您的th元素:

/* Fix table head */
.tableFixHead    { overflow-y: auto; height: 100px; }
.tableFixHead th { position: sticky; top: 0; }

/* Just common table stuff. */
table  { border-collapse: collapse; width: 100%; }
th, td { padding: 8px 16px; }
th     { background:#eee; }
<div class="tableFixHead">
  <table>
    <thead>
      <tr><th>TH 1</th><th>TH 2</th></tr>
    </thead>
    <tbody>
      <tr><td>A1</td><td>A2</td></tr>
      <tr><td>B1</td><td>B2</td></tr>
      <tr><td>C1</td><td>C2</td></tr>
      <tr><td>D1</td><td>D2</td></tr>
      <tr><td>E1</td><td>E2</td></tr>
    </tbody>
  </table>
</div>

PS:如果需要TH元素的边框th {box-shadow: 1px 1px 0 #000; border-top: 0;}则将有所帮助(因为默认边框在滚动时未正确绘制)。

对于上述仅使用少量JS来适应IE11的变体,请参见以下答案https://stackoverflow.com/a/47923622/383904


如果元素具有边框,则使用“ border-collapse:collapse”会将边框粘贴到正文而不是标题上。为避免此问题,您应该使用“ border-collapse:separate”。请参阅stackoverflow.com/a/53559396
mrod

@mrod在使用separate时要加油。jsfiddle.net/RokoCB/o0zL4xyw并在此处查看解决方案:在固定TH上添加边框 -如果我错过了一些东西,欢迎您提供OFC的建议。
Roko C. Buljan

11

依次创建两个表,将第二个表放置在固定高度的div中,并将overflow属性设置为auto。还要使第二张表中thead内的所有td保持空白。

<div>
    <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>
    </table>
</div>

<div style="max-height:500px;overflow:auto;">
    <table>
        <thead>
            <tr>
                <th></th>
                <th></th>
                <th></th>
                <th></th>
                <th></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>    
</div>

8
在这种情况下,第二个表列不能跟随第一个表的宽度。
kat1330

2
不好!您将丢失两个表上的列的宽度同步。
Zafar

1
要完成此解决方案,我们需要添加@Hashem Qolami脚本(如上所述)以同步化标题列的宽度
Elhay Avichzer

6

通过遵循以下说明,我终于可以使用纯CSS了:

http://tjvantoll.com/2012/11/10/creating-cross-browser-scrollable-tbody/

第一步是将<tbody>display 设置为block,以便可以应用溢出和高度。从那里开始,<thead>需要将行设置为position:relative和display:块,以便它们位于现在可滚动的顶部<tbody>

tbody, thead { display: block; overflow-y: auto; }

由于<thead>相对定位,每个表单元格都需要一个明确的宽度

td:nth-child(1), th:nth-child(1) { width: 100px; }
td:nth-child(2), th:nth-child(2) { width: 100px; }
td:nth-child(3), th:nth-child(3) { width: 100px; }

但是不幸的是,这还不够。因此,当存在滚动条时,浏览器会为其分配空间,<tbody>最终其可用空间少于<thead>。请注意,这会造成轻微的未对准...

我唯一能想到的解决方法是在除最后一个列之外的所有列上设置最小宽度。

td:nth-child(1), th:nth-child(1) { min-width: 100px; }
td:nth-child(2), th:nth-child(2) { min-width: 100px; }
td:nth-child(3), th:nth-child(3) { width: 100px; }

整个codepen示例如下:

CSS:

.fixed_headers {
  width: 750px;
  table-layout: fixed;
  border-collapse: collapse;
}
.fixed_headers th {
  text-decoration: underline;
}
.fixed_headers th,
.fixed_headers td {
  padding: 5px;
  text-align: left;
}
.fixed_headers td:nth-child(1),
.fixed_headers th:nth-child(1) {
  min-width: 200px;
}
.fixed_headers td:nth-child(2),
.fixed_headers th:nth-child(2) {
  min-width: 200px;
}
.fixed_headers td:nth-child(3),
.fixed_headers th:nth-child(3) {
  width: 350px;
}
.fixed_headers thead {
  background-color: #333333;
  color: #fdfdfd;
}
.fixed_headers thead tr {
  display: block;
  position: relative;
}
.fixed_headers tbody {
  display: block;
  overflow: auto;
  width: 100%;
  height: 300px;
}
.fixed_headers tbody tr:nth-child(even) {
  background-color: #dddddd;
}
.old_ie_wrapper {
  height: 300px;
  width: 750px;
  overflow-x: hidden;
  overflow-y: auto;
}
.old_ie_wrapper tbody {
  height: auto;
}

HTML:

<!-- IE < 10 does not like giving a tbody a height.  The workaround here applies the scrolling to a wrapped <div>. -->
<!--[if lte IE 9]>
<div class="old_ie_wrapper">
<!--<![endif]-->

<table class="fixed_headers">
  <thead>
    <tr>
      <th>Name</th>
      <th>Color</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Apple</td>
      <td>Red</td>
      <td>These are red.</td>
    </tr>
    <tr>
      <td>Pear</td>
      <td>Green</td>
      <td>These are green.</td>
    </tr>
    <tr>
      <td>Grape</td>
      <td>Purple / Green</td>
      <td>These are purple and green.</td>
    </tr>
    <tr>
      <td>Orange</td>
      <td>Orange</td>
      <td>These are orange.</td>
    </tr>
    <tr>
      <td>Banana</td>
      <td>Yellow</td>
      <td>These are yellow.</td>
    </tr>
    <tr>
      <td>Kiwi</td>
      <td>Green</td>
      <td>These are green.</td>
    </tr>
    <tr>
      <td>Plum</td>
      <td>Purple</td>
      <td>These are Purple</td>
    </tr>
    <tr>
      <td>Watermelon</td>
      <td>Red</td>
      <td>These are red.</td>
    </tr>
    <tr>
      <td>Tomato</td>
      <td>Red</td>
      <td>These are red.</td>
    </tr>
    <tr>
      <td>Cherry</td>
      <td>Red</td>
      <td>These are red.</td>
    </tr>
    <tr>
      <td>Cantelope</td>
      <td>Orange</td>
      <td>These are orange inside.</td>
    </tr>
    <tr>
      <td>Honeydew</td>
      <td>Green</td>
      <td>These are green inside.</td>
    </tr>
    <tr>
      <td>Papaya</td>
      <td>Green</td>
      <td>These are green.</td>
    </tr>
    <tr>
      <td>Raspberry</td>
      <td>Red</td>
      <td>These are red.</td>
    </tr>
    <tr>
      <td>Blueberry</td>
      <td>Blue</td>
      <td>These are blue.</td>
    </tr>
    <tr>
      <td>Mango</td>
      <td>Orange</td>
      <td>These are orange.</td>
    </tr>
    <tr>
      <td>Passion Fruit</td>
      <td>Green</td>
      <td>These are green.</td>
    </tr>
  </tbody>
</table>

<!--[if lte IE 9]>
</div>
<!--<![endif]-->

编辑:表格宽度为100%的替代解决方案(以上实际上是固定宽度,未回答问题):

HTML:

<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Color</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Apple</td>
      <td>Red</td>
      <td>These are red.</td>
    </tr>
    <tr>
      <td>Pear</td>
      <td>Green</td>
      <td>These are green.</td>
    </tr>
    <tr>
      <td>Grape</td>
      <td>Purple / Green</td>
      <td>These are purple and green.</td>
    </tr>
    <tr>
      <td>Orange</td>
      <td>Orange</td>
      <td>These are orange.</td>
    </tr>
    <tr>
      <td>Banana</td>
      <td>Yellow</td>
      <td>These are yellow.</td>
    </tr>
    <tr>
      <td>Kiwi</td>
      <td>Green</td>
      <td>These are green.</td>
    </tr>
  </tbody>
</table>

CSS:

table {
  width: 100%;
  text-align: left;
  min-width: 610px;
}
tr {
  height: 30px;
  padding-top: 10px
}
tbody { 
  height: 150px; 
  overflow-y: auto;
  overflow-x: hidden;
}
th,td,tr,thead,tbody { display: block; }
td,th { float: left; }
td:nth-child(1),
th:nth-child(1) {
  width: 20%;
}
td:nth-child(2),
th:nth-child(2) {
  width: 20%;
  float: left;
}
td:nth-child(3),
th:nth-child(3) {
  width: 59%;
  float: left;
}
/* some colors */
thead {
  background-color: #333333;
  color: #fdfdfd;
}
table tbody tr:nth-child(even) {
  background-color: #dddddd;
}

演示:http//codepen.io/anon/pen/bNJeLO


1
这个问题特别想要一个100%宽度的表,这是您引用的示例没有做的一件事。
Gone Coding

@TrueBlueAussie很好:D添加了100%宽度的替代解决方案。
MikaelLepistö2015年

您不考虑单元格行内容的经度
Limon

2

CSS变通方法,用于强制列以“块” tbody正确显示

此解决方案仍然需要th由jQuery计算和设置宽度

table.scroll tbody,
table.scroll thead { display: block; }

table.scroll tbody {
    overflow-y: auto;
    overflow-x: hidden;
    max-height: 300px;
}

table.scroll tr {
    display: flex;
}

table.scroll tr > td {
    flex-grow: 1;
    flex-basis: 0;
}

和Jquery / Javascript

var $table = $('#the_table_element'),
    $bodyCells = $table.find('tbody tr:first').children(),
    colWidth;

$table.addClass('scroll');

// Adjust the width of thead cells when window resizes
$(window).resize(function () {

    // Get the tbody columns width array
    colWidth = $bodyCells.map(function () {
        return $(this).width();
    }).get();

    // Set the width of thead columns
    $table.find('thead tr').children().each(function (i, v) {
        $(v).width(colWidth[i]);
    });

}).resize(); // Trigger resize handler

@Craig在2019年,根本不关心IE完全没问题。
Automagisch

2

尝试以下方法,非常简单容易实现

以下是jsfiddle链接

http://jsfiddle.net/v2t2k8ke/2/

HTML:

<table border='1' id='tbl_cnt'>
<thead><tr></tr></thead><tbody></tbody>

CSS:

 #tbl_cnt{
 border-collapse: collapse; width: 100%;word-break:break-all;
 }
 #tbl_cnt thead, #tbl_cnt tbody{
 display: block;
 }
 #tbl_cnt thead tr{
 background-color: #8C8787; text-align: center;width:100%;display:block;
 }
 #tbl_cnt tbody {
 height: 100px;overflow-y: auto;overflow-x: hidden;
 }

jQuery:

 var data = [
    {
    "status":"moving","vehno":"tr544","loc":"bng","dri":"ttt"
    }, {
    "status":"stop","vehno":"tr54","loc":"che", "dri":"ttt"
    },{    "status":"idle","vehno":"yy5499999999999994","loc":"bng","dri":"ttt"
    },{
    "status":"moving","vehno":"tr544","loc":"bng", "dri":"ttt"
    }, {
    "status":"stop","vehno":"tr54","loc":"che","dri":"ttt"
    },{
    "status":"idle","vehno":"yy544","loc":"bng","dri":"ttt"
    }
    ];
   var sth = '';
   $.each(data[0], function (key, value) {
     sth += '<td>' + key + '</td>';
   });
   var stb = '';        
   $.each(data, function (key, value) {
       stb += '<tr>';
       $.each(value, function (key, value) {
       stb += '<td>' + value + '</td>';
       });
       stb += '</tr>';
    });
      $('#tbl_cnt thead tr').append(sth);
      $('#tbl_cnt tbody').append(stb);
      setTimeout(function () {
      var col_cnt=0 
      $.each(data[0], function (key, value) {col_cnt++;});    
      $('#tbl_cnt thead tr').css('width', ($("#tbl_cnt tbody") [0].scrollWidth)+ 'px');
      $('#tbl_cnt thead tr td,#tbl_cnt tbody tr td').css('width',  ($('#tbl_cnt thead tr ').width()/Number(col_cnt)) + 'px');}, 100)

2
该解决方案不能解决窗口宽度小于表格宽度的问题。发生这种情况时,应启用水平滚动。标题也不与数据单元格(Chrome)完全对齐。
Gone Coding

现在不起作用
MrHIDEn

2

在使tbodythead显示块正常工作之后td添加固定宽度,也可以使用slimscroll插件使滚动条美观。

在此处输入图片说明

<!DOCTYPE html>
<html>

<head>
    <title> Scrollable table </title>
    <style>
        body {
            font-family: sans-serif;
            font-size: 0.9em;
        }
        table {
            border-collapse: collapse;
            border-bottom: 1px solid #ddd;
        }
        thead {
            background-color: #333;
            color: #fff;
        }
        thead,tbody {
            display: block;
        }
        th,td {
            padding: 8px 10px;
            border: 1px solid #ddd;
            width: 117px;
            box-sizing: border-box;
        }
        tbody {
            height: 160px;
            overflow-y: scroll
        }
    </style>
</head>

<body>

    <table class="example-table">
        <thead>
            <tr>
                <th> Header 1 </th>
                <th> Header 2 </th>
                <th> Header 3 </th>
                <th> Header 4 </th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td> Row 1- Col 1 </td>
                <td> Row 1- Col 2 </td>
                <td> Row 1- Col 3 </td>
                <td> Row 1- Col 4 </td>
            </tr>
            <tr>
                <td> Row 2- Col 1 </td>
                <td> Row 2- Col 2 </td>
                <td> Row 2- Col 3 </td>
                <td> Row 2- Col 4 </td>
            </tr>
            <tr>
                <td> Row 3- Col 1 </td>
                <td> Row 3- Col 2 </td>
                <td> Row 3- Col 3 </td>
                <td> Row 3- Col 4 </td>
            </tr>
            <tr>
                <td> Row 4- Col 1 </td>
                <td> Row 4- Col 2 </td>
                <td> Row 4- Col 3 </td>
                <td> Row 4- Col 4 </td>
            </tr>
            <tr>
                <td> Row 5- Col 1 </td>
                <td> Row 5- Col 2 </td>
                <td> Row 5- Col 3 </td>
                <td> Row 5- Col 4 </td>
            </tr>
            <tr>
                <td> Row 6- Col 1 </td>
                <td> Row 6- Col 2 </td>
                <td> Row 6- Col 3 </td>
                <td> Row 6- Col 4 </td>
            </tr>
            <tr>
                <td> Row 7- Col 1 </td>
                <td> Row 7- Col 2 </td>
                <td> Row 7- Col 3 </td>
                <td> Row 7- Col 4 </td>
            </tr>
            <tr>
                <td> Row 8- Col 1 </td>
                <td> Row 8- Col 2 </td>
                <td> Row 8- Col 3 </td>
                <td> Row 8- Col 4 </td>
            </tr>
            <tr>
                <td> Row 9- Col 1 </td>
                <td> Row 9- Col 2 </td>
                <td> Row 9- Col 3 </td>
                <td> Row 9- Col 4 </td>
            </tr>
            <tr>
                <td> Row 10- Col 1 </td>
                <td> Row 10- Col 2 </td>
                <td> Row 10- Col 3 </td>
                <td> Row 10- Col 4 </td>
            </tr>
            <tr>
                <td> Row 11- Col 1 </td>
                <td> Row 11- Col 2 </td>
                <td> Row 11- Col 3 </td>
                <td> Row 11- Col 4 </td>
            </tr>
            <tr>
                <td> Row 12- Col 1 </td>
                <td> Row 12- Col 2 </td>
                <td> Row 12- Col 3 </td>
                <td> Row 12- Col 4 </td>
            </tr>
            <tr>
                <td> Row 13- Col 1 </td>
                <td> Row 13- Col 2 </td>
                <td> Row 13- Col 3 </td>
                <td> Row 13- Col 4 </td>
            </tr>
            <tr>
                <td> Row 14- Col 1 </td>
                <td> Row 14- Col 2 </td>
                <td> Row 14- Col 3 </td>
                <td> Row 14- Col 4 </td>
            </tr>
            <tr>
                <td> Row 15- Col 1 </td>
                <td> Row 15- Col 2 </td>
                <td> Row 15- Col 3 </td>
                <td> Row 15- Col 4 </td>
            </tr>
            <tr>
                <td> Row 16- Col 1 </td>
                <td> Row 16- Col 2 </td>
                <td> Row 16- Col 3 </td>
                <td> Row 16- Col 4 </td>
            </tr>
        </tbody>
    </table>


    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jQuery-slimScroll/1.3.8/jquery.slimscroll.min.js"></script>
    <script>
        $('.example-table tbody').slimscroll({
            height: '160px',
            alwaysVisible: true,
            color: '#333'
        })
    </script>
</body>

</html>


1

这是对我有用的代码,用于在带有可滚动tbody的桌子上创建一个粘性thead:

table ,tr td{
    border:1px solid red
}
tbody {
    display:block;
    height:50px;
    overflow:auto;
}
thead, tbody tr {
    display:table;
    width:100%;
    table-layout:fixed;/* even columns width , fix width of table too*/
}
thead {
    width: calc( 100% - 1em )/* scrollbar is average 1em/16px width, remove it from thead width */
}
table {
    width:400px;
}

1

要使用“溢出:滚动”,必须在广告和正文上设置“ display:block”。这就弄乱了它们之间的列宽。但是,您可以使用Javascript复制thead行,并将其作为隐藏行粘贴到tbody中,以保持确切的col宽度。

$('.myTable thead > tr').clone().appendTo('.myTable tbody').addClass('hidden-to-set-col-widths');

http://jsfiddle.net/Julesezaar/mup0c5hk/

<table class="myTable">
    <thead>
        <tr>
            <td>Problem</td>
            <td>Solution</td>
            <td>blah</td>
            <td>derp</td>
        </tr>
    </thead>
    <tbody></tbody>
</table>
<p>
  Some text to here
</p>

CSS:

table {
  background-color: #aaa;
  width: 100%;
}

thead,
tbody {
  display: block; // Necessary to use overflow: scroll
}

tbody {
  background-color: #ddd;
  height: 150px;
  overflow-y: scroll;
}

tbody tr.hidden-to-set-col-widths,
tbody tr.hidden-to-set-col-widths td {
  visibility: hidden;
  height: 0;
  line-height: 0;
  padding-top: 0;
  padding-bottom: 0;
}

td {
  padding: 3px 10px;
}

0

试试这个jsfiddle。这是使用jQuery并由Hashem Qolami的答案完成的。首先,创建一个常规表,然后使其可滚动。

const makeScrollableTable = function (tableSelector, tbodyHeight) {
  let $table = $(tableSelector);
  let $bodyCells = $table.find('tbody tr:first').children();
  let $headCells = $table.find('thead tr:first').children();
  let headColWidth = 0;
  let bodyColWidth = 0;

  headColWidth = $headCells.map(function () {
    return $(this).outerWidth();
  }).get();
  bodyColWidth = $bodyCells.map(function () {
    return $(this).outerWidth();
  }).get();

  $table.find('thead tr').children().each(function (i, v) {
    $(v).css("width", headColWidth[i]+"px");
    $(v).css("min-width", headColWidth[i]+"px");
    $(v).css("max-width", headColWidth[i]+"px");
  });
  $table.find('tbody tr').children().each(function (i, v) {
    $(v).css("width", bodyColWidth[i]+"px");
    $(v).css("min-width", bodyColWidth[i]+"px");
    $(v).css("max-width", bodyColWidth[i]+"px");
  });

  $table.find('thead').css("display", "block");
  $table.find('tbody').css("display", "block");

  $table.find('tbody').css("height", tbodyHeight+"px");
  $table.find('tbody').css("overflow-y", "auto");
  $table.find('tbody').css("overflow-x", "hidden");

};
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.