Colspan alle Spalten

385

Wie kann ich angeben, dass ein tdTag alle Spalten umfassen soll (wenn die genaue Anzahl der Spalten in der Tabelle variabel ist / schwer zu bestimmen ist, wann der HTML-Code gerendert wird)? w3schools erwähnt, dass Sie verwenden können colspan="0", aber es sagt nicht genau, welche Browser diesen Wert unterstützen (IE 6 ist in unserer Liste zu unterstützen).

Es scheint , diese Einstellung colspanauf einen Wert größer als die theoretische Menge von Spalten , die Sie arbeiten werden, aber es wird nicht funktionieren , wenn Sie table-layoutauf fixed. Gibt es irgendwelche Nachteile bei der Verwendung eines automatischen Layouts mit einer großen Anzahl für colspan? Gibt es einen korrekteren Weg, dies zu tun?

Bob
quelle
Die akzeptierte Antwort bezieht sich darauf, wie dies NICHT zu tun ist, und es scheint schwerwiegende Nachteile in Bezug auf Leistung und Konsistenz zu haben. Die Antwort lautet also: Die Anzahl der Spalten fest codieren. Ich sehe keine Alternative.
Andrew Koster

Antworten:

268

Ich habe IE 7.0, Firefox 3.0 und Chrome 1.0

Das Attribut colspan = "0" in einem TD erstreckt sich NICHT über alle TDs in einem der oben genannten Browser .

Möglicherweise nicht als richtige Markup-Übung empfohlen, aber wenn Sie einen höheren Colspan-Wert als den insgesamt möglichen Nein-Wert angeben. von Spalten in anderen Zeilen würde dann der TD alle Spalten überspannen.

Dies funktioniert NICHT, wenn die CSS-Eigenschaft für das Tabellenlayout auf "fest" gesetzt ist.

Dies ist wiederum nicht die perfekte Lösung, scheint jedoch in den oben genannten 3 Browserversionen zu funktionieren, wenn die CSS-Eigenschaft für das Tabellenlayout automatisch ist . Hoffe das hilft.

Nahom Tijnam
quelle
Wenn Sie gleich zu Beginn des HTML-Codes Firefox 3 einen strengen Doctype angeben, rendern Sie den Colspan gemäß den HTML 4.01-Spezifikationen.
Eineki
253
Ich bin ein Fan davon colspan="42", das gesamte Sortiment zu überspannen. Natürlich ist dies ein Problem für> 42 Spalten, aber es ist eine der wenigen magischen Zahlen, die ich gutheiße.
Martin Carney
40
Ich empfehle Ihnen dringend, colspan = <genaue korrekte Nummer> einzugeben. Ich habe gerade einen riesigen Perf-Bug in Firefox gefunden, der mich den ganzen Tag gekostet hat, um es herauszufinden. Ein beliebig großer Colspan lässt FF an einem großen Tisch mit Border-Collapse ersticken: Collapse. Das Rendern meiner Tabelle mit 800 Zeilen und 8 Spalten dauerte 5 Sekunden. Mit dem richtigen Colspan ist es wieder eine vernünftige Sekunde. bugzilla.mozilla.org/show_bug.cgi?id=675417
InfinitiesLoop
2
Ich empfehle, diese Methode nicht zu verwenden. Ich habe gerade ein sehr seltsames Ergebnis von Chrome unter OSX erhalten (Spalten überlappen sich).
Tzach
Ein weiteres Problem in Chrome: Wenn Sie versuchen, dem TR-Element, das das TD "Übergröße" enthält, einen Rahmen zuzuweisen, wird der rechte Rand nicht angezeigt.
Massimo
272

Verwenden Sie einfach dies:

colspan="100%"

Es funktioniert unter Firefox 3.6, IE 7 und Opera 11! (und ich denke bei anderen konnte ich es nicht versuchen)


Warnung: Wie in den Kommentaren unten erwähnt, ist dies tatsächlich dasselbe wie colspan="100". Daher wird diese Lösung für Tabellen mit CSS table-layout: fixedoder mehr als 100 Spalten unterbrochen .

Cluxter
quelle
16
Getestet [zusätzlich] in IE6 - IE8, Chrome [auf PC und Mac], Firefox 4.0 [PC und Mac], Safari 5 [PC und Mac]
hndcrftd
11
Wie ist das noch so dunkel? Dies sollte an jeder Straßenecke gerufen werden !!! Ich habe jetzt schon eine ganze Weile mit diesem verdammten Colspan-Problem zu verschiedenen Zeiten zu kämpfen
Uhr
30
Bei Chrome und Firefox wird colspan = "3%" genauso behandelt wie colspan = "3".
zpmorgan
98
@zpmorgan und @Sprog, du hast recht! colspan="100%"bedeutet genau colspan="100".
NemoStein
37
Lol, ich war sehr froh, endlich eine konsistente browserübergreifende Lösung für dieses Problem zu finden, nur um durch die Kommentare herauszufinden, dass dies tatsächlich eine trügerische ist, die nicht wie erwartet funktioniert :( Ich denke, es verdient keine weiteren Upvotes als die akzeptierte Antwort = /
Francisco
64

Wenn Sie als Titel für Ihre Tabelle eine Titelzelle erstellen möchten, die alle Spalten umfasst, können Sie das Untertitel-Tag ( http://www.w3schools.com/tags/tag_caption.asp / https: //) verwenden developer.mozilla.org/en-US/docs/Web/HTML/Element/caption) Dieses Element ist für diesen Zweck gedacht. Es verhält sich wie ein Div, erstreckt sich jedoch nicht über die gesamte Breite des übergeordneten Tisches der Tabelle (wie es ein Div an derselben Position tun würde (versuchen Sie dies nicht zu Hause!)), Sondern über die gesamte Breite des Tabelle. Es gibt einige browserübergreifende Probleme mit Rahmen und dergleichen (war für mich akzeptabel). Wie auch immer, Sie können es als eine Zelle aussehen lassen, die alle Spalten umfasst. Innerhalb können Sie Zeilen erstellen, indem Sie div-Elemente hinzufügen. Ich bin mir nicht sicher, ob Sie es zwischen tr-Elementen einfügen können, aber das wäre ein Hack, denke ich (also nicht empfohlen). Eine andere Möglichkeit wäre, mit schwebenden Divs herumzuspielen, aber das ist igitt!

Tun

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

Tu es nicht

<div>
    <div style="float: left;/* extra styling /*"><!-- Title of table --></div>
    <table>
        <thead><!-- ... --></thead>
        <tbody><!-- ... --></tbody>
    </table>
    <div style="clear: both"></div>
</div>
natevw
quelle
1
Genau das, wonach ich gesucht habe, um Paginierungssteuerelemente am Ende einer Datentabelle zu platzieren. Es funktioniert perfekt. Vielen Dank.
Comencau
5
Dies funktioniert nicht, wenn Sie alle Spalten in der Mitte einer Tabelle überspannen möchten, z. B. Gruppe für Trennzeichen zwischen verwandten Zeilengruppen. (Chrome)
David Hempy
17

Als Teilantwort hier ein paar Punkte colspan="0", die in der Frage erwähnt wurden.

tl; dr version:

colspan="0"funktioniert in keinem Browser. W3Schools ist falsch (wie üblich). HTML 4 sagte, colspan="0"dass eine Spalte die gesamte Tabelle überspannen sollte, aber niemand hat dies implementiert und es wurde nach HTML 4 aus der Spezifikation entfernt.

Einige weitere Details und Beweise:

  • Alle gängigen Browser behandeln es als gleichwertig mit colspan="1".

    Hier ist eine Demo, die dies zeigt. Probieren Sie es in einem beliebigen Browser aus.

    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>

  • Die HTML 4-Spezifikation (jetzt alt und veraltet, aber aktuell, als diese Frage gestellt wurde) sagte tatsächlich, dass colspan="0"dies so behandelt werden sollte , dass es alle Spalten umfasst:

    Der Wert Null ("0") bedeutet, dass die Zelle alle Spalten von der aktuellen Spalte bis zur letzten Spalte der Spaltengruppe (COLGROUP) umfasst, in der die Zelle definiert ist.

    Die meisten Browser haben dies jedoch nie implementiert.

  • HTML 5.0 (eine Empfehlung von Kandidaten aus dem Jahr 2012), der WhatWG HTML-Lebensstandard (der heute vorherrschende Standard) und die neueste W3 HTML 5-Spezifikation enthalten nicht den oben in HTML 4 zitierten Wortlaut und stimmen einstimmig zu, dass a colspan0 ist ist nicht erlaubt, mit diesem Wortlaut, der in allen drei Spezifikationen vorkommt:

    Für die Elemente tdund thkann ein colspanInhaltsattribut angegeben werden, dessen Wert eine gültige nicht negative Ganzzahl größer als Null sein muss ...

    Quellen:

  • Die folgenden Behauptungen der in der Frage verlinkten W3Schools-Seite sind - zumindest heutzutage - völlig falsch:

    Nur Firefox unterstützt colspan = "0", was eine besondere Bedeutung hat ... [Es] weist den Browser an, die Zelle bis zur letzten Spalte der Spaltengruppe (colgroup) zu überspannen.

    und

    Unterschiede zwischen HTML 4.01 und HTML5

    KEINER.

    Wenn Sie nicht bereits wissen, dass W3Schools von Webentwicklern wegen ihrer häufigen Ungenauigkeiten im Allgemeinen verachtet wird, sollten Sie dies als eine Lektion in Bezug auf das Warum betrachten.

Mark Amery
quelle
4
Haha, ich mag es, wie nützliche API-Funktionen nur dann vollständig entfernt werden, wenn niemand dazu kommt, sie zu implementieren. Erstaunlicher Prozess.
Andrew Koster
14

Für IE 6 möchten Sie colspan der Anzahl der Spalten in Ihrer Tabelle entsprechen. Wenn Sie 5 Spalten haben, möchten Sie : colspan="5".

Der Grund dafür ist, dass der IE Colspans unterschiedlich behandelt und die HTML 3.2-Spezifikation verwendet:

IE implementiert die HTML 3.2-Definition, die colspan=0als festgelegt wird colspan=1.

Der Fehler ist gut dokumentiert .

George Stocker
quelle
1
Die Anzahl der Spalten kann variabel sein. Ich werde meine Frage aktualisieren, um diese Bemerkung aufzunehmen.
Bob
Obwohl der Rat im oberen Absatz sinnvoll erscheint, denke ich, dass viele Details hier nicht ganz richtig sind. Die HTML 3.2-Spezifikation besagt, dass colspans positive ganze Zahlen sein muss, was colspan=0illegal macht . Nirgendwo wird ausdrücklich vorgeschrieben, dass colspan=0dies so behandelt werden soll colspan=1(obwohl ich sicher bin, dass dies tatsächlich das ist, was IE 6 tut). Außerdem befindet sich das Zitat (nicht mehr?) Nirgendwo auf der Forenseite, auf die Sie verlinken, und die meisten Google-Suchergebnisse (jetzt?) Beziehen sich auf völlig andere Fehler im Zusammenhang mit IE 6 Colspan.
Mark Amery
11

Wenn Sie jQuery verwenden (oder nichts dagegen haben, es hinzuzufügen), wird dies die Arbeit besser erledigen als jeder dieser Hacks.

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;

}

Um die Implementierung zu vereinfachen, dekoriere ich jedes td / th, das ich anpassen muss, mit einer Klasse wie "maxCol". Dann kann ich Folgendes tun:

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

Wenn Sie eine Implementierung finden, für die dies nicht funktioniert, schlagen Sie die Antwort nicht zu, erklären Sie sie in Kommentaren, und ich werde sie aktualisieren, wenn sie abgedeckt werden kann.

rainabba
quelle
1
Wäre toll, wenn Sie eine Vanille JS-Version hätten
jpaugh
Haben Sie einen allgemeinen Anwendungsfall, dem die Unterstützung von $ (Selektor) fehlt, oder möchten Sie ihn einfach nicht verwenden?
rainabba
1
Weder. Ich bin nur neugierig, ob jQuery hier einen Nutzen bringt. Es ist eine ziemlich wichtige Voraussetzung, und es sieht so aus, als würde es hier nur minimal verwendet.
Jpaugh
Meinetwegen. Zwischen jQuery und Angular ist es selten, dass ich diese Tools nicht habe, daher verwende ich sie standardmäßig. Ich überlasse es jedoch jemand anderem, die Vanille-Version für den Moment zu entwickeln.
rainabba
1
Da jQuery etwas veraltet ist, habe ich eine es6-Version / Antwort hinzugefügt (wollte diese Antwort nicht mit völlig anderem Code aktualisieren).
Sjeiti
5

Eine andere funktionierende, aber hässliche Lösung: colspan="100"wobei 100 ein Wert ist, der größer ist als die Gesamtzahl der Spalten, die Sie benötigen colspan.

Laut W3C ist die colspan="0"Option nur mit COLGROUPTag gültig .

Raubvogel
quelle
colspan = "100" (z. B. über das Limit hinaus) kann in einigen Fällen zu sehr seltsamem Tabellen-Rendering führen (ich werde versuchen, einige Testfälle aufzuspüren und die URLs zu veröffentlichen)
scunliffe
-1 weil, soweit ich feststellen kann, die Behauptung im letzten Absatz falsch ist. HTML 4 ermöglicht <td>s haben colspan="0"(siehe w3.org/TR/REC-html40/struct/tables.html#adef-colspan ), während HTML 5.0 nicht zulässt , dass span="0"auf ein colgroup(siehe w3.org/TR/html50/tabular- data.html # attr-colgroup-span, der besagt, dass "der Wert eines span-Inhaltsattributs ['s] eine gültige nicht negative Ganzzahl größer als Null sein muss." ).
Mark Amery
2

Im Folgenden finden Sie eine kurze es6-Lösung (ähnlich der Antwort von Rainbabba, jedoch ohne 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
quelle
-1

Ich möchte nur meine Erfahrung hinzufügen und darauf antworten.
Hinweis: Dies funktioniert nur, wenn Sie ein vordefiniertes tableund ein trmit ths haben, aber dynamisch in Ihre Zeilen geladen werden (z. B. über AJAX).

In diesem Fall können Sie die Anzahl der thin Ihrer ersten Kopfzeile vorhandenen zählen und diese verwenden, um die gesamte Spalte zu überspannen.

Dies kann erforderlich sein, wenn Sie eine Nachricht weiterleiten möchten, wenn keine Ergebnisse gefunden wurden.

So etwas in jQuery, wo tableist Ihre Eingabetabelle:

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
quelle
Wie die zuvor veröffentlichte JavaScript-Lösung lässt sich dies nicht gut verallgemeinern. Die Anzahl der ths ist nicht unbedingt die Anzahl der Spalten, da einige von ihnen möglicherweise einen colspanSatz haben. Dies funktioniert also nicht für alle geschrieben.
Mark Amery
-2

Vielleicht bin ich ein klarer Denker, aber ich bin ein bisschen verwirrt. Kennst du nicht die Spaltennummer deiner Tabelle?

Übrigens berücksichtigt IE6 nicht das colspan = "0", mit oder ohne definierte colgroup. Ich habe auch versucht, mit thead und th die Spaltengruppen zu generieren, aber der Browser erkennt die Form colspan = "0" nicht.

Ich habe es mit Firefox 3.0 unter Windows und Linux versucht und es funktioniert nur mit einem strengen Doctype.

Sie können einen Test auf mehreren Bowsern unter überprüfen

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

Ich fand die Testseite hier http://hsivonen.iki.fi/test/wa10/tables/colspan-0.html

Bearbeiten: Bitte kopieren Sie den Link und fügen Sie ihn ein. Die Formatierung akzeptiert nicht die doppelten Protokollteile im Link (oder ich bin nicht so schlau, ihn richtig zu formatieren).

Eineki
quelle
Ich stimme dem ersten Teil zu: Sie könnten sicherlich herausfinden, wie viele Zellen Sie in der Reihe haben werden? Wie würden Sie es sonst generieren?
Nickf
13
Nicht unbedingt, ich habe eine App mit einer dynamisch generierten AJAX-Tabelle und die Anzahl der Spalten kann sich von Rückruf zu Rückruf ändern. Auch bei der Entwicklung können Sie die Anzahl der Spalten "kennen", aber dies kann sich ändern und Sie wissen nur, dass Sie eine davon verpassen werden
Mad Halfling
11
Wenn Sie später Spalten hinzufügen, vergessen Sie möglicherweise, den Colspan zu ändern. Besser ist, dass dies immer max.
Adam
-2

Entsprechend der Spezifikation colspan="0"sollte sich eine Tabellenbreite td ergeben.

Dies gilt jedoch nur, wenn Ihr Tisch eine Breite hat! Eine Tabelle kann Zeilen unterschiedlicher Breite enthalten. Der einzige Fall, in dem der Renderer die Breite der Tabelle kennt, wenn Sie eine Spaltengruppe definieren ! Andernfalls ist das Ergebnis von colspan = "0" unbestimmbar ...

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

Ich kann es nicht mit älteren Browsern testen, aber dies ist Teil der Spezifikation seit 4.0 ...

FERcsI
quelle
"Dies ist Teil der Spezifikation seit 4.0" - Nein, nicht genau. Es war Teil der Spezifikation, aber dies wurde in HTML 5 entfernt und eine colspanvon 0 wurde illegal gemacht. Sowohl w3.org/TR/html50/… (die HTML 5.0-Spezifikation) als auch html.spec.whatwg.org/multipage/… (der neueste WhatWG HTML Living Standard) colspanmüssen größer als Null sein. Und wie in anderen Antworten hier erwähnt, haben Browser das alte HTML 4-Verhalten, das Sie zitieren, nie implementiert.
Mark Amery
-6

Versuchen Sie es mit "colSpan" anstelle von "colspan". IE mag die camelBack Version ...


quelle
4
nur bei Verwendung von IE und Einstellung über JavaScript und .setAttribute ('colSpan', int); Beachten Sie, dass dies in IE8 behoben wurde (nur im Standardmodus)
scunliffe
1
+1 - Ich wusste das nicht und es war eine große Hilfe! Ich dachte nicht, dass colSpan überhaupt in IE6 funktioniert.
Mwilcox