Twitter引导可滚动表

时间:2012-05-02 19:13:58

标签: twitter-bootstrap

我想在我的网站上有一张桌子。问题是这个表有大约400行。如何限制桌子的高度,并将滚动条应用于它? 这是我的代码:

<div class="span3">
  <h2>Achievements left</h2>
<table class="table table-striped">
  <thead>
    <tr>
      <th>#</th>
      <th>Name</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>Something</td>
    </tr>
    <tr>
      <td>2</td>
      <td>Something</td>
    </tr>
    <tr>
      <td>3</td>
      <td>Something</td>
    </tr>
    <tr>
      <td>4</td>
      <td>Something</td>
    </tr>
    <tr>
      <td>5</td>
      <td>Something</td>
    </tr>
    <tr>
      <td>6</td>
      <td>Something</td>
    </tr>
  </tbody>
</table>

  <p><a class="btn" href="#">View details &raquo;</a></p>
</div>

我尝试将max-height和fixed height应用于table,但它不起作用。

16 个答案:

答案 0 :(得分:227)

表元素似乎不直接支持此功能。将表格放在div中并设置div的高度并设置overflow: auto

答案 1 :(得分:52)

.span3 {  
    height: 100px !important;
    overflow: scroll;
}​

你需要将它包装在它自己的div中,或者给span3一个id自己的id,这样你就不会影响整个布局。

这是一个小提琴:http://jsfiddle.net/zm6rf/

答案 2 :(得分:34)

不要把它包裹在div中......

<强> CSS

tr {
width: 100%;
display: inline-table;
table-layout: fixed;
}

table{
 height:300px;              // <-- Select the height of the table
 display: -moz-groupbox;    // Firefox Bad Effect
}
tbody{
  overflow-y: scroll;      
  height: 200px;            //  <-- Select the height of the body
  width: 100%;
  position: absolute;
}

Bootply http://www.bootply.com/AgI8LpDugl

答案 3 :(得分:26)

我有同样的问题,并使用了上述解决方案的组合(并添加了我自己的扭曲)。请注意,我必须指定列宽以使它们在标题和正文之间保持一致。

在我的解决方案中,页眉和页脚在主体滚动时保持固定。

<div class="table-responsive">
    <table class="table table-striped table-hover table-condensed">
        <thead>
            <tr>
                <th width="25%">First Name</th>
                <th width="13%">Last Name</th>
                <th width="25%" class="text-center">Address</th>
                <th width="25%" class="text-center">City</th>
                <th width="4%" class="text-center">State</th>
                <th width="8%" class="text-center">Zip</th>
            </tr>
        </thead>
    </table>
    <div class="bodycontainer scrollable">
        <table class="table table-hover table-striped table-condensed table-scrollable">
            <tbody>
                <!-- add rows here, specifying same widths as in header, at least on one row -->
            </tbody>
        </table>
    </div>
    <table class="table table-hover table-striped table-condensed">
        <tfoot>
            <!-- add your footer here... -->
        </tfoot>
    </table>
</div>

然后只应用了以下CSS:

.bodycontainer { max-height: 450px; width: 100%; margin: 0; overflow-y: auto; }
.table-scrollable { margin: 0; padding: 0; }

我希望这有助于其他人。

答案 4 :(得分:8)

CSS

.achievements-wrapper { height: 300px; overflow: auto; }

HTML

<div class="span3 achievements-wrapper">
    <h2>Achievements left</h2>
    <table class="table table-striped">
    ...
    </table>
</div>

答案 5 :(得分:8)

我最近不得不使用bootstrap和angularjs这样做,我创建了一个解决问题的angularjs指令,你可以看到一个工作示例和详细信息blog post

只需在表标记中添加fixed-header属性即可使用它:

<table class="table table-bordered" fixed-header>
...
</table>

如果你不使用angularjs,你可以调整指令的javascript并直接使用它。

答案 6 :(得分:4)

以上所有解决方案都会使表头滚动... 如果您只想滚动tbody,请应用此选项:

tbody {
    height: 100px !important;
    overflow: scroll;
    display:block;
}

答案 7 :(得分:4)

这可能不是大行数的解决方案。我只是使用复制表技巧来完成小行数表的工作,同时它可以保持弹性列宽,你可以尝试这个fiddle

(固定宽度列是我用于大行计数表的方法,只需要标题行重复)

示例代码:     

<div style="height:30px;overflow:hidden;margin-right:15px;">
   <table class="table">
       <thead>
           <tr>
                <th>Col 1</th>
                <th>Col 2</th>
                <th>Col 3</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>Cel 1,1</td>
                <td>Cel 1,2</td>
                <td>Cel 1,3</td>
            </tr>
            <tr>
                <td>Cel 2,1</td>
                <td>Cel 2,2</td>
                <td>Cel 2,3</td>
            </tr>
            <tr>
                <td>Cel 3,1</td>
                <td>Cel 3,2</td>
                <td>Cel 3,3</td>
            </tr>


        </tbody>
    </table>
</div>
<div style="height:100px;overflow-y:scroll;;">
    <table class="table">
        <thead>

        </thead>
        <tbody>
            <tr>
                <td>Cel 1,1</td>
                <td>Cel 1,2</td>
                <td>Cel 1,3</td>
            </tr>
            <tr>
                <td>Cel 2,1</td>
                <td>Cel 2,2</td>
                <td>Cel 2,3</td>
            </tr>
            <tr>
                <td>Cel 3,1</td>
                <td>Cel 3,2</td>
                <td>Cel 3,3</td>
            </tr>
             <tr style="color:white">
                <th>Col 1</th>
                <th>Col 2</th>
                <th>Col 3</th>
            </tr>
        </tbody>
    </table>
</div>

答案 8 :(得分:4)

将表放在div中,并将该div赋予类pre-scrollable

答案 9 :(得分:2)

我最近遇到了类似的问题,并最终使用不同的解决方案来修复它。

第一个也是最简单的一个是使用两个表,一个用于标题,一个用于正文。这有效,但标题和正文列未对齐。而且,由于我想使用twitter引导表附带的自动大小,我最终创建了一个Javascript函数,在以下情况下更改标题:正文呈现;窗户调整大小;列中的数据更改等

以下是我使用的一些代码:

        <table class="table table-striped table-hover" style="margin-bottom: 0px;">
        <thead>
            <tr>
                <th data-sort="id">Header 1</i></th>
                <th data-sort="guide">Header 2</th>
                <th data-sort="origin">Header 3</th>
                <th data-sort="supplier">Header 4</th>
            </tr>
        </thead>
    </table>
    <div class="bodycontainer scrollable">
        <table class="table table-hover table-striped table-scrollable">
            <tbody id="rows"></tbody>
        </table>
    </div>

标题和正文分为两个单独的表。其中一个是在DIV内部,具有生成垂直滚动条所需的样式。这是我使用的CSS:

.bodycontainer {
  //height: 200px
  width: 100%;
  margin: 0;
}

.table-scrollable {
  margin: 0px;
  padding: 0px;
}

我评论了这里的高度,因为我想让桌子到达页面的底部,无论页面高度如何。

我在标题中使用的数据排序属性也用于每个td。这样我就可以得到每个td的宽度和填充以及行的宽度。使用我使用CSS设置的数据排序属性相应的每个标题的填充和宽度以及由于没有滚动条而总是更大的标题行。这是使用coffeescript的函数:

fixHeaders: =>
  for header, i in @headers
    tdpadding = parseInt(@$("td[data-sort=#{header}]").css('padding'))
    tdwidth = parseInt(@$("td[data-sort=#{header}]").css('width'))
    @$("th[data-sort=#{header}]").css('padding', tdpadding)
    @$("th[data-sort=#{header}]").css('width', tdwidth)
    if (i+1) == @headers.length
      trwidth = @$("td[data-sort=#{header}]").parent().css('width')
      @$("th[data-sort=#{header}]").parent().parent().parent().css('width', trwidth)
      @$('.bodycontainer').css('height', window.innerHeight - ($('html').outerHeight() -@$('.bodycontainer').outerHeight() ) ) unless @collection.length == 0

这里我假设您有一个名为@headers的标题数组。

它不漂亮但它有效。希望它可以帮到某人。

答案 10 :(得分:2)

这些答案对我来说都没有令人满意。它们要么没有将表标题行固定到位,要么它们需要固定的列宽才能工作,甚至在各种浏览器中往往使标题行和正文行不对齐。

我建议咬住子弹并使用适当的网格控件,如jsGrid或我个人喜欢的SlickGrid。它显然引入了一个依赖项,但是如果你希望你的表行为像跨浏览器支持的真实网格一样,这将节省你的头发。如果需要,它还为您提供了对列进行排序和调整大小以及大量其他功能的选项。

答案 11 :(得分:2)

乔纳森伍德的建议。我没有选择使用新的div包装表格,因为我使用的是CMS。在这里使用JQuery是我做的:

value

这包含了一个带有类&#34; table-overflow&#34;的新div的表元素。

然后,您只需在css文件中添加以下定义:

value

答案 12 :(得分:2)

此示例显示了在使用Bootstrap 4表样式时如何具有粘性标头。

.table-scrollable {
    /* set the height to enable overflow of the table */
    max-height: 200px;
    
    overflow-x: auto;
    overflow-y: auto;
    scrollbar-width: thin;
}

.table-scrollable thead th {
    border: none;
}

.table-scrollable thead th {
    /* Set header to stick to the top of the container. */
    position: sticky; 
    top: 0px;
    
    /* This is needed otherwise the sticky header will be transparent 
    */
    background-color: white;

    /* Because bootstrap adds `border-collapse: collapse` to the
     * table, the header boarders aren't sticky.
     * So, we need to make some adjustments to cover up the actual
     * header borders and created fake borders instead
     */
    margin-top: -1px;
    margin-bottom: -1px;

    /* This is our fake border (see above comment) */
    box-shadow: inset 0 1px 0 #dee2e6,
                inset 0 -1px 0 #dee2e6;
}
<!-- CSS -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">

<!-- jQuery and JS bundle w/ Popper.js -->
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ho+j7jyWK8fNQe+A12Hb8AhRq26LrZ/JpcUGGOn+Y7RsweNrtN/tE3MoK7ZeZDyx" crossorigin="anonymous"></script>


<div class="dashboard-container card">
  <div class="card-body">
    <div class="table-scrollable">
      <table class="table table-hover table-sortable">
          <thead>
              <tr>
                  <th data-sort-type="text">Course</th>
                  <th data-sort-type="numeric">In Progress</th>
                  <th data-sort-type="numeric">Not Started</th>
                  <th data-sort-type="numeric">Passed</th>
                  <th data-sort-type="numeric">Failed</th>
              </tr>
          </thead>
          <tbody>
            <tr>
              <td>How to be good at stuff</td>
              <td>0</td>
              <td>1000</td>
              <td>0</td>
              <td>0</td>
            </tr>
            <tr>
              <td>Quantum physics for artists</td>
              <td>200</td>
              <td>6</td>
              <td>66</td>
              <td>66</td>
            </tr>
            <tr>
              <td>The best way to skin a cat</td>
              <td>34</td>
              <td>16</td>
              <td>200</td>
              <td>7</td>
            </tr>
            <tr>
              <td>Human cookbook</td>
              <td>4</td>
              <td>7</td>
              <td>4</td>
              <td>50</td>
            </tr>
            <tr>
              <td>Aristocracy rules</td>
              <td>100</td>
              <td>3</td>
              <td>6</td>
              <td>18</td>
            </tr>
          </tbody>
      </table>
    </div>
  </div>
</div>

答案 13 :(得分:1)

想我会在这里张贴,因为我无法使用Bootstrap 4上面的任何一个。我在网上发现这个并且对我来说很完美......

table
{
    width: 100%;
    display: block;
    border:solid black 1px;
}

thead
{
    display: inline-block;
    width: 100%;
    height: 20px;
}

tbody
{
    height: 200px;
    display: inline-block;
    width: 100%;
    overflow: auto;
}

th, td
{
    width: 100px;
    border:solid 1px black;
    text-align:center;
}

我还附上了工作的jffindle。

https://jsfiddle.net/jgngg28t/

希望它可以帮助别人。

答案 14 :(得分:0)

将表格放入div内以垂直制作可滚动表格。将overflow-y更改为overflow-x,以使表格可水平滚动。只需overflow即可使表格在水平和垂直方向均可滚动。

<div style="overflow-y: scroll;"> 
    <table>
    ...
    </table>
</div>

答案 15 :(得分:0)

我在表中添加了.table-responsive,它可以正常工作。从docs

通过使用.table-sensitive {-sm | -md | -lg | -xl}包装任何.table来创建响应表,使该表在最大(但不包括)576px的每个最大宽度断点处水平滚动,分别为768px,992px和1120px。