Colspan wszystkie kolumny

385

Jak mogę określić, że tdznacznik powinien obejmować wszystkie kolumny (kiedy dokładna liczba kolumn w tabeli będzie zmienna / trudno określić, kiedy renderowany jest HTML)? w3schools wspomina, że ​​możesz użyć colspan="0", ale nie mówi dokładnie, jakie przeglądarki obsługują tę wartość (IE 6 jest na naszej liście do obsługi).

Wygląda na to, że ustawienie colspanwartości większej niż teoretyczna liczba kolumn, które możesz mieć, zadziała, ale nie zadziała, jeśli table-layoutustawiłeś opcję fixed. Czy są jakieś wady korzystania z automatycznego układu z dużą liczbą colspan? Czy istnieje bardziej poprawny sposób na zrobienie tego?

Kok
źródło
Przyjęta odpowiedź dotyczy tego, w jaki sposób NIE należy tego robić i wydaje się, że ma poważne wady wydajności / spójności. Wydaje mi się, że odpowiedź brzmi: zakoduj liczbę kolumn. Nie widzę żadnej realnej alternatywy.
Andrew Koster,

Odpowiedzi:

268

Mam IE 7.0, Firefox 3.0 i Chrome 1.0

Atrybut colspan = "0" w TD NIE obejmuje wszystkich TD w żadnej z powyższych przeglądarek .

Może nie jest to zalecane jako właściwa praktyka znaczników, ale jeśli podasz wyższą wartość colspan niż całkowita możliwa nie. kolumn w innych wierszach , TD objąłby wszystkie kolumny.

To NIE działa, gdy właściwość CSS układu tabeli jest ustawiona na stałą.

Po raz kolejny nie jest to idealne rozwiązanie, ale wydaje się działać w wyżej wymienionych 3 wersjach przeglądarki, gdy właściwość CSS układu tabeli jest automatyczna . Mam nadzieję że to pomoże.

Nahom Tijnam
źródło
Jeśli podasz ścisły typ dokumentu na samym początku html Firefox 3, renderuj colspan zgodnie z wymaganiami specyfikacji html 4.01.
Eineki
253
Jestem fanem colspan="42"rozciągania się na cały zakres. Jest to oczywiście problem dla> 42 kolumn, ale jest to jedna z niewielu magicznych liczb, które zatwierdzam.
Martin Carney
40
Gorąco polecam wstawienie colspan = <dokładna poprawna liczba>. Właśnie trafiłem na ogromny błąd perf w Firefoksie, który wymyślił cały dzień. Dowolnie duży colspan sprawi, że FF dusi się na dużym stole z border-collapse: collapse. Renderowanie mojej tabeli z 800 wierszami i 8 kolumnami zajęło 5 sekund. Przy odpowiednim rozpiętości colspan wraca do rozsądnej 1 sekundy. bugzilla.mozilla.org/show_bug.cgi?id=675417
InfinitiesLoop
2
Polecam nie używać tej metody. Właśnie uzyskałem bardzo dziwny wynik z Chrome na OSX (nakładające się kolumny).
Tzach,
inny problem wykryty w Chrome, jeśli spróbujesz nadać ramce element TR, który zawiera TD „oversize”, prawa ramka nie będzie widoczna.
Massimo
271

Po prostu użyj tego:

colspan="100%"

Działa na Firefox 3.6, IE 7 i Opera 11! (i chyba na innych, nie mogłem spróbować)


Ostrzeżenie: jak wspomniano w komentarzach poniżej, w rzeczywistości jest to to samo co colspan="100". Dlatego to rozwiązanie zostanie zepsute dla tabel z css table-layout: fixedlub więcej niż 100 kolumnami.

Cluxter
źródło
16
Testowane [dodatkowo] w IE6 - IE8, Chrome [na PC i Mac], Firefox 4.0 [PC i Mac], Safari 5 [PC i Mac]
hndcrftd
11
Jak to jest wciąż tak niejasne? To powinno być wykrzykiwane na każdym rogu ulicy !!! Od dłuższego czasu zmagam się z tym przeklętym problemem colspan
hndcrftd
30
W chrome i firefox colspan = „3%” jest obsługiwane tak samo jak colspan = „3”.
zpmorgan
98
@zpmorgan i @Sprog, masz rację! colspan="100%"znaczy dokładnie colspan="100".
NemoStein,
37
Lol, bardzo się ucieszyłem, widząc w końcu spójne rozwiązanie tego problemu dla różnych przeglądarek, ale dzięki komentarzom stwierdziłem, że jest to rzeczywiście zwodnicze, nie działające zgodnie z oczekiwaniami :( Myślę, że nie zasługuje na więcej głosów pozytywnych niż zaakceptowana odpowiedź = /
Francisco
64

Jeśli chcesz utworzyć komórkę „tytułową” obejmującą wszystkie kolumny, jako nagłówek tabeli, możesz użyć tagu podpisu ( http://www.w3schools.com/tags/tag_caption.asp / https: // developer.mozilla.org/en-US/docs/Web/HTML/Element/caption) Ten element jest przeznaczony do tego celu. Zachowuje się jak div, ale nie obejmuje całej szerokości elementu nadrzędnego tabeli (tak jak div zrobiłby to w tej samej pozycji (nie próbuj tego w domu!)), Zamiast tego obejmuje szerokość stół. Istnieją pewne problemy z ramkami w różnych przeglądarkach i takie (było to dla mnie akceptowalne). W każdym razie możesz sprawić, że będzie wyglądać jak komórka obejmująca wszystkie kolumny. Wewnątrz możesz tworzyć rzędy, dodając elementy div. Nie jestem pewien, czy możesz wstawić go między tr-elementy, ale chyba byłby to hack (więc nie jest to zalecane). Inną opcją byłoby mieszanie się z pływającymi divami, ale to fuj!

Zrobić

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

Nie rób

<div>
    <div style="float: left;/* extra styling /*"><!-- Title of table --></div>
    <table>
        <thead><!-- ... --></thead>
        <tbody><!-- ... --></tbody>
    </table>
    <div style="clear: both"></div>
</div>
natevw
źródło
1
Dokładnie to, czego szukałem, aby umieścić elementy sterujące paginacją na dole pliku danych. Działa idealnie. Dziękuję Ci bardzo.
Comencau,
5
Nie działa to, jeśli chcesz rozciągać wszystkie kolumny na środku tabeli, takie jak grupa po separatorze między powiązanymi grupami wierszy. (Chrome)
David Hempy
17

Jako częściową odpowiedź, oto kilka punktów na temat colspan="0", o których wspomniano w pytaniu.

wersja tl; dr:

colspan="0"nie działa w żadnej przeglądarce. W3Schools jest zły (jak zwykle). HTML 4 powiedział, że colspan="0"powinno to spowodować, że kolumna obejmie całą tabelę, ale nikt tego nie zaimplementował i został on usunięty ze specyfikacji po HTML 4.

Więcej szczegółów i dowodów:

  • Wszystkie główne przeglądarki traktują to jako odpowiednik colspan="1".

    Oto demo pokazujące to; wypróbuj w dowolnej przeglądarce.

    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>

  • HTML 4 Spec (obecnie stare i przestarzałe, ale prąd z powrotem, kiedy to pytano) było rzeczywiście powiedzieć , że colspan="0"powinny być traktowane jako obejmujące wszystkie kolumny:

    Wartość zero („0”) oznacza, że ​​komórka obejmuje wszystkie kolumny od bieżącej kolumny do ostatniej kolumny grupy kolumn (COLGROUP), w której komórka jest zdefiniowana.

    Jednak większość przeglądarek nigdy tego nie implementowała.

  • HTML 5.0 (zalecenie dla kandydata w 2012 r.), Standard życia WhatWG HTML (obecnie dominujący standard) oraz najnowsza specyfikacja W3 HTML 5 nie zawierają sformułowania cytowanego w HTML 4 powyżej i jednogłośnie zgadzają się, że a colspanz 0 jest niedozwolone, przy takim sformułowaniu, które występuje we wszystkich trzech specyfikacjach:

    Elementy tdi thmogą mieć colspanokreślony atrybut treści, którego wartość musi być prawidłową nieujemną liczbą całkowitą większą niż zero ...

    Źródła:

  • Następujące twierdzenia ze strony W3Schools, do której odsyłają pytania, są - przynajmniej w dzisiejszych czasach - całkowicie fałszywe:

    Tylko Firefox obsługuje colspan = "0", co ma specjalne znaczenie ... [To] mówi przeglądarce, aby rozciągnęła komórkę na ostatnią kolumnę grupy kolumn (colgroup)

    i

    Różnice między HTML 4.01 i HTML5

    ŻADEN.

    Jeśli jeszcze nie wiesz, że twórcy stron internetowych zlekceważyli W3Schools z powodu częstych nieścisłości, zastanów się nad tym, dlaczego tak jest.

Mark Amery
źródło
4
Haha Podoba mi się, jak przydatne funkcje API zostały całkowicie usunięte, gdy nikt nie chce ich wdrożyć. Niesamowity proces.
Andrew Koster,
14

W przypadku IE 6 będziesz chciał równać colspan z liczbą kolumn w tabeli. Jeśli masz 5 kolumn, a następnie będziemy chcieli: colspan="5".

Powodem jest to, że IE inaczej obsługuje colspany , używa specyfikacji HTML 3.2:

IE implementuje definicję HTML 3.2, ustawia colspan=0jako colspan=1.

Błąd jest dobrze udokumentowany .

George Stocker
źródło
1
Liczba kolumn może być zmienna, zaktualizuję moje pytanie, aby uwzględnić tę uwagę.
Bob
Chociaż porady w pierwszym akapicie wydają się rozsądne, uważam, że wiele szczegółów tutaj nie jest do końca poprawnych. Specyfikacja HTML 3.2 mówi, że colspans muszą być dodatnimi liczbami całkowitymi, co czyni colspan=0nielegalnym; nigdzie nie jest to jednoznacznie narzucone, że colspan=0powinno się z tym postępować colspan=1(chociaż jestem pewien, że tak właśnie robi IE 6). Ponadto cytat nie jest (już?) Nigdzie na stronie forum, do której prowadzi link, a większość wyników wyszukiwania Google (teraz?) Dotyczy całkowicie różnych błędów związanych z kolspanem w IE 6.
Mark Amery
11

Jeśli używasz jQuery (lub nie masz nic przeciwko dodaniu go), zadanie to zostanie wykonane lepiej niż którykolwiek z tych hacków.

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;

}

Aby ułatwić implementację, dekoruję dowolne td / th, które muszę dostosować za pomocą klasy takiej jak „maxCol”, a następnie mogę wykonać następujące czynności:

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

Jeśli znajdziesz implementację, dla której to nie zadziała, nie zatrzaskuj odpowiedzi, wyjaśnij w komentarzach, a ja zaktualizuję, czy można to uwzględnić.

rainabba
źródło
1
Byłoby wspaniale, gdybyś miał waniliową wersję JS
jpaugh
Czy masz typowy przypadek użycia, który nie obsługuje $ (selektora), czy po prostu nie chcesz go używać?
rainabba
1
Ani. Jestem tylko ciekawy, czy jQuery dodaje tu jakieś korzyści; jest to dość spory warunek wstępny i wygląda na to, że jest tu tylko minimalnie używany.
jpaugh
Słusznie. Pomiędzy jQuery i Angular, rzadko mam takie narzędzia, więc domyślnie je używam. Jednak pozostawiam to komuś innemu, aby opracował wersję waniliową.
rainabba
1
Ponieważ jQuery jest nieco przestarzałe, dodałem wersję / odpowiedź es6 (nie chciałem aktualizować tej odpowiedzi za pomocą zupełnie innego kodu).
Sjeiti
5

Kolejne działające, ale brzydkie rozwiązanie: colspan="100"gdzie 100 jest wartością większą niż całkowita liczba kolumn, której potrzebujesz colspan.

Zgodnie z W3C colspan="0"opcja jest ważna tylko z COLGROUPtagiem.

Raptor
źródło
colspan = "100" (np. poza limitem) może w niektórych przypadkach powodować bardzo dziwne renderowanie tabel (postaram się wyśledzić niektóre przypadki testowe i opublikować adresy URL)
scunliffe
-1, ponieważ o ile mogę ustalić, roszczenie w ostatnim akapicie jest fałszywe. HTML 4 pozwala na <td>s colspan="0"(patrz w3.org/TR/REC-html40/struct/tables.html#adef-colspan ), podczas gdy HTML 5.0 nie pozwala span="0"na colgroup(patrz w3.org/TR/html50/tabular- data.html # attr-colgroup-span, który stwierdza, że „wartość atrybutu zawartości zakresu musi być prawidłową nieujemną liczbą całkowitą większą od zera.” ).
Mark Amery
2

Poniżej znajduje się zwięzłe rozwiązanie es6 (podobne do odpowiedzi Rainbabba, ale bez 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>

Sjeiti
źródło
-1

Chcę tylko dodać moje doświadczenie i odpowiedzieć na to.
Uwaga: To działa tylko wtedy, gdy trzeba wstępnie zdefiniowane tablei trze ths, ale wkładanego swoich wierszy (na przykład za pośrednictwem AJAX) dynamicznie.

W takim przypadku możesz policzyć liczbę thpierwszych wierszy nagłówka i użyć ich do objęcia całej kolumny.

Może to być potrzebne, gdy chcesz przekazać komunikat, gdy nie znaleziono żadnych wyników.

Coś takiego w jQuery, gdzie tablejest twoja tabela wejściowa:

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;
    }
}
skiwi
źródło
Podobnie jak w przypadku opublikowanego wcześniej rozwiązania JavaScript , nie uogólnia się ono dobrze; liczba ths niekoniecznie jest liczbą kolumn, ponieważ niektóre z nich mogą mieć colspanzestaw, więc nie będzie to działać tak, jak napisano dla wszystkich.
Mark Amery
-2

Może jestem prostym myślicielem, ale jestem trochę zdziwiony, nie znasz numeru kolumny swojego stołu?

Nawiasem mówiąc, IE6 nie honoruje colspan = "0", ze zdefiniowaną grupą colg lub bez. Próbowałem także użyć thead i th do wygenerowania grup kolumn, ale przeglądarka nie rozpoznaje formy colspan = "0".

Próbowałem z Firefoksem 3.0 na Windows i Linux i działa tylko ze ścisłym typem dokumentu.

Możesz sprawdzić test na kilku Bowser na

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

Znalazłem stronę testową tutaj http://hsivonen.iki.fi/test/wa10/tables/colspan-0.html

Edycja: skopiuj i wklej link, formatowanie nie zaakceptuje części podwójnego protokołu w linku (lub nie jestem zbyt mądry, aby poprawnie sformatować).

Eineki
źródło
Zgadzam się co do pierwszej części: na pewno możesz dowiedzieć się, ile komórek będziesz mieć w rzędzie? Jak inaczej byś to wygenerował?
nickf
13
Niekoniecznie mam aplikację z dynamicznie generowaną tabelą AJAX, a liczba kolumn może się zmieniać z oddzwaniania na oddzwanianie. Ponadto podczas opracowywania możesz „znać” liczbę kolumn, ale może się to zmienić i po prostu wiesz , że przegapisz jedną z nich
Mad Halfling
11
Dodatkowo, jeśli dodasz kolumny później, możesz zapomnieć o zmianie zasięgu, lepiej mieć to zawsze na poziomie max.
Adam
-2

Zgodnie ze specyfikacją colspan="0"powinna mieć szerokość tabeli td.

Jest to jednak prawdą tylko wtedy, gdy twój stół ma szerokość! Tabela może zawierać wiersze o różnych szerokościach. Więc jedyny przypadek, w którym moduł renderujący zna szerokość tabeli, jeśli zdefiniujesz grupę colgroup ! W przeciwnym razie wynik colspan = "0" jest nieokreślony ...

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

Nie mogę go przetestować na starszych przeglądarkach, ale jest to część specyfikacji od 4.0 ...

FERcsI
źródło
„jest to część specyfikacji od 4.0” - Nie, nie do końca. Było to częścią specyfikacji, ale zostało to usunięte w HTML 5 i a colspanz 0 zostało uznane za nielegalne. Zarówno w3.org/TR/html50/… (specyfikacja HTML 5.0), jak i html.spec.whatwg.org/multipage/… (najnowszy standard WhatWG HTML Living Standard) colspanmuszą być większe od zera. I jak zauważono w innych odpowiedziach tutaj, przeglądarki nigdy nie implementowały starego cytowanego zachowania HTML 4.
Mark Amery
-6

spróbuj użyć „colSpan” zamiast „colspan”. IE lubi wersję camelBack ...


źródło
4
tylko przy korzystaniu z IE i ustawianiu przez JavaScript i .setAttribute ('colSpan', int); Uwaga: zostało to naprawione w IE8 (tylko w trybie stds)
scunliffe
1
+1 - nie wiedziałem o tym i to była ogromna pomoc! Nie sądziłem, że colSpan działa nawet w IE6.
mwilcox,