Bảng khởi động Twitter bootstrap


149

Tôi muốn có một bảng trên trang web của tôi. Vấn đề là bảng này sẽ có khoảng 400 dòng. Làm cách nào tôi có thể giới hạn chiều cao của bảng và áp dụng thanh cuộn cho nó? Đây là mã của tôi:

<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>

Tôi đã cố gắng áp dụng chiều cao tối đa và chiều cao cố định cho bảng, nhưng nó không hoạt động.

Câu trả lời:


241

Các yếu tố bảng không xuất hiện để hỗ trợ điều này trực tiếp. Đặt bảng trong div và đặt chiều cao của div và đặt overflow: auto.


50
Điều này thực sự có hiệu quả? Tôi đã thử điều này và nó không có hiệu quả gì cả.
cjstehno

8
Chỉ cần FYI, đặt tràn thành 'tự động', thay vì tràn: cuộn, sẽ không tạo ra thanh cuộn ngang dự phòng.
daCoda

8
@JonathanWood: có cách nào overflowchỉ áp dụng trên thân bàn nhưng nơi các <thead>bộ phận luôn được hiển thị không?
Willem Van Onsem

8
Chỉ cần làm rõ điều này cho mọi người .... <div style = "overflow: auto;"> <table class = "table"> .... </ table> </ div>
Henry Weber

3
Xin cho một ví dụ nhỏ!
Yahya Yahyaoui

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

Bạn sẽ muốn bọc nó trong div của chính nó hoặc cung cấp cho span3 một id của chính nó để bạn không ảnh hưởng đến toàn bộ bố cục của mình.

Đây là một câu đố: http://jsfiddle.net/zm6rf/


2
Lưu ý rằng '! Quan trọng' không quan trọng;)
âm

8
Hãy cẩn thận, đặt các thuộc tính này cho .span3sẽ ảnh hưởng đến tất cả các span3 yếu tố trên toàn bộ trang web điều khiển Bootstrap của bạn.
Terry

1
Bạn chỉ có thể thêm tỷ lệ phần trăm chiều cao nếu vùng chứa cha có chiều cao pixel. Trong trường hợp của bạn, bạn cần thực hiện một số thứ như đặt .row thành 500px và .span3 đến 50%. Nếu cha mẹ không có chiều cao được đặt, trình duyệt sẽ mặc định là chiều cao nội dung nếu bạn cho nó một tỷ lệ phần trăm.
âm

1
Bạn có thể làm điều này trong khi làm cho tbody scollable và thead không?
đèn đường

1
Đối với thông tin của bạn, cài đặt tràn: cuộn sẽ tạo một thanh cuộn ngang có thể là dự phòng. Làm cho nó tự động, tức là tràn: tự động, không làm điều này.
daCoda

38

Đừng cần bọc nó trong một 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


Tôi đã rất phấn khích khi nhìn thấy ví dụ này nhưng hóa ra bố cục bị "giật lên" khi dữ liệu trong tdphần tử có kích thước khác nhau. bootply.com/OsvzINuTUA
Frito

4
@Frito Đừng lo lắng, hãy vui lên;) Tôi chỉ quên cách bố trí bảng: đã sửa; ... Liên kết được cập nhật
BENARD Patrick

30

Tôi đã có cùng một vấn đề và sử dụng kết hợp các giải pháp trên (và thêm một nút xoắn của riêng tôi). Lưu ý rằng tôi phải chỉ định độ rộng cột để giữ cho chúng phù hợp giữa tiêu đề và phần thân.

Trong giải pháp của tôi, tiêu đề và chân trang vẫn cố định trong khi cơ thể cuộn.

<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>

Và sau đó chỉ cần áp dụng CSS sau:

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

Tôi mong điều này giúp được người nào khác.


Cảm ơn nó giúp. Thật không may, tôi không thể chỉ định chiều rộng của các phần tử thứ vì nó không phải là một phần tử hợp lệ. (???)
Erwin Rooijakkers

1
các cột của td không được liên kết với các phần tử thứ vì thanh cuộn chuyển nội dung
IHeartAndroid

À ... Tôi đang ở trên máy Mac, nơi các thanh cuộn không nhìn thấy và chỉ xuất hiện trên đầu nội dung trong khi cuộn. Đó sẽ là một khó khăn vì thanh cuộn phụ thuộc vào trình duyệt và trình duyệt.
Todd

9

Gần đây tôi đã phải làm điều này với bootstrap và angularjs, tôi đã tạo ra một lệnh angularjs để giải quyết vấn đề, bạn có thể xem một ví dụ hoạt động và chi tiết về bài đăng trên blog này .

Bạn sử dụng nó chỉ bằng cách thêm một thuộc tính tiêu đề cố định vào thẻ bảng:

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

Nếu bạn không sử dụng angularjs, bạn có thể điều chỉnh javascript của lệnh và thay vào đó sử dụng trực tiếp.


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>

Có thể giữ chiều cao tương đối?
pangi

Tôi muốn có chiều cao được thiết lập với phần trăm. Điều này có thể không? Tôi không thể làm cho nó hoạt động.
pangi

Chắc chắn, chỉ cần đặt chiều cao bảng là 100%. .table-class-name { height: 100%; }.
Terry

Điều đó mở rộng bảng của tôi, và nó tiếp tục và tiếp tục. (Nó không có tác dụng)
pangi

4
Theo phương pháp này, tiêu đề cũng có thể cuộn được, vậy có cách nào để sửa tiêu đề bảng không?
Kyleinincubator

4

Đây có thể không phải là một giải pháp cho số lượng hàng lớn. Tôi chỉ đơn giản là sử dụng thủ thuật bảng sao chép để hoàn thành công việc cho bảng đếm hàng nhỏ trong khi nó có thể giữ chiều rộng cột flex, bạn có thể thử câu đố này .

(Cột chiều rộng cố định là phương pháp tôi sử dụng cho bảng đếm hàng lớn chỉ yêu cầu sao chép hàng tiêu đề)

Mã mẫu:

<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>

4

Đặt bảng trong một div và cung cấp cho div đó lớp pre-scrollable.


3

Gần đây tôi đã có một vấn đề tương tự và cuối cùng đã sửa nó bằng cách sử dụng hỗn hợp các giải pháp khác nhau.

Đầu tiên và đơn giản nhất là sử dụng hai bảng, một cho tiêu đề và một cho cơ thể. Điều này hoạt động nhưng các tiêu đề và các cột cơ thể không được căn chỉnh. Và, vì tôi muốn sử dụng kích thước tự động đi kèm với các bảng bootstrap twitter, cuối cùng tôi đã tạo ra một hàm Javascript thay đổi các tiêu đề khi: phần thân được hiển thị; các cửa sổ được thay đổi kích thước; dữ liệu trong cột thay đổi, v.v.

Đây là một số mã tôi đã sử dụng:

        <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>

Các tiêu đề và cơ thể được chia thành hai bảng riêng biệt. Một trong số chúng nằm trong DIV với kiểu dáng cần thiết để tạo các thanh cuộn dọc. Đây là CSS tôi đã sử dụng:

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

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

Tôi nhận xét chiều cao ở đây vì tôi muốn bảng đạt đến cuối trang, bất kể chiều cao trang có thể là bao nhiêu.

Các thuộc tính sắp xếp dữ liệu tôi sử dụng trong các tiêu đề cũng được sử dụng trong mọi td. Bằng cách này tôi có thể có được chiều rộng và phần đệm của mỗi td và chiều rộng của hàng. Sử dụng các thuộc tính sắp xếp dữ liệu tôi đặt bằng CSS, phần đệm và chiều rộng của mỗi tiêu đề tương ứng và của hàng tiêu đề luôn lớn hơn vì nó không có thanh cuộn. Đây là chức năng sử dụng 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

Ở đây tôi giả sử rằng bạn có một loạt các tiêu đề được gọi là @headers.

Nó không đẹp nhưng nó hoạt động. Hy vọng nó sẽ giúp được ai đó.


3

Tất cả các giải pháp trên cũng tạo cuộn tiêu đề bảng ... Nếu bạn chỉ muốn cuộn tbody thì hãy áp dụng điều này:

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

7
Điều này sẽ chỉ hoạt động nếu nó là một bảng cột duy nhất. Nếu bạn có một bảng có nhiều cột, điều này sẽ chỉ làm cho cuộn cột đầu tiên.
empo

2

Không có câu trả lời nào làm việc thỏa đáng cho tôi. Họ đã không sửa hàng tiêu đề bảng tại chỗ hoặc họ yêu cầu độ rộng cột cố định để hoạt động và thậm chí sau đó có xu hướng có hàng tiêu đề và hàng thân trong các trình duyệt khác nhau.

Tôi khuyên bạn nên cắn đạn và sử dụng một điều khiển lưới đúng như jsGrid hoặc yêu thích cá nhân của tôi, SlickGrid . Nó rõ ràng giới thiệu một sự phụ thuộc nhưng nếu bạn muốn các bảng của bạn hoạt động giống như các lưới thực sự với sự hỗ trợ của nhiều trình duyệt, điều này sẽ giúp bạn tiết kiệm việc nhổ tóc. Nó cũng cung cấp cho bạn tùy chọn sắp xếp và thay đổi kích thước các cột cộng với hàng tấn các tính năng khác nếu bạn muốn chúng.


2

Đề nghị của Jonathan Wood. Tôi không có tùy chọn gói bảng với div mới vì tôi đang sử dụng CMS. Sử dụng JQuery ở đây những gì tôi đã làm:

$( "table" ).wrap( "<div class='table-overflow'></div>" );

Điều này bao bọc các phần tử bảng với một div mới với lớp "tràn bảng".

Sau đó, bạn có thể chỉ cần thêm định nghĩa sau vào tệp css của mình:

.table-overflow { overflow: auto; }     

2

Đặt bảng bên trong div để tạo bảng có thể cuộn theo chiều dọc. thay đổi overflow-yđể overflow-xlàm cho bảng có thể cuộn theo chiều ngang. chỉ overflowđể làm cho bảng có thể cuộn cả ngang và dọc.

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

1

Hình tôi sẽ đăng lên đây vì tôi không thể làm bất cứ điều gì ở trên để làm việc với Bootstrap 4. Tôi đã tìm thấy trực tuyến này và hoạt động hoàn hảo cho tôi ...

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;
}

Tôi cũng đã đính kèm jsfulum làm việc.

https://jsfiddle.net/jgngg28t/

Hy vọng nó sẽ giúp người khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.