Các tiêu đề bảng HTML luôn hiển thị ở đầu cửa sổ khi xem một bảng lớn


169

Tôi muốn có thể "điều chỉnh" bản trình bày của bảng HTML để thêm một tính năng duy nhất: khi cuộn xuống trang để bảng nằm trên màn hình nhưng các hàng tiêu đề nằm ngoài màn hình, tôi muốn các tiêu đề vẫn còn nhìn thấy ở trên cùng của khu vực xem.

Đây là khái niệm giống như tính năng "đóng băng" trong Excel. Tuy nhiên, một trang HTML có thể chứa một vài bảng trong đó và tôi chỉ muốn nó xảy ra đối với bảng hiện đang được xem, chỉ trong khi nó ở chế độ xem.

Lưu ý: Tôi đã thấy một giải pháp trong đó khu vực dữ liệu bảng được tạo thành cuộn trong khi các tiêu đề không cuộn. Đó không phải là giải pháp tôi đang tìm kiếm.


trang của bạn được thiết kế bằng bảng? không thể chuyển đổi nó thành div trước và để lại dữ liệu dạng bảng cho các bảng?
khóa

6
tôi gần đây đã viết một plugin mà thực hiện điều này: programmingdrunk.com/floatThead
mkoryak

1
Ngoài giải pháp được bình chọn hàng đầu và các dẫn xuất của nó bên dưới, plugin của @mkoryak ở trên cũng khá tốt. Hãy chắc chắn để xem xét điều đó quá trước khi bạn hoàn thành "mua sắm".
DanO

Cảm ơn dan :) Tôi cũng có một số tính năng kick-ass được lên kế hoạch cho lần phát hành tiếp theo
mkoryak

Tôi thứ hai plugin @mkoryak floatThead - Tôi đã có thể nhanh chóng tích hợp nó. Cảm ơn rất nhiều về plugin!
w5m

Câu trả lời:


67

Hãy xem jQuery.floatThead ( bản demo có sẵn ) rất tuyệt, cũng có thể hoạt động với DataTables và thậm chí có thể hoạt động bên trong một overflow: autothùng chứa.


vâng, nó hoạt động với cuộn ngang, cuộn cửa sổ, cuộn bên trong và thay đổi kích thước cửa sổ.
mkoryak

Bạn có thể thêm một fiddle với một mã làm việc? (Tôi biết rằng có trong trang web ...)
Michel Ayres

12
Tôi đã xây dựng một trang demo / tài liệu khổng lồ. Tại sao bạn cần một fiddle?
mkoryak

5
@MustModify stackoverflow không phải là nơi tốt để đặt câu hỏi cho tôi. báo cáo một vấn đề trên github, ngay cả khi đó chỉ là một câu hỏi về cách làm cho nó hoạt động. Ill trả lời thường ở dưới một ngày. Ở đây tôi có thể trả lời chỉ trong vòng chưa đầy một năm :)
mkoryak

1
@MustModify cho giá trị của nó, không có lớp nào trong các bảng trong các ví dụ có liên quan. Các plugin không cần bất kỳ css hoặc các lớp để làm việc, như tài liệu của tôi nói.
mkoryak

135

Tôi đã thực hiện một giải pháp bằng chứng về khái niệm bằng cách sử dụng jQuery .

Xem mẫu tại đây.

Bây giờ tôi đã có mã này trong kho lưu trữ bitbucket Mercurial . Các tập tin chính là tables.html.

Tôi nhận thấy một vấn đề với điều này: nếu bảng chứa các neo và nếu bạn mở URL bằng neo được chỉ định trong trình duyệt, khi trang tải, hàng có neo sẽ bị che khuất bởi tiêu đề nổi.

Cập nhật 2017-12-11: Tôi thấy điều này không hoạt động với Firefox hiện tại (57) và Chrome (63). Không chắc chắn khi nào và tại sao điều này ngừng hoạt động, hoặc làm thế nào để khắc phục nó. Nhưng bây giờ, tôi nghĩ rằng câu trả lời được chấp nhận của Hendy IINA là vượt trội.


Tôi cần điều này cho một cái gì đó mà tôi đang làm. Giúp đỡ rất nhiều, cảm ơn bạn. Với tôi, tôi đã không sử dụng cửa sổ vì khung cuộn là một div trong html. Vì vậy, tôi đã phải thay đổi floatingHeaderRow.css("top", Math.min(scrollTop - offset.top, $(this).height() - floatingHeaderRow.height()) + "px");thành floatingHeaderRow.css("top", scrollTop + "px");mã mà bạn có tiêu đề bảng đang nhảy xuống trang để cuối cùng biến mất khỏi trang.
Nalum

1
Tôi đang cố gắng thực hiện điều này trong bảng của tôi. Tôi đang gặp vấn đề với chiều rộng tiêu đề. Dữ liệu trong các hàng là các giá trị được kéo từ một db, vì vậy đó là một độ dài ngẫu nhiên. Trước khi bạn cuộn, các tiêu đề có kích thước tự động được kế thừa, nhưng một khi bạn cuộn, nó sẽ thay đổi kích thước các tiêu đề để bao quanh các tên tiêu đề và do đó, chiều rộng nhỏ hơn nhiều để các tiêu đề không thực sự theo dõi trên đầu của chúng cột. Làm thế nào tôi có thể khắc phục vấn đề này?
JonYork

Hmm tôi không chắc chắn, dựa trên mô tả của bạn. Tôi đề nghị 1) nếu có thể, hãy đưa ra một ví dụ trực tuyến; 2) hỏi nó như một câu hỏi trên StackOverflow.
Craig McQueen

@JonYork Tôi đã có cùng một vấn đề. Vấn đề của tôi là sử dụng <td> trong tiêu đề thay vì <th> vì vậy nó không thể áp dụng chiều rộng của mỗi cột cho <th> không tồn tại (xem // Copy cell widths from original headermột phần của mã). @Craig McQueen, vui lòng chỉnh sửa câu trả lời của bạn để không ai khác mắc lỗi này.
aexl

@CraigMcQueen Khi tôi sử dụng mã tuyệt vời của bạn (cảm ơn bạn), nó bị hỏng trên bảng thứ hai tôi có phía sau một tab khác (plugin tab jQuery). Có suy nghĩ gì không? Tiêu đề được đặt ở phía bên trái, thay vì theo các cột vị trí. Nhưng hoạt động hoàn hảo trên bảng trong tab jQuery đầu tiên.
Richard Żak

68

Craig, tôi đã tinh chỉnh mã của bạn một chút (trong số một số thứ khác hiện đang sử dụng vị trí: đã sửa) và gói nó dưới dạng plugin jQuery.

Dùng thử tại đây: http://jsfiddle.net/jmosbech/stFcx/

Và lấy nguồn tại đây: https://github.com/jmosbech/StickyTableHeaders


1
Ý tưởng tốt để tạo một plugin jQuery. Một vài câu hỏi: (1) Nó có hoạt động tốt với cuộn ngang không? (2) Nó hoạt động như thế nào khi bạn cuộn xuống để phần dưới cùng của bảng được cuộn ra khỏi đỉnh cửa sổ? Ví dụ này không cho phép thử nghiệm những trường hợp đó.
Craig McQueen

Ví dụ jsfiddle của bạn hoạt động tuyệt vời với trình sắp xếp bảng, nhưng mã trên github thì không. Bạn đã phải sửa đổi mã bảng trình?
ericslaw

Craig, cuộn ngang không phải là một vấn đề vì tiêu đề được định vị lại theo cả chiều ngang và chiều dọc khi cuộn và thay đổi kích thước. Đối với câu hỏi thứ hai của bạn: Tiêu đề bị ẩn khi bảng rời khỏi chế độ xem.
jmosbech

Eric, thật lạ. Bạn đã thử mở /demo/tablesorter.htm từ Github chưa? Tôi đã không sửa đổi mã trình sắp xếp bảng, nhưng để làm cho nó hoạt động, bạn cần áp dụng trình cắm DínhTableHeader trước trình sắp xếp bảng.
jmosbech

2
Việc cuộn theo đường chân trời không thực sự hiệu quả, sau khi cuộn khá xa, vị trí đó sẽ được đặt ở bên trái khi cuộn ngoài màn hình so với khi nó được định vị bình thường như một phần của bảng.
Nathan Phillips

16

Nếu bạn đang nhắm mục tiêu các trình duyệt tuân thủ css3 hiện đại ( Hỗ trợ trình duyệt: https://caniuse.com/#feat=css-sticky ), bạn có thể sử dụng position:sticky, điều này không yêu cầu JS và sẽ không phá vỡ bố cục bảng sắp xếp sai và td của cùng một cột. Nó cũng không yêu cầu chiều rộng cột cố định để hoạt động đúng.

Ví dụ cho một hàng tiêu đề duy nhất:

thead th
{
    position: sticky;
    top: 0px;
}

Đối với các mục có 1 hoặc 2 hàng, bạn có thể sử dụng một cái gì đó như thế này:

thead > :last-child th
{
    position: sticky;
    top: 30px; /* This is for all the the "th" elements in the second row, (in this casa is the last child element into the thead) */
}

thead > :first-child th
{
    position: sticky;
    top: 0px; /* This is for all the the "th" elements in the first child row */
}

Bạn có thể cần phải chơi một chút với các đầu tài sản của đứa trẻ cuối cùng thay đổi số lượng điểm ảnh để phù hợp với chiều cao của hàng đầu tiên (+ biên độ + biên giới + padding, nếu có), vì vậy gậy hàng thứ hai chỉ xuống dưới đây đầu tiên.

Ngoài ra cả hai giải pháp đều hoạt động ngay cả khi bạn có nhiều hơn một bảng trong cùng một trang: thphần tử của mỗi bảng bắt đầu bị dính khi vị trí trên cùng của nó là vị trí được chỉ định trong định nghĩa css và chỉ biến mất khi tất cả các bảng cuộn xuống. Vì vậy, nếu có nhiều bảng tất cả đều hoạt động đẹp theo cùng một cách.

Tại sao nên sử dụng con cuối cùng trước và con đầu sau trong css?

Bởi vì các quy tắc css được trình duyệt hiển thị theo cùng thứ tự khi bạn viết chúng vào tệp css và vì điều này nếu bạn chỉ có 1 hàng vào phần tử thead, hàng đầu tiên cũng đồng thời là hàng cuối cùng và quy tắc con đầu tiên cần để ghi đè lên đứa con cuối cùng. Nếu không, bạn sẽ có phần bù của hàng 30 px từ lề trên cùng mà tôi cho rằng bạn không muốn.

Một vấn đề đã biết về vị trí: dính là nó không hoạt động trên các phần tử thead hoặc hàng bảng: bạn phải nhắm mục tiêu các phần tử. Hy vọng vấn đề này sẽ được giải quyết trên các phiên bản trình duyệt trong tương lai.


Ví dụ đầu tiên dường như không hoạt động trong Firefox (61). Tuy nhiên, nếu vị trí dính được đặt trên thead, nó sẽ làm.
EWH

1
Bạn có thể làm thead tr+tr thđể nhắm mục tiêu hàng thứ hai.
Teepeemm

5

Các lựa chọn thay thế có thể

js-nổi-bảng-tiêu đề

tiêu đề js-float-bảng (Google Code)

Ở Drupal

Tôi có một trang web Drupal 6. Tôi đã ở trang "mô-đun" của quản trị viên và nhận thấy các bảng có tính năng chính xác này!

Nhìn vào mã, nó dường như được thực hiện bởi một tệp có tên tableheader.js. Nó áp dụng tính năng trên tất cả các bảng với lớp sticky-enabled.

Đối với trang web Drupal, tôi muốn có thể sử dụng tableheader.jsmô-đun đó như dành cho nội dung người dùng. tableheader.jsdường như không có mặt trên các trang nội dung người dùng trong Drupal. Tôi đã đăng một thông điệp diễn đàn để hỏi cách sửa đổi chủ đề Drupal để nó có sẵn. Theo phản hồi, tableheader.jscó thể được thêm vào chủ đề Drupal bằng cách sử dụng drupal_add_js()trong chủ đề template.phpnhư sau:

drupal_add_js('misc/tableheader.js', 'core');

Liên kết Google Code của bạn rất hữu ích cho tôi, tahnks.
Vilius Gaidelis

5

Gần đây tôi đã gặp phải vấn đề này. Thật không may, tôi đã phải làm 2 bảng, một cho tiêu đề và một cho cơ thể. Đây có thể không phải là cách tiếp cận tốt nhất từng có nhưng ở đây đi:

<html>
<head>
    <title>oh hai</title>
</head>
<body>
    <table id="tableHeader">
        <tr>
            <th style="width:100px; background-color:#CCCCCC">col header</th>
            <th style="width:100px; background-color:#CCCCCC">col header</th>
        </tr>
    </table>
    <div style="height:50px; overflow:auto; width:250px">
        <table>
            <tr>
                <td style="height:50px; width:100px; background-color:#DDDDDD">data1</td>
                <td style="height:50px; width:100px; background-color:#DDDDDD">data1</td>
            </tr>
            <tr>
                <td style="height:50px; width:100px; background-color:#DDDDDD">data2</td>
                <td style="height:50px; width:100px; background-color:#DDDDDD">data2</td>
            </tr>
        </table>
    </div>
</body>
</html>

Điều này làm việc cho tôi, nó có thể không phải là cách thanh lịch nhưng nó hoạt động. Tôi sẽ điều tra để xem liệu tôi có thể làm điều gì đó tốt hơn không, nhưng nó cho phép nhiều bảng.

Hãy đọc phần sở hữu tràn để xem nó có phù hợp với nhu cầu của bạn không


Hmm không hoạt động, tôi sẽ cố gắng khắc phục điều này, nhưng cách tiếp cận vẫn còn, bạn phải sử dụng tính năng tự động: proprety
Gab Royer

Tôi đánh giá cao giải pháp của bạn và tính đơn giản của nó, tuy nhiên trong câu hỏi của tôi, tôi đã nói "Lưu ý: Tôi đã thấy một giải pháp trong đó khu vực dữ liệu bảng có thể cuộn trong khi các tiêu đề không cuộn. Đó không phải là giải pháp tôi đang tìm kiếm."
Craig McQueen

@GabRoyer Trang w3school, bạn đã tham chiếu, không tồn tại.
Farhan

Họ dường như đã di chuyển nó. Đã sửa lỗi
Gab Royer

Một vấn đề khác với cách tiếp cận này là nếu bạn cần điều chỉnh một số cột thành nội dung khác, bạn có nguy cơ phá vỡ sự liên kết của chúng với tiêu đề cột tương ứng. IMHO tốt hơn là đối mặt với vấn đề này bằng một cách tiếp cận cho phép một loại quản lý động nội dung giữ một sự liên kết hoàn hảo của các cột và các đầu tương đối. Vì vậy, vị trí IMHO = dính là cách để đi.
willy wonka

3

Đây thực sự là một điều khó khăn để có một tiêu đề dính trên bàn của bạn. Tôi có cùng một yêu cầu nhưng với asp: GridView và sau đó tôi thấy nó thực sự được cho là có tiêu đề dính trên Gridview. Có rất nhiều giải pháp có sẵn và tôi đã mất 3 ngày để thử tất cả các giải pháp nhưng không có giải pháp nào có thể đáp ứng.

Vấn đề chính mà tôi phải đối mặt với hầu hết các giải pháp này là vấn đề căn chỉnh. Khi bạn cố gắng làm cho tiêu đề nổi, bằng cách nào đó, sự liên kết của các ô tiêu đề và các ô cơ thể bị lạc hướng.

Với một số giải pháp, tôi cũng gặp vấn đề về việc tiêu đề bị chồng chéo lên một vài hàng đầu tiên, điều này khiến các hàng cơ thể bị ẩn sau tiêu đề nổi.

Vì vậy, bây giờ tôi phải thực hiện logic của riêng mình để đạt được điều này, mặc dù tôi cũng không coi đây là giải pháp hoàn hảo nhưng điều này cũng có thể hữu ích cho ai đó,

Dưới đây là bảng mẫu.

<div class="table-holder">
        <table id="MyTable" cellpadding="4" cellspacing="0" border="1px" class="customerTable">
            <thead>
                <tr><th>ID</th><th>First Name</th><th>Last Name</th><th>DOB</th><th>Place</th></tr>
            </thead>
            <tbody>
                <tr><td>1</td><td>Customer1</td><td>LastName</td><td>1-1-1</td><td>SUN</td></tr>
                <tr><td>2</td><td>Customer2</td><td>LastName</td><td>2-2-2</td><td>Earth</td></tr>
                <tr><td>3</td><td>Customer3</td><td>LastName</td><td>3-3-3</td><td>Mars</td></tr>
                <tr><td>4</td><td>Customer4</td><td>LastName</td><td>4-4-4</td><td>Venus</td></tr>
                <tr><td>5</td><td>Customer5</td><td>LastName</td><td>5-5-5</td><td>Saturn</td></tr>
                <tr><td>6</td><td>Customer6</td><td>LastName</td><td>6-6-6</td><td>Jupitor</td></tr>
                <tr><td>7</td><td>Customer7</td><td>LastName</td><td>7-7-7</td><td>Mercury</td></tr>
                <tr><td>8</td><td>Customer8</td><td>LastName</td><td>8-8-8</td><td>Moon</td></tr>
                <tr><td>9</td><td>Customer9</td><td>LastName</td><td>9-9-9</td><td>Uranus</td></tr>
                <tr><td>10</td><td>Customer10</td><td>LastName</td><td>10-10-10</td><td>Neptune</td></tr>
            </tbody>
        </table>
    </div>

Lưu ý : Bảng được bọc trong DIV với thuộc tính lớp bằng 'ngăn chứa bảng'.

Dưới đây là tập lệnh JQuery mà tôi đã thêm vào tiêu đề trang html của mình.

<script src="../Scripts/jquery-1.7.2.min.js" type="text/javascript"></script>
<script src="../Scripts/jquery-ui.min.js" type="text/javascript"></script>
<script type="text/javascript">
    $(document).ready(function () {
        //create var for table holder
        var originalTableHolder = $(".table-holder");
        // set the table holder's with
        originalTableHolder.width($('table', originalTableHolder).width() + 17);
        // Create a clone of table holder DIV
        var clonedtableHolder = originalTableHolder.clone();

        // Calculate height of all header rows.
        var headerHeight = 0;
        $('thead', originalTableHolder).each(function (index, element) {
            headerHeight = headerHeight + $(element).height();
        });

        // Set the position of cloned table so that cloned table overlapped the original
        clonedtableHolder.css('position', 'relative');
        clonedtableHolder.css('top', headerHeight + 'px');

        // Set the height of cloned header equal to header height only so that body is not visible of cloned header
        clonedtableHolder.height(headerHeight);
        clonedtableHolder.css('overflow', 'hidden');

        // reset the ID attribute of each element in cloned table
        $('*', clonedtableHolder).each(function (index, element) {
            if ($(element).attr('id')) {
                $(element).attr('id', $(element).attr('id') + '_Cloned');
            }
        });

        originalTableHolder.css('border-bottom', '1px solid #aaa');

        // Place the cloned table holder before original one
        originalTableHolder.before(clonedtableHolder);
    });
</script>

và cuối cùng bên dưới là lớp CSS cho mục đích tô màu.

.table-holder
{
    height:200px;
    overflow:auto;
    border-width:0px;    
}

.customerTable thead
{
    background: #4b6c9e;        
    color:White;
}

Vì vậy, toàn bộ ý tưởng của logic này là đặt bảng vào div giữ bảng và tạo bản sao của ngăn chứa đó ở phía máy khách khi tải trang. Bây giờ ẩn phần thân của bảng bên trong ngăn chứa bản sao và đặt phần tiêu đề còn lại lên trên tiêu đề ban đầu.

Giải pháp tương tự cũng hoạt động cho asp: Gridview, bạn cần thêm hai bước nữa để đạt được điều này trong Gridview,

  1. Trong sự kiện OnPrerender của đối tượng Gridview trong trang web của bạn, hãy đặt phần bảng của hàng tiêu đề bằng với TableHeader.

    if (this.HeaderRow != null)
    {
        this.HeaderRow.TableSection = TableRowSection.TableHeader;
    }
  2. Và bọc lưới của bạn vào <div class="table-holder"></div>.

Lưu ý : nếu tiêu đề của bạn có các điều khiển có thể nhấp thì bạn có thể cần thêm một số tập lệnh jQuery khác để chuyển các sự kiện được nêu trong tiêu đề nhân bản vào tiêu đề gốc. Mã này đã có sẵn trong plugin tiêu đề dính jQuery được tạo bởi jmosbech


+1 cho nỗ lực tốt, nhưng đối với các bảng lớn có nhiều dữ liệu, việc sao chép toàn bộ nội dung là khá tệ ... Tôi tưởng tượng rằng sẽ tăng gấp đôi thời gian tải
khaverim

2

Sử dụng display: fixedtrên theadphần nên hoạt động, nhưng đối với nó chỉ hoạt động trên bảng hiện tại trong chế độ xem, bạn sẽ cần sự trợ giúp của JavaScript. Và nó sẽ rất khó khăn vì nó sẽ cần phải tìm ra các vị trí cuộn và vị trí của các thành phần liên quan đến chế độ xem, đây là một trong những lĩnh vực chính của sự không tương thích trình duyệt.

Hãy xem các khung JavaScript phổ biến (jQuery, MooTools, YUI, v.v.) để xem liệu chúng có thể làm những gì bạn muốn hay làm cho dễ dàng hơn để làm những gì bạn muốn.


1
Cảm ơn vì lời khuyên. Tôi đã thực hiện một giải pháp bằng cách sử dụng jQuery, xem câu trả lời của tôi.
Craig McQueen

Tôi đã thử điều này và tôi nghĩ rằng bạn có nghĩa là vị trí hơn là hiển thị, nhưng không làm việc cho thead trong chome.
ericslaw

@ericslaw Ack - vâng ý tôi là vậy position: fixed. Xin lỗi, nó không hoạt động trong Chrome.
staticsan

làm rối tiêu đề của tôi bằng cách bỏ qua các kiểu chiều rộng
pavel_kazlou

2

Nếu bạn sử dụng bảng toàn màn hình, bạn có thể quan tâm đến việc đặt th để hiển thị: đã sửa; và đầu trang: 0; hoặc thử một cách tiếp cận rất giống nhau thông qua css.

Cập nhật

Chỉ cần nhanh chóng xây dựng một giải pháp làm việc với iframes (html4.0). Ví dụ này KHÔNG tuân thủ tiêu chuẩn, tuy nhiên bạn sẽ dễ dàng sửa nó:

ngoài.html

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">   
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">     
    <head>      
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />   
        <title>Outer</title>
  <body>
    <iframe src="test.html" width="200" height="100"></iframe>
    </body>
</html> 

test.html

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">   
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">     
    <head>      
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />   
        <title>Floating</title>
    <style type="text/css">
      .content{
        position:relative; 
      }

      thead{
        background-color:red;
        position:fixed; 
        top:0;
      }
    </style>
  <body>
    <div class="content">      
      <table>
        <thead>
          <tr class="top"><td>Title</td></tr>
        </head>
        <tbody>
          <tr><td>a</td></tr>
          <tr><td>b</td></tr>
          <tr><td>c</td></tr>
          <tr><td>d</td></tr>
          <tr><td>e</td></tr>
          <tr><td>e</td></tr>
          <tr><td>e</td></tr>
          <tr><td>e</td></tr>
          <tr><td>e</td></tr>
          <tr><td>e</td></tr>
        </tbody>
      </table>
    </div>
    </body>
</html> 

@ a_m0d, đúng ... nhưng yêu cầu nghe có vẻ khó hiểu. Hoặc là chúng tôi đang hiểu sai về nó, hoặc người hỏi không hoàn toàn hiểu những gì anh ta muốn.
Sampson

Đây là một giải pháp khác sử dụng một số javascript imaputz.com/cssStuff/bigFourVersion.html
merkuro

2

Câu trả lời đơn giản nhất chỉ sử dụng CSS: D !!!

table {
  /* Not required only for visualizing */
  border-collapse: collapse;
  width: 100%;
}

table thead tr th {
  /* you could also change td instead th depending your html code */
  background-color: green;
  position: sticky;
  z-index: 100;
  top: 0;
}

td {
  /* Not required only for visualizing */
  padding: 1em;
}
<table>
  <thead>
    <tr>
      <th>Col1</th>
      <th>Col2</th>
      <th>Col3</th>
    </tr>
  </thead>
  <tbody>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>david</td>
       <td>castro</td>
       <td>rocks!</td>
     </tr>
  </tbody>
</table>


1
Cảm ơn David, đó là cách tiếp cận đẹp nhất mà tôi đã tìm thấy trong câu hỏi này
Tomasz Smykowski

0

Đó là bằng chứng của khái niệm bạn đã thực hiện thật tuyệt vời! Tuy nhiên tôi cũng tìm thấy plugin jQuery này dường như đang hoạt động rất tốt. Hy vọng nó giúp!


Trông như thể nó thực hiện một tính năng khác . Như tôi đã nói trong câu hỏi ban đầu của mình: "Lưu ý: Tôi đã thấy một giải pháp trong đó khu vực dữ liệu bảng có thể cuộn trong khi các tiêu đề không cuộn. Đó không phải là giải pháp tôi đang tìm kiếm."
Craig McQueen

2
cố gắng plugin bạn đề cập chỉ làm rối tiêu đề bảng của tôi. Không thể sử dụng nó.
pavel_kazlou

0

Thật đáng thất vọng khi những gì hoạt động tốt trong một trình duyệt không hoạt động ở những trình duyệt khác. Các hoạt động sau đây trong Firefox, nhưng không có trong Chrome hoặc IE:

<table width="80%">

 <thead>

 <tr>
  <th>Column 1</th>
  <th>Column 2</th>
  <th>Column 3</th>
 </tr>

 </thead>

 <tbody style="height:50px; overflow:auto">

  <tr>
    <td>Cell A1</td>
    <td>Cell B1</td>
    <td>Cell C1</td>
  </tr>

  <tr>
    <td>Cell A2</td>
    <td>Cell B2</td>
    <td>Cell C2</td>
  </tr>

  <tr>
    <td>Cell A3</td>
    <td>Cell B3</td>
    <td>Cell C3</td>
  </tr>

 </tbody>

</table>

4
Tôi đang thử nó trong Firefox 8.0 và dường như nó không làm gì cả. Nó làm gì?
Craig McQueen

pxgì Có phải đó là đơn vị kế thừa được mọi người sử dụng vào ngày 90 khi một thiết bị hiển thị được sử dụng để có 72 dpi?
ceving

Tôi đồng ý: Thật là bực bội, Thật không may, các nhà phát triển trình duyệt không tôn trọng các tiêu chuẩn trong mọi tình huống ... và một số năm trước thậm chí còn tồi tệ hơn! Bây giờ một số vấn đề đã được giải quyết và nhiều trình duyệt hoạt động theo cách chuẩn hơn, nhưng vẫn còn nhiều bước phải thực hiện: hãy hy vọng và cầu nguyện :-)
willy wonka
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.