首页 文章

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

提问于
浏览
324

如何设置 <table> 100%宽度并仅在 <tbody> 垂直滚动内放置一些高度?

vertical scroll inside 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表格中的更多内容在100%宽度下工作得不好,只有px中的固定宽度 .

10 回答

  • 567

    这个代码对我来说可以在一个带有可滚动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;
    }
    
  • 8

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

    由于我们更改了 tbodydisplay 属性,因此我们应该更改 thead 元素的该属性,以防止破坏表格布局 .

    所以我们有:

    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 列的宽度,并通过JavaScript将相应的值应用于 thead 列 .

    自动宽度列

    这是上面逻辑的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上):

    vertical scroll inside tbody

    WORKING DEMO .

    全宽表,相对宽度列

    由于原始海报需要,我们可以将 table 扩展到其容器的 width 的100%,然后为表的每列使用相对(百分比) width .

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

    由于表有一个(有点) fluid layout ,我们应该在容器调整大小时调整 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
    

    输出将是:

    Fluid Table with vertical scroll inside tbody

    WORKING DEMO .


    浏览器支持和替代方案

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

    但是,doesn't work properly on IE9及以下 .

    那是因为 in a table layout, all elements should follow the same structural properties.

    通过将 display: block; 用于 <thead><tbody> 元素,我们打破了表结构 .

    通过JavaScript重新设计布局

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

    例如,看看以下示例:

    • jQuery .floatThead() 插件(浮动/锁定/粘性表头插件)

    • jQuery Scrollable Table 插件 . (source code在github上)

    • jQuery .FixedHeaderTable() 插件(source code在github上)

    • DataTables vertical scrolling 示例 .

    嵌套表

    此方法使用两个嵌套表,其中包含div . 第一个 table 只有一个单元格有 div ,第二个表格放在 div 元素内 .

    检查CSS Play上的Vertical scrolling tables .

    这适用于大多数Web浏览器 . 我们也可以通过JavaScript动态地完成上述逻辑 .

    滚动时带有固定 Headers 的表格

    由于将垂直滚动条添加到 <tbody> 的目的是在每行的顶部显示表 header ,我们可以 position thead 元素保留 fixed 在屏幕顶部 .

    这是 Julien 执行的这种方法的 Working Demo .
    它有一个很有前途的Web浏览器支持 .

    here pure CSS 实施Willem Van Bockstal .


    纯CSS解决方案

    这是旧答案 . 当然我添加了一个新方法并改进了CSS声明 .

    具有固定宽度的表

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

    每列应具有特定宽度, thead 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 */
    }
    

    这是输出:

    Table with Fixed Width

    WORKING DEMO .

    表宽度为100%

    在此方法中, table 的宽度为 100% ,对于每个 thtdwidth 属性的值应小于 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;
    }
    

    这是 Online Demo .

    Note: 如果每列的内容打破了这一行,则该方法将为 fail ,即 the content of each cell should be short enough .


    在下面,有两个简单的纯CSS解决方案示例,我在回答这个问题时创建了它 .

    这是 jsFiddle Demo v2 .

    旧版本: jsFiddle Demo v1

  • 15

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

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

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

    以下是它的外观:
    enter image description here

    可能的缺点:

    • 垂直滚动条始终可见,无论是否需要;

    • 表格布局是固定的 - 列不会根据内容宽度调整大小(您仍然可以设置您想要的任何列宽度);

    • 有一个绝对大小 - 滚动条的宽度,对于我能够检查的浏览器大约是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;
    }
    

    full code on 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%;
        }
      }
    }
    
  • 12

    在制作 tbodythead 显示块后,为 td,th 添加固定宽度可以很好地工作,我们也可以使用slimscroll插件使滚动条漂亮 .

    enter image description here

    <!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>
    
  • 6

    尝试以下方法, very simple easy to implement

    下面是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

    按照以下说明,我最终使用纯CSS获得了它:

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

    第一步是将 <tbody> 设置为display:block,以便可以应用溢出和高度 . 从那里, <thead> 中的行需要设置为position:relative和display:block,以便它们位于现在可滚动的 <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

  • 2

    Css解决方法强制列使用'block'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
    
  • 1

    我正在使用 display:block 表示 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中不起作用

    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);           
      }
    
    table {margin:0 auto; border-collapse:separate;}
     thead {background:#CCCCCC;display:block}
     tbody {height:10em;overflow-y:scroll;display:block}
    
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <table id="myTable" border="1">
        <thead>
            <tr>
                <th>A really Very Long Header Text</th>
                <th>Normal Header</th>
                <th>Short</th>            
            </tr>    
        </thead>
        <tbody>
            <tr>
                <td>
                    Text shorter than header
                </td>
                <td>
                    Text is longer than header
                </td>
                <td>
                    Exact
                </td>
            </tr>
            <tr>
                <td>
                    Text shorter than header
                </td>
                <td>
                    Text is longer than header
                </td>
                <td>
                    Exact
                </td>
            </tr>
            <tr>
                <td>
                    Text shorter than header
                </td>
                <td>
                    Text is longer than header
                </td>
                <td>
                    Exact
                </td>
            </tr>
            <tr>
                <td>
                    Text shorter than header
                </td>
                <td>
                    Text is longer than header
                </td>
                <td>
                    Exact
                </td>
            </tr>
            <tr>
                <td>
                    Text shorter than header
                </td>
                <td>
                    Text is longer than header
                </td>
                <td>
                    Exact
                </td>
            </tr>
            <tr>
                <td>
                    Text shorter than header
                </td>
                <td>
                    Text is longer than header
                </td>
                <td>
                    Exact
                </td>
            </tr>
            <tr>
                <td>
                    Text shorter than header
                </td>
                <td>
                    Text is longer than header
                </td>
                <td>
                    Exact
                </td>
            </tr>
            <tr>
                <td>
                    Text shorter than header
                </td>
                <td>
                    Text is longer than header
                </td>
                <td>
                    Exact
                </td>
            </tr>
            <tr>
                <td>
                    Text shorter than header
                </td>
                <td>
                    Text is longer than header
                </td>
                <td>
                    Exact
                </td>
            </tr>
            <tr>
                <td>
                    Text shorter than header
                </td>
                <td>
                    Text is longer than header
                </td>
                <td>
                    Exact
                </td>
            </tr>
            <tr>
                <td>
                    Text shorter than header
                </td>
                <td>
                    Text is longer than header
                </td>
                <td>
                    Exact
                </td>
            </tr>
        </tbody>
    </table>
    
  • 0

    依次创建两个表,将第二个表放在固定高度的div中,并将overflow属性设置为auto . 同时将第二个表中的所有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>
    

相关问题