Colspan tutte le colonne


385

Come posso specificare un tdtag dovrebbe estendersi su tutte le colonne (quando la quantità esatta di colonne nella tabella sarà variabile / difficile da determinare quando viene eseguito il rendering dell'HTML)? w3schools menziona che puoi usare colspan="0", ma non dice esattamente quali browser supportano quel valore (IE 6 è nella nostra lista per supportare).

Sembra che l'impostazione colspansu un valore maggiore della quantità teorica di colonne che potresti avere funzionerà, ma non funzionerà se hai table-layoutimpostato su fixed. Ci sono degli svantaggi nell'usare un layout automatico con un numero elevato per colspan? C'è un modo più corretto di farlo?


La risposta accettata riguarda il modo in cui NON farlo, e sembra avere lati negativi in ​​termini di prestazioni / coerenza. Quindi immagino che la risposta sia: hardcode il numero di colonne. Non vedo alcuna alternativa praticabile.
Andrew Koster,

Risposte:


268

Ho IE 7.0, Firefox 3.0 e Chrome 1.0

L'attributo colspan = "0" in un TD NON si estende su tutti i TD in nessuno dei browser di cui sopra .

Forse non è raccomandato come pratica di markup corretta, ma se dai un valore colspan più alto del no totale possibile. di colonne in altre righe , quindi il TD si estenderebbe su tutte le colonne.

Questo NON funziona quando la proprietà CSS del layout di tabella è impostata su fissa.

Ancora una volta, questa non è la soluzione perfetta, ma sembra funzionare nelle 3 versioni di browser sopra menzionate quando la proprietà CSS del layout di tabella è automatica . Spero che sia di aiuto.


Se si specifica un doctype rigoroso all'inizio di HTML Firefox 3, eseguire il rendering di colspan come richiesto dalle specifiche HTML 4.01.
Eineki,

253
Sono un fan di colspan="42"coprire l'intera gamma. Ovviamente questo è un problema per> 42 colonne, ma è uno dei pochi numeri magici che approvo.
Martin Carney,

40
Consiglio vivamente di inserire colspan = <numero esatto corretto>. Ho appena colpito un enorme bug di perf in Firefox che mi ha impiegato tutto il giorno per capire. Un colspan arbitrariamente grande farà soffocare FF su un grande tavolo con collasso dei bordi: collasso. Il mio tavolo con 800 righe e 8 colonne impiegava 5 secondi per il rendering. Con il colspan destro è tornato a un ragionevole 1 secondo. bugzilla.mozilla.org/show_bug.cgi?id=675417
InfinitiesLoop

2
Consiglio di non usare questo metodo. Ho ottenuto risultati davvero strani da Chrome su OSX (colonne sovrapposte).
Tzach,

un altro problema riscontrato in Chrome se si tenta di dare un bordo all'elemento TR che contiene il TD "oversize", il bordo destro non sarà visibile.
Massimo

272

Usa questo:

colspan="100%"

Funziona su Firefox 3.6, IE 7 e Opera 11! (e suppongo che gli altri, non potrei provare)


Attenzione: come menzionato nei commenti qui sotto questo è in realtà lo stesso di colspan="100". Quindi, questa soluzione si interromperà per le tabelle con CSS table-layout: fixedo più di 100 colonne.


16
Testato [in aggiunta] in IE6 - IE8, Chrome [su PC e Mac], Firefox 4.0 [PC e Mac], Safari 5 [PC e Mac]
hndcrftd,

11
Come è ancora così oscuro? Questo dovrebbe essere gridato ad ogni angolo di strada !!! Sono stato alle prese con questo maledetto problema colspan in diversi momenti per un po 'di tempo ormai
hndcrftd,

30
Su Chrome e Firefox, colspan = "3%" è gestito esattamente come colspan = "3".
zpmorgan,

98
@zpmorgan e @Sprog, hai ragione! colspan="100%"significa esattamente colspan="100".
NemoStein,

37
Lol, sono stato molto felice di vedere finalmente una soluzione cross-browser coerente a questo problema, solo per scoprire attraverso i commenti che questo è davvero un inganno non funzionante come previsto :( Penso che non meriti più voti rispetto alla risposta accettata = /
Francisco,

64

Se si desidera creare una cella "title" che si estende su tutte le colonne, come intestazione per la tabella, è possibile utilizzare il tag caption ( http://www.w3schools.com/tags/tag_caption.asp / https: // developer.mozilla.org/en-US/docs/Web/HTML/Element/caption ) Questo elemento è destinato per questo scopo. Si comporta come un div, ma non si estende su tutta la larghezza del genitore della tabella (come un div farebbe nella stessa posizione (non provarlo a casa!)), Invece, si estende su tutta la larghezza del tavolo. Ci sono alcuni problemi tra browser con bordi e simili (era accettabile per me). Ad ogni modo, puoi farlo sembrare una cella che si estende su tutte le colonne. All'interno, puoi creare righe aggiungendo div-elementi. Non sono sicuro di poterlo inserire tra elementi tr, ma credo che sarebbe un trucco (quindi non consigliato). Un'altra opzione sarebbe quella di fare casini con div galleggianti, ma è schifo!

Fare

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

non

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

1
Esattamente quello che stavo cercando per mettere i controlli di impaginazione in fondo a un datatable. Funziona perfettamente. Grazie mille.
Comencau,

5
Questo non funziona se si desidera estendere tutti i col nel mezzo di una tabella ... come gruppo per separatore tra gruppi di righe correlati. (Chrome)
David Hempy,

17

Come risposta parziale, ecco alcuni punti su colspan="0", che è stato menzionato nella domanda.

tl; versione dr:

colspan="0"non funziona in nessun browser. W3Schools è sbagliato (come al solito). HTML 4 ha detto questocolspan="0" dovrebbe causare una colonna su tutta la tabella, ma nessuno l'ha implementato ed è stato rimosso dalle specifiche dopo HTML 4.

Qualche dettaglio in più e prove:

  • Tutti i principali browser lo considerano equivalente a colspan="1" .

    Ecco una demo che mostra questo; provalo su qualsiasi browser che ti piace.

    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>

  • Le specifiche HTML 4 (ora vecchie e obsolete, ma attuali quando è stata posta questa domanda) hanno effettivamente affermato che colspan="0"dovrebbero essere trattate come su tutte le colonne:

    Il valore zero ("0") indica che la cella si estende su tutte le colonne dalla colonna corrente all'ultima colonna del gruppo di colonne (COLGROUP) in cui è definita la cella.

    Tuttavia, la maggior parte dei browser non lo ha mai implementato.

  • HTML 5.0 (fatto una raccomandazione del candidato nel 2012), lo standard di vita HTML WhatWG (lo standard dominante oggi) e le ultime specifiche W3 HTML 5 non contengono tutte le parole citate da HTML 4 sopra e concordano all'unanimità che a colspandi 0 non è consentito, con questa formulazione che appare in tutte e tre le specifiche:

    Gli elementi tde thpossono avere un colspanattributo del contenuto specificato, il cui valore deve essere un numero intero non negativo maggiore di zero ...

    fonti:

  • Le seguenti affermazioni dalla pagina W3Schools collegate alla domanda sono - almeno al giorno d'oggi - completamente false:

    Solo Firefox supporta colspan = "0", che ha un significato speciale ... [Indica] al browser di estendere la cella all'ultima colonna del gruppo di colonne (colgroup)

    e

    Differenze tra HTML 4.01 e HTML5

    NESSUNA.

    Se non sei già consapevole del fatto che W3Schools è generalmente disprezzato dagli sviluppatori web per le sue frequenti inesattezze, considera questa una lezione sul perché.


4
Haha Mi piace come funzioni API utili vengano rimosse completamente quando nessuno riesce a implementarle. Processo straordinario.
Andrew Koster,

14

Per IE 6, ti consigliamo di eguagliare colspan al numero di colonne nella tabella. Se hai 5 colonne, allora vorrai:colspan="5" .

Il motivo è che IE gestisce i colspan in modo diverso, utilizza la specifica HTML 3.2:

IE implementa la definizione HTML 3.2, imposta colspan=0come colspan=1.

Il bug è ben documentato .


1
La quantità di colonne può essere variabile, aggiornerò la mia domanda per includere tale osservazione.
Bob,

Mentre i consigli nel paragrafo in alto sembrano ragionevoli, penso che molti dei dettagli qui non siano del tutto giusti. La specifica HTML 3.2 afferma che colspans devono essere numeri interi positivi , il che rende colspan=0illegale; da nessuna parte si dice esplicitamente che colspan=0dovrebbe essere gestito come colspan=1(anche se sono sicuro che in realtà è quello che fa IE 6). Inoltre, la citazione non è (non più?) In nessun punto della pagina del forum a cui ti colleghi, e la maggior parte dei risultati di ricerca di Google (ora?) Riguardano bug di IE 6 completamente diversi relativi a colspan.
Mark Amery,

11

Se stai usando jQuery (o non ti dispiace aggiungerlo), questo farà il lavoro meglio di uno di questi hack.

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;

}

Per facilitare l'implementazione, decoro qualsiasi td / th che devo regolare con una classe come "maxCol", quindi posso fare quanto segue:

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

Se trovi un'implementazione per cui non funzionerà, non sbattere la risposta, spiegare nei commenti e aggiornerò se può essere coperto.


1
Sarebbe bello se tu avessi una versione JS vaniglia
jpaugh

Hai un caso d'uso comune in cui manca il supporto $ (selettore) o semplicemente non vuoi usarlo?
Rainabba,

1
Nessuno dei due. Sono solo curioso di sapere se jQuery aggiunge qualche vantaggio qui; è un prerequisito piuttosto pesante e sembra che sia solo minimamente usato qui.
jpaugh,

Giusto. Tra jQuery e Angular, è raro che non disponga di quegli strumenti, quindi sono predefinito. Lascio a qualcun altro, comunque, la versione vaniglia per ora.
Rainabba,

1
Poiché jQuery è in qualche modo obsoleto, ho aggiunto una versione / risposta es6 (non volevo aggiornare questa risposta con un codice completamente diverso).
Sjeiti,

5

Un'altra soluzione funzionante ma brutta:, colspan="100"dove 100 è un valore maggiore delle colonne totali che è necessario colspan.

Secondo il W3C, l' colspan="0"opzione è valida solo con COLGROUPtag.


colspan = "100" (ad es. oltre il limite) può causare in alcuni casi un rendering delle tabelle molto strano (cercherò di dare la caccia ad alcuni casi di test e pubblicare gli URL)
scunliffe

-1 perché per quanto posso determinare l'affermazione nel paragrafo finale è falsa. HTML 4 consente <td>di avere s colspan="0"(vedi w3.org/TR/REC-html40/struct/tables.html#adef-colspan ), mentre HTML 5.0 non consente span="0"su un colgroup(vedi w3.org/TR/html50/tabular- data.html # attr-colgroup-span che afferma che "il valore di un attributo di span content ['s] deve essere un numero intero non negativo valido maggiore di zero." ).
Mark Amery,

2

Di seguito è una concisa soluzione es6 (simile alla risposta di Rainbabba ma senza 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

Voglio solo aggiungere la mia esperienza e rispondere a questo.
Nota: funziona solo quando hai un predefinito tablee un trconth s, ma stai caricando dinamicamente le tue righe (ad esempio tramite AJAX).

In questo caso puoi contare il numero di th che ci sono nella tua prima riga di intestazione e usarli per coprire l'intera colonna.

Questo può essere necessario quando si desidera inoltrare un messaggio quando non sono stati trovati risultati.

Qualcosa del genere in jQuery, dove si tabletrova la tabella di input:

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

Come la soluzione JavaScript pubblicata prima , questa non si generalizza bene; il numero di ths non è necessariamente il numero di colonne, dal momento che alcune di esse potrebbero avere un colspanset e quindi questo non funzionerà come scritto per tutti.
Mark Amery,

-2

Forse sono un pensatore diretto ma sono un po 'perplesso, non conosci il numero di colonna del tuo tavolo?

A proposito IE6 non onora colspan = "0", con o senza un colgroup definito. Ho anche provato a usare thead e th per generare i gruppi di colonne ma il browser non riconosce il modulo colspan = "0".

Ho provato con Firefox 3.0 su Windows e Linux e funziona solo con un doctype rigoroso.

Puoi controllare un test su diversi bowser su

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

Ho trovato la pagina di test qui http://hsivonen.iki.fi/test/wa10/tables/colspan-0.html

Modifica: copia e incolla il link, la formattazione non accetterà le parti del doppio protocollo nel link (o non sono così intelligente da formattarlo correttamente).


Sono d'accordo sulla prima parte: sicuramente potresti capire quante celle avrai nella fila? In quale altro modo lo genereresti?
Nickf,

13
Non necessariamente, ho un'app con una tabella generata dinamicamente AJAX e il numero di colonne può cambiare da richiamata a richiamata. Inoltre, quando in via di sviluppo si possono "conoscere" il numero di colonne, ma questo potrebbe cambiare e basta sapere che ti mancherà uno di questi
Mad Halfling

11
Inoltre, se aggiungi colonne in un secondo momento, potresti dimenticare di cambiare il colspan, meglio avere che sia sempre max.
Adam,

-2

Secondo le specifiche colspan="0"dovrebbe risultare in una tabella td.

Tuttavia, questo è vero solo se la tua tabella ha una larghezza! Una tabella può contenere righe di diverse larghezze. Quindi, l'unico caso in cui il renderer conosce la larghezza della tabella se si definisce un colgroup ! Altrimenti, il risultato di colspan = "0" è indeterminabile ...

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

Non riesco a testarlo su browser più vecchi, ma questo fa parte delle specifiche dalla 4.0 ...


"Questo fa parte delle specifiche dal 4.0" - No, non esattamente. E ' stato parte della specifica, ma questo è stato rimosso in HTML 5 e una colspandi 0 è stato reso illegale. Sia w3.org/TR/html50/… (le specifiche HTML 5.0) che html.spec.whatwg.org/multipage/… (l'ultimo standard HTML Living WhatWG) dichiarano che colspandevono essere maggiori di zero. E come notato in altre risposte qui, i browser non hanno mai implementato il vecchio comportamento HTML 4 che citi.
Mark Amery,

-6

prova a usare "colSpan" invece di "colspan". Ad IE piace la versione camelBack ...


4
solo quando si utilizza IE e l'impostazione tramite JavaScript e .setAttribute ('colSpan', int); Nota che questo è stato risolto in IE8 (solo in modalità
stds

1
+1 - Non lo sapevo ed è stato di grande aiuto! Non pensavo che colSpan funzionasse nemmeno in IE6.
mwilcox,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.