Colspan tất cả các cột


385

Làm cách nào tôi có thể chỉ định một tdthẻ nên trải rộng tất cả các cột (khi số lượng cột chính xác trong bảng sẽ thay đổi / khó xác định khi HTML được hiển thị)? w3schools đề cập đến bạn có thể sử dụng colspan="0", nhưng nó không nói chính xác trình duyệt nào hỗ trợ giá trị đó (IE 6 nằm trong danh sách của chúng tôi để hỗ trợ).

Có vẻ như cài đặt colspanthành một giá trị lớn hơn số lượng cột lý thuyết mà bạn có thể có sẽ hoạt động, nhưng nó sẽ không hoạt động nếu bạn đã table-layoutđặt thành fixed. Có bất kỳ nhược điểm nào khi sử dụng bố cục tự động với số lượng lớn colspankhông? Có cách nào đúng hơn để làm điều này?


Câu trả lời được chấp nhận là về cách KHÔNG làm điều này, và nó dường như có nhược điểm nghiêm trọng về hiệu suất / tính nhất quán. Vì vậy, tôi đoán câu trả lời là: hardcode số lượng cột. Tôi không thấy bất kỳ sự thay thế khả thi nào.
Andrew Koster

Câu trả lời:


268

Tôi có IE 7.0, Firefox 3.0 và Chrome 1.0

Thuộc tính colspan = "0" trong TD KHÔNG trải dài trên tất cả các TD trong bất kỳ trình duyệt nào ở trên .

Có thể không được khuyến nghị là thực hành đánh dấu thích hợp, nhưng nếu bạn cho giá trị colspan cao hơn tổng số không có thể. của các cột trong các hàng khác , sau đó TD sẽ trải rộng tất cả các cột.

Điều này KHÔNG hoạt động khi thuộc tính CSS bố trí bảng được đặt thành cố định.

Một lần nữa, đây không phải là giải pháp hoàn hảo nhưng dường như hoạt động trong 3 phiên bản trình duyệt được đề cập ở trên khi thuộc tính CSS bố trí bảng là tự động . Hi vọng điêu nay co ich.


Nếu bạn chỉ định một loại tài liệu nghiêm ngặt khi bắt đầu html Firefox 3 sẽ hiển thị colspan theo yêu cầu của thông số kỹ thuật html 4.01.
Eineki

253
Tôi là một fan hâm mộ của colspan="42"toàn bộ phạm vi. Rõ ràng đây là một vấn đề đối với> 42 cột, nhưng đó là một trong số ít các số ma thuật tôi chấp nhận.
Martin Carney

40
Tôi thực sự khuyên bạn nên đặt colspan = <số chính xác chính xác>. Tôi vừa gặp một lỗi hoàn hảo rất lớn trong Firefox khiến tôi mất cả ngày để tìm ra. Một colspan lớn tùy ý sẽ khiến FF nghẹt thở trên một cái bàn lớn với sự sụp đổ biên: sụp đổ. Bảng của tôi với 800 hàng và 8 cột mất 5 giây để hiển thị. Với colspan đúng, nó lùi xuống 1 giây hợp lý. bugzilla.mozilla.org/show_orms.cgi?id=675417
InfinitiesLoop

2
Tôi khuyên bạn không nên sử dụng phương pháp này. Chỉ nhận được kết quả rất lạ từ Chrome trên OSX (các cột chồng chéo lên nhau).
Tzach

một vấn đề khác được tìm thấy trong Chrome nếu bạn cố gắng cung cấp đường viền cho phần tử TR có chứa TD "quá khổ", đường viền bên phải sẽ không hiển thị.
Massimo

272

Chỉ cần sử dụng này:

colspan="100%"

Nó hoạt động trên Firefox 3.6, IE 7 và Opera 11! (và tôi đoán người khác, tôi không thể thử)


Cảnh báo: như đã đề cập trong các bình luận bên dưới, điều này thực sự giống như colspan="100". Do đó, giải pháp này sẽ phá vỡ các bảng có css table-layout: fixedhoặc hơn 100 cột.


16
Đã thử nghiệm [bổ sung] trong IE6 - IE8, Chrome [trên PC và Mac], Firefox 4.0 [PC và Mac], Safari 5 [PC và Mac]
hndcrftd

11
Làm thế nào điều này vẫn còn tối nghĩa? Điều này nên được hét lên trên mọi góc phố !!! Tôi đã phải vật lộn với vấn đề colspan chết tiệt này vào những thời điểm khác nhau trong một thời gian khá lâu
hndcrftd

30
Trên chrome và firefox, colspan = "3%" được xử lý giống như colspan = "3".
zpmorgan

98
@zpmorgan và @Sprog, bạn đã đúng! colspan="100%"có nghĩa là chính xác colspan="100".
NemoStein

37
Lol, tôi đã rất vui khi cuối cùng cũng thấy một giải pháp đa trình duyệt phù hợp cho vấn đề này, chỉ để tìm hiểu qua các bình luận rằng đây thực sự là một trò lừa đảo không hoạt động như mong đợi :( Tôi nghĩ rằng nó không xứng đáng được nâng cấp hơn hơn câu trả lời được chấp nhận = /
Francisco

64

Nếu bạn muốn tạo một ô 'title' bao trùm tất cả các cột, làm tiêu đề cho bảng của bạn, bạn có thể muốn sử dụng thẻ chú thích ( http://www.w3schools.com/tags/tag_caption.asp / https: // developer.mozilla.org/en-US/docs/Web/HTML/Euity/caption) Yếu tố này có nghĩa cho mục đích này. Nó hoạt động như một div, nhưng không trải rộng toàn bộ chiều rộng của cha mẹ của bảng (giống như một div sẽ làm ở cùng một vị trí (đừng thử điều này ở nhà!)), Thay vào đó, nó trải dài theo chiều rộng của bàn. Có một số vấn đề về trình duyệt chéo với đường viền và như vậy (được chấp nhận đối với tôi). Dù sao, bạn có thể làm cho nó trông giống như một ô kéo dài tất cả các cột. Trong, bạn có thể tạo các hàng bằng cách thêm các phần tử div. Tôi không chắc liệu bạn có thể chèn nó vào giữa các yếu tố tr không, nhưng đó sẽ là một hack tôi đoán (vì vậy không nên). Một lựa chọn khác sẽ gây rối với các div nổi, nhưng đó là yuck!

Làm

<table>
    <caption style="gimme some style!"><!-- Title of table --></caption>
    <thead><!-- ... --></thead>
    <tbody><!-- ... --></tbody>
</table>

Đừng

<div>
    <div style="float: left;/* extra styling /*"><!-- Title of table --></div>
    <table>
        <thead><!-- ... --></thead>
        <tbody><!-- ... --></tbody>
    </table>
    <div style="clear: both"></div>
</div>

1
Chính xác những gì tôi đang tìm kiếm để đặt các điều khiển phân trang ở dưới cùng của một dữ liệu. Nó hoạt động hoàn hảo. Cảm ơn rât nhiều.
Comencau

5
Điều này không hoạt động nếu bạn muốn kéo dài tất cả các cols ở giữa một bảng..như là nhóm bằng dấu phân cách giữa các nhóm hàng liên quan. (Chrome)
David Hempy

17

Như một câu trả lời một phần, đây là một vài điểm về colspan="0", được đề cập trong câu hỏi.

phiên bản tl; dr:

colspan="0"không hoạt động trong bất kỳ trình duyệt nào. W3Schools là sai (như thường lệ). HTML 4 nói rằng colspan="0"sẽ khiến một cột trải dài toàn bộ bảng, nhưng không ai thực hiện điều này và nó đã bị xóa khỏi thông số kỹ thuật sau HTML 4.

Một số chi tiết và bằng chứng:

  • Tất cả các trình duyệt chính coi nó là tương đương với colspan="1".

    Đây là một bản demo cho thấy điều này; Hãy thử nó trên bất kỳ trình duyệt nào bạn thích.

    td {
      border: 1px solid black;
    }
    <table>
      <tr>
        <td>ay</td>
        <td>bee</td>
        <td>see</td>
      </tr>
      <tr>
        <td colspan="0">colspan="0"</td>
      </tr>
      <tr>
        <td colspan="1">colspan="1"</td>
      </tr>
      <tr>
        <td colspan="3">colspan="3"</td>
      </tr>
      <tr>
        <td colspan="1000">colspan="1000"</td>
      </tr>
    </table>

  • Thông số kỹ thuật HTML 4 (hiện đã cũ và đã lỗi thời, nhưng hiện tại trở lại khi câu hỏi này được hỏi) thực sự đã nói rằng colspan="0"nên được coi là bao trùm tất cả các cột:

    Giá trị 0 ("0") có nghĩa là ô kéo dài tất cả các cột từ cột hiện tại đến cột cuối cùng của nhóm cột (COLGROUP) trong đó ô được xác định.

    Tuy nhiên, hầu hết các trình duyệt không bao giờ thực hiện điều này.

  • HTML 5.0 (đã đưa ra khuyến nghị ứng cử viên vào năm 2012), tiêu chuẩn sống WhatWG HTML (tiêu chuẩn thống trị hiện nay) và tất cả thông số kỹ thuật W3 HTML 5 mới nhất đều không chứa từ ngữ được trích dẫn từ HTML 4 ở trên và nhất trí đồng ý rằng colspan0 không được phép, với từ ngữ này xuất hiện trong cả ba thông số kỹ thuật:

    Các phần tử tdthcó thể có một colspanthuộc tính nội dung được chỉ định, có giá trị phải là số nguyên không âm hợp lệ lớn hơn 0 ...

    Nguồn:

  • Các khiếu nại sau đây từ trang W3Schools được liên kết đến trong câu hỏi là - ít nhất là ngày nay - hoàn toàn sai:

    Chỉ Firefox hỗ trợ colspan = "0", có ý nghĩa đặc biệt ... [Nó] bảo trình duyệt mở rộng ô đến cột cuối cùng của nhóm cột (colgroup)

    Sự khác biệt giữa HTML 4.01 và HTML5

    KHÔNG AI.

    Nếu bạn chưa biết rằng W3Schools thường bị các nhà phát triển web khinh miệt vì sự không chính xác thường xuyên của nó, hãy xem đây là một bài học tại sao.


4
Haha Tôi thích cách các tính năng API hữu ích chỉ bị xóa hoàn toàn khi không có ai thực hiện chúng. Quá trình tuyệt vời.
Andrew Koster

14

Đối với IE 6, bạn sẽ muốn bằng colspan với số lượng cột trong bảng của mình. Nếu bạn có 5 cột, thì bạn sẽ muốn:colspan="5" .

Lý do là IE xử lý colspans khác nhau, nó sử dụng đặc tả HTML 3.2:

IE thực hiện định nghĩa HTML 3.2, nó đặt colspan=0colspan=1.

Các lỗi được ghi lại .


1
Số lượng cột có thể thay đổi, tôi sẽ cập nhật câu hỏi của tôi để bao gồm nhận xét đó.
Bob

Mặc dù lời khuyên ở đoạn trên có vẻ hợp lý, tôi nghĩ rằng nhiều chi tiết ở đây không hoàn toàn đúng. Các HTML 3.2 đặc tả nói rằng colspans phải tích cực số nguyên, mà làm colspan=0bất hợp pháp; không nơi nào ra lệnh rõ ràng colspan=0nên được xử lý như vậy colspan=1(mặc dù tôi chắc chắn đó thực tế là những gì IE 6 làm). Ngoài ra, trích dẫn không còn (còn nữa?) Ở bất kỳ đâu trên trang diễn đàn mà bạn liên kết đến và hầu hết các kết quả tìm kiếm của Google (bây giờ?) Là về các lỗi hoàn toàn khác nhau liên quan đến IE 6 colspan.
Đánh dấu Amery

11

Nếu bạn đang sử dụng jQuery (hoặc không nhớ thêm nó), điều này sẽ giúp công việc được thực hiện tốt hơn bất kỳ hack nào trong số này.

function getMaxColCount($table) {
    var maxCol = 0;

    $table.find('tr').each(function(i,o) {
        var colCount = 0;
        $(o).find('td:not(.maxcols),th:not(.maxcols)').each(function(i,oo) {
            var cc = Number($(oo).attr('colspan'));
            if (cc) {
                colCount += cc;
            } else {
                colCount += 1;
            }
        });
        if(colCount > maxCol) { maxCol = colCount };
    });

    return maxCol;

}

Để dễ dàng thực hiện, tôi trang trí bất kỳ td / th nào tôi cần điều chỉnh bằng một lớp như "maxCol" thì tôi có thể làm như sau:

$('td.maxcols, th.maxcols').each(function(i,o) {
    $t = $($(o).parents('table')[0]); $(o).attr('colspan',  getMaxColCount($t));
});

Nếu bạn thấy việc triển khai này sẽ không hiệu quả, đừng bỏ qua câu trả lời, giải thích trong các bình luận và tôi sẽ cập nhật nếu nó có thể được bảo hiểm.


1
Sẽ thật tuyệt nếu bạn có phiên bản vanilla JS
jpaugh

Bạn có trường hợp sử dụng phổ biến thiếu hỗ trợ $ (bộ chọn) hoặc chỉ không muốn sử dụng nó?
rainabba

1
Cũng không. Tôi chỉ tò mò liệu jQuery có thêm bất kỳ lợi ích nào ở đây không; đó là một điều kiện tiên quyết khá lớn, và có vẻ như nó chỉ được sử dụng tối thiểu ở đây.
jpaugh

Đủ công bằng. Giữa jQuery và Angular, thật hiếm khi tôi không có những công cụ đó nên tôi mặc định chúng. Bây giờ tôi sẽ để nó cho người khác đến với phiên bản vanilla.
rainabba

1
Vì jQuery hơi lỗi thời nên tôi đã thêm phiên bản / câu trả lời es6 (không muốn cập nhật câu trả lời này với mã hoàn toàn khác).
Sjeiti

5

Một giải pháp hiệu quả nhưng xấu xí khác : colspan="100", trong đó 100 là giá trị lớn hơn tổng số cột bạn cần colspan.

Theo W3C, colspan="0"tùy chọn chỉ hợp lệ với COLGROUPthẻ.


colspan = "100" (ví dụ vượt quá giới hạn) có thể gây ra kết xuất bảng rất lạ trong một số trường hợp (Tôi sẽ cố gắng tìm kiếm một số trường hợp kiểm tra và đăng URL)
scunliffe

-1 vì theo như tôi có thể xác định yêu cầu trong đoạn cuối là sai. HTML 4 cho phép <td>s có colspan="0"(xem w3.org/TR/REC-html40/struct/tables.html#adef-colspan ), trong khi HTML 5.0 không cho phép span="0"trên colgroup(xem w3.org/TR/html50/tabular- data.html # attr-colgroup-spannội dung rằng "giá trị thuộc tính span ['s] phải là số nguyên không âm hợp lệ lớn hơn 0." ).
Đánh dấu Amery

2

Dưới đây là một giải pháp es6 ngắn gọn (tương tự như câu trả lời của Rainbabba nhưng không có jQuery).

Array.from(document.querySelectorAll('[data-colspan-max]')).forEach(td => {
    let table = td;
    while (table && table.nodeName !== 'TABLE') table = table.parentNode;
    td.colSpan = Array.from(table.querySelector('tr').children).reduce((acc, child) => acc + child.colSpan, 0);
});
html {
  font-family: Verdana;
}
tr > * {
  padding: 1rem;
  box-shadow: 0 0 8px gray inset;
}
<table>
<thead>
  <tr>
    <th>Header 1</th>
    <th>Header 2</th>
    <th>Header 3</th>
    <th>Header 4</th>
    <th>Header 5</th>
    <th>Header 6</th>
  </tr>
</thead>
<tbod><tr>
  <td data-colspan-max>td will be set to full width</td>
</tr></tbod>
</table>


-1

Chỉ muốn thêm kinh nghiệm của tôi và trả lời cho điều này.
Lưu ý: Nó chỉ hoạt động khi bạn có một định nghĩa trước tabletrvớith s, nhưng đang tải trong các hàng của bạn (ví dụ thông qua AJAX) một cách linh hoạt.

Trong trường hợp này, bạn có thể đếm số lượng th có trong hàng tiêu đề đầu tiên của mình và sử dụng số đó để kéo dài toàn bộ cột.

Điều này có thể cần thiết khi bạn muốn chuyển tiếp tin nhắn khi không tìm thấy kết quả.

Một cái gì đó như thế này trong jQuery, tablebảng đầu vào của bạn ở đâu:

var trs = $(table).find("tr");
var numberColumns = 999;
if (trs.length === 1) {
    //Assume having one row means that there is a header
    var headerColumns = $(trs).find("th").length;
    if (headerColumns > 0) {
        numberColumns = headerColumns;
    }
}

Giống như giải pháp JavaScript được đăng trước đó , giải pháp này không khái quát tốt; số lượng ths không nhất thiết là số lượng cột, vì một số trong số chúng có thể có một colspantập hợp, và vì vậy điều này sẽ không hoạt động như được viết cho tất cả mọi người.
Đánh dấu Amery

-2

Có thể tôi là một người suy nghĩ thẳng thắn nhưng tôi hơi bối rối, bạn không biết số cột của bảng sao?

Bằng cách này, IE6 không tôn vinh colspan = "0", có hoặc không có một nhóm được xác định. Tôi cũng đã thử sử dụng thead và th để tạo các nhóm cột nhưng trình duyệt không nhận ra dạng colspan = "0".

Tôi đã thử với Firefox 3.0 trên windows và linux và nó chỉ hoạt động với một loại tài liệu nghiêm ngặt.

Bạn có thể kiểm tra một bài kiểm tra trên một số bowser tại

http://browsersshots.org/http://hsivonen.iki.fi/test/wa10/tables/colspan-0.html

Tôi tìm thấy trang thử nghiệm ở đây http://hsivonen.iki.fi/test/wa10/tables/colspan-0.html

Chỉnh sửa: Vui lòng sao chép và dán liên kết, định dạng sẽ không chấp nhận các phần giao thức kép trong liên kết (hoặc tôi không thông minh để định dạng chính xác cho liên kết đó).


Tôi đồng ý về phần đầu tiên: chắc chắn bạn có thể biết mình sẽ có bao nhiêu ô trong hàng? Làm thế nào khác bạn sẽ tạo ra nó?
nickf

13
Không nhất thiết, tôi có một ứng dụng có bảng AJAX được tạo động và số lượng cột có thể thay đổi từ gọi lại sang gọi lại. Ngoài ra, khi phát triển, bạn có thể "biết" số lượng cột, nhưng điều này có thể thay đổi và bạn chỉ biết rằng bạn sẽ bỏ lỡ một trong số đó
Mad Halfling

11
Ngoài ra, nếu bạn thêm các cột sau này, bạn có thể quên thay đổi colspan, tốt hơn là luôn luôn ở mức tối đa.
Adam

-2

Theo đặc điểm kỹ thuật colspan="0"nên dẫn đến một chiều rộng bảng td.

Tuy nhiên, điều này chỉ đúng nếu bảng của bạn có chiều rộng! Một bảng có thể chứa các hàng có chiều rộng khác nhau. Vì vậy, trường hợp duy nhất mà trình kết xuất biết chiều rộng của bảng nếu bạn xác định một nhóm ! Mặt khác, kết quả của colspan = "0" là không thể xác định được ...

http://www.w3.org/TR/REC-html40/struct/tables.html#adef-colspan

Tôi không thể kiểm tra nó trên các trình duyệt cũ hơn, nhưng đây là một phần của đặc tả kể từ 4.0 ...


"Đây là một phần của đặc tả từ 4.0" - Không, không chính xác. Nó một phần của đặc tả, nhưng điều này đã bị xóa trong HTML 5 và colspan0 là bất hợp pháp. Cả w3.org/TR/html50/ ((thông số HTML 5.0) và html.spec.whatwg.org/multipage/, (trạng thái Cuộc sống HTML WhatWG mới nhất) colspanphải lớn hơn 0. Và như đã lưu ý trong các câu trả lời khác ở đây, các trình duyệt chưa bao giờ thực sự thực hiện hành vi HTML 4 cũ mà bạn trích dẫn.
Đánh dấu Amery

-6

hãy thử sử dụng "colSpan" thay vì "colspan". IE thích phiên bản camelBack ...


4
chỉ khi sử dụng IE và cài đặt qua JavaScript và .setAttribution ('colSpan', int); Lưu ý rằng điều này đã được sửa trong IE8 (chỉ ở chế độ stds)
scunliffe

1
+1 - Tôi không biết điều này và đó là một sự trợ giúp lớn! Tôi đã không nghĩ colSpan thậm chí đã làm việc trong IE6.
mwilcox
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.