【问题标题】:Scrollable tbody issue可滚动的 tbody 问题
【发布时间】:2015-02-03 20:04:12
【问题描述】:

:)

我知道这个问题被问了很多,但我尝试了很多解决方案,但无法使其正常工作。

我需要使用固定标题使表格的 tbody 可滚动。

开始我的表是动态构建的并且非常大。 19 列,约 800 行。

首先我使用了 jquery 数据表插件。 表格进入容器后:

var tbl = createFilter('readDataTbl', '', condition);
    $('#tableDiv').empty().append(tbl);

    $('#readDataTbl').dataTable({
        "scrollY": "200px",
        "scrollCollapse": true,
        "paging": false
    });

但这会在 x 中创建一个滚动,并且标题会像这样被冻结:

然后我尝试了如下的css解决方案:

 <style>
        table {
    border-collapse: collapse;
    width: 100%;
}
thead {
    text-align:left;
    display: table;
    float: left;
    width: 100%;
}
thead tr {
    display: table-row;
    width: 100%;
}
tbody {
    display: block;
    height: 120px;
    overflow: auto;
    float: left;
    width: 100%;
}
tbody tr {
    display: table;
    width: 100%;
}
tbody tr {
    height: 18px;
}
tbody td {
    padding:1px 8px;
}
th, td {
    width: 25%;
}

tr:after{   /* IE8 fix */
    content: ".";
    margin-left: -3px; /* to hide the content above tr */ /* not necessary if you are ok with 1px gap */
    visibility: hidden;
}
     </style>

但这只会在 tbody 中造成这样的混乱:

然后我尝试了Here的方法 调整 THs 宽度后: css:

<style>
        thead, tbody { display: block; }

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

js:

var tbl = createFilter('readDataTbl', '', condition);
    $('#tableDiv').empty().append(tbl);

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

    // Get the tbody columns width array
    var 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]);
    });

然后我注意到 TH 的长文本使它们变得更大:

什么可以帮助我实现目标? 考虑在 TH 中插入 div,但不确定..

谢谢! : ]

【问题讨论】:

    标签: javascript jquery css html-table jquery-datatables


    【解决方案1】:

    如果没有一些 javascript,您将无法完美地做到这一点。完成此操作的最佳方法是使用标题的克隆,将其添加到元素,在其上应用固定位置并隐藏原始位置。希望这可以帮助。您可能还需要将每个列的宽度绑定到原始的宽度。

    【讨论】:

      【解决方案2】:

      我认为您可以使用引导 css 和一些表格样式。您可以调整 th 的高度和宽度以获得更好的效果。您还必须计算tbody td, thead th { 的百分比宽度,即如果您有19 列,则为100/19,大约为5%。所以你的列宽会非常小,你需要增加thead th {的高度

              table {
                width: 100%;
              }
              thead,
              tbody,
              tr,
              td,
              th {
                display: block;
              }
              tr:after {
                content: ' ';
                display: block;
                visibility: hidden;
                clear: both;
              }
              thead th {
                height: 50px;
                /*text-align: left;*/
              }
              tbody {
                height: 120px;
                overflow-y: auto;
              }
              thead {
                /* fallback */
              }
              tbody td,
              thead th {
                width: 19.2%;
                float: left;
              }
      <link href="http://netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet" />
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
      <table class="table table-striped">
        <thead>
          <tr>
            <th>Make fg jfdg jfgj fgjfg jfgj fgj fgj g jfgj fgj dfgj fgjfg</th>
            <th>Model</th>
            <th>Color</th>
            <th>Year</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td class="filterable-cell">Fordfghdfg jfdgjfdgj fgj fdgj fgjfgj df</td>
            <td class="filterable-cell">Escort</td>
            <td class="filterable-cell">Blue</td>
            <td class="filterable-cell">2000</td>
          </tr>
          <tr>
            <td class="filterable-cell">Ford</td>
            <td class="filterable-cell">Escort</td>
            <td class="filterable-cell">Blue</td>
            <td class="filterable-cell">2000</td>
          </tr>
          <tr>
            <td class="filterable-cell">Ford</td>
            <td class="filterable-cell">Escort</td>
            <td class="filterable-cell">Blue</td>
            <td class="filterable-cell">2000</td>
          </tr>
          <tr>
            <td class="filterable-cell">Ford</td>
            <td class="filterable-cell">Escort</td>
            <td class="filterable-cell">Blue</td>
            <td class="filterable-cell">2000</td>
          </tr>
        </tbody>
      </table>

      【讨论】:

      • 好吧,假设无论如何你都可以在桌面版上实现这一点,移动版会是什么情况哈哈哈
      • 基本上如果所有列都是强制的,那么我们必须将其更改为选项卡视图而不是隐藏列:abhiklpm
      【解决方案3】:

      您可以借助 flex-box 布局来做到这一点。不过,它肯定不适用于 safari。所有其他主要浏览器都可以完美呈现它。

      /* CSS */

      html, body {
          height: 100%;
          width: 100%;
          overflow: hidden;
          margin: 0;
          padding: 0;
      }
      
      .table {
          height: 100%;
          width: 100%;
      }
      
      .table .tr {
          display: flex;
          flex-flow: row wrap;
      }
      
      .table .tr .td, .table .tr .th {
          flex: 1;
      }
      
      .table .thead {
          padding-right: 17px;
          /* this padding accounts for the width of the scroll bar
           * you could compute the default scrollbar width for any browser and set this padding accordingly
           * else the headers and records will be misaligned by that margin. */
      }
      
      .table .viewport {
          height: 640px;
          overflow: scroll;
      }

      /* HTML */

      <!DOCTYPE html>
      <html>
      <head lang="en">
          <meta charset="UTF-8">
          <link rel="stylesheet" type="text/css" href="ftable.css" />
          <title>Flex tables</title>
      </head>
      <body>
      
      <div class="table">
          <div class="thead">
              <div class="tr">
                  <div class="th">Column 1</div>
                  <div class="th">Column 2</div>
                  <div class="th">Column 3</div>
                  <div class="th">Column 4</div>
                  <div class="th">Column 5</div>
              </div>
          </div>
          <div class="viewport tbody">
              <div class="canvas">
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
                  <div class="tr">
                      <div class="td">Value 1</div>
                      <div class="td">Value 2</div>
                      <div class="td">Value 3</div>
                      <div class="td">Value 4</div>
                      <div class="td">Value 5</div>
                  </div>
              </div>
          </div>
      </div>
      
      </body>
      </html>

      【讨论】:

      • 我做了一个示例,用两三行 javascript 你可以让它完美地工作,至少在大多数主要浏览器上。我已经有几年没有接触堆栈了。所以请耐心等待我的编辑。
      • 我在复制sn-p时出错了。检查 css 部分中的最后一个块。它的照顾。
      猜你喜欢
      • 2011-07-17
      • 2012-10-01
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多