Un DIV all'interno di un TD è una cattiva idea?


143

Sembra che io abbia sentito / letto da qualche parte che l' <div>interno di un <td>era un no-no. Non che non funzionerà, solo qualcosa che non è realmente compatibile in base al tipo di display. Non riesco a trovare alcuna prova a sostegno del mio sospetto, quindi potrei sbagliarmi totalmente.

Risposte:


144

L'uso di un divinstide a tdnon è peggiore di qualsiasi altro modo di usare le tabelle per il layout. (Alcune persone non usano mai le tabelle per il layout, e mi capita di essere uno di loro.)

Se usi a divin a tdti troverai in una situazione in cui potrebbe essere difficile prevedere come verranno dimensionati gli elementi. Il valore predefinito per un div è determinare la sua larghezza dal suo genitore e il valore predefinito per una cella di tabella è determinare la sua dimensione in base alla dimensione del suo contenuto.

Le regole su come divdimensionare una cosa dovrebbero essere ben definite negli standard, ma le regole su come tddimensionare una cosa non dovrebbero essere ben definite, quindi browser diversi usano algoritmi leggermente diversi.


Ho il sospetto che questo sia il punto di partenza del mio sospetto. Grazie per averlo chiarito.
jcollum,

9
Se le tue colonne hanno una larghezza predefinita, non dovrebbe essere un problema. Ricorda solo di impostare il layout del tavolo: risolto sul tavolo in modo che i browser non prevalgano sulle tue larghezze (potenzialmente causando problemi)
Jens Roland,

6
Non ha mai detto che stava usando le tabelle per i layout.
texelate del

@texelate table-layout:fixedCSS non è quello che pensi che sia. Riduce la quantità di calcoli eseguiti dai browser durante il rendering delle tabelle calcolando solo le dimensioni della prima riga.
SteveB,

73

Dopo aver verificato il DTD XHTML ho scoperto che un elemento <TD> può contenere elementi di blocco come intestazioni, elenchi e anche elementi <DIV>. Pertanto, l'utilizzo di un elemento <DIV> all'interno di un elemento <TD> non viola lo standard XHTML. Sono abbastanza sicuro che altre moderne varianti di HTML abbiano un modello di contenuto equivalente per l'elemento <TD>.

Ecco le regole DTD rilevanti:

<!ELEMENT td %Flow;>
<!-- %Flow; mixes block and inline and is used for list items etc. -->
<!ENTITY %Flow "(#PCDATA | %block; | form | %inline; | %misc;>
<!ENTITY %block "p | %heading; | div | %lists; | %blocktext; | fieldset | table">

1
Questa è la risposta specifica che stavo cercando. Quindi grazie gentilmente. Immagino che dormirò leggermente meglio stanotte.
3Dom

L'unica risposta sostenuta dal PEC.
peterchaula,

Si prega di condividere con noi dove nel DTD lo spiega. Non è un documento facile da leggere. Grazie!
redolente il

1
@redolent: ho aggiunto le regole DTD pertinenti alla mia risposta.
Martin Liversage,

Che dire delle specifiche HTML5 che non sono XHTML?
schiaccia il

38

No. Non necessariamente.

Se è necessario posizionare un DIV all'interno di un TD, assicurarsi di utilizzare correttamente il TD. Se non ti interessano i dati tabulari e la semantica, alla fine non ti interesseranno i DIV nei TD. Non credo che c'è un problema, però - se si dispone di farlo, che stai bene.

Secondo le specifiche HTML

A <div>può essere posizionato dove è previsto il contenuto del flusso 1 , che è il <td>modello di contenuto 2 .


2
Ho sempre voluto rispondere a una domanda con un sì o un no;)
Jani Hartikainen,

+1: volevo davvero rispondere con qualcosa di più arguto, ma fallito.
karim79,

Anche se questo ha ottenuto più voti, penso che Guffa abbia sollevato un punto che non è stato affrontato qui (e potrebbe essere la fonte del mio sospetto)
jcollum,

14

Una cella di tabella può contenere legittimamente elementi a livello di blocco, quindi non è intrinsecamente un passo falso. L'implementazione del browser, ovviamente, lascia questa posizione speculativa-teorica. Potrebbe causare problemi di layout e bug.

Sebbene le tabelle siano state utilizzate per il layout, e talvolta lo sono ancora, immagino che la maggior parte dei browser visualizzerà correttamente il contenuto. Anche IE.


Ho il sospetto che l'implementazione del browser sia la mia "attesa, è una cattiva idea".
jcollum,

13

Se si desidera utilizzare la posizione: assoluto; sul div con position: relative;su il td ti imbatterai in problemi. FF, safari e chrome (mac, ma non PC) non posizioneranno il div rispetto al td (come ti aspetteresti), questo vale anche per i div, display: table-whatever;quindi se vuoi farlo hai bisogno di due div, uno per il contenitore width: 100%; height: 100%;e nessun bordo in modo da riempire la td senza alcun impatto visivo. e poi quello assoluto.

diverso da quello, perché non dividere la cellula?


6
L'unica risposta pratica e non sacra
Antony Hatchkins,

2

Ho affrontato il problema inserendo un <div>interno <td>.

Non sono stato in grado di identificare il div utilizzando document.getElementById()se lo inserisco all'interno di td. Ma fuori funzionava bene.


1

Come tutti hanno detto, potrebbe non essere una buona idea per scopi di layout. Sono arrivato a questa domanda perché mi chiedevo lo stesso e volevo solo sapere se sarebbe stato un codice valido.

Dal momento che è valido, puoi usarlo per altri scopi. Ad esempio, quello per cui lo userò è quello di mettere alcuni fantasiosi div "CSSed" all'interno delle righe della tabella e quindi utilizzare una rapida funzione jQuery per consentire all'utente di ordinare le informazioni per prezzo, nome, ecc. In questo modo, il l'unica tabella di layout che mi darà è l '"ordine verticale", ma controllerò la larghezza, l'altezza, lo sfondo, ecc. dei div da CSS.



-4

Rompe la semantica , tutto qui. Funziona bene, ma potrebbero esserci lettori di schermo o qualcosa lungo la strada che non apprezzeranno l'elaborazione del tuo HTML se "rompi la semantica".


13
@Greg, perché interrompe la semantica? Un div è semplicemente una divisione a livello di blocco, o sottodivisione, del contenuto della pagina. Pertanto, non è essenzialmente e irrevocabilmente antisemantico collocarli all'interno di una cella di tabella.
David dice di ripristinare Monica il

2
Ho provato a scriverti diverse risposte che hanno giustificato la mia risposta, ma ho continuato a scendere all'opinione personale. : / Immagino che la mia migliore risposta sarebbe che qualsiasi cosa sia nella tua cella può probabilmente essere meglio rappresentata da un altro tag HTML. Se stai veramente dividendo le tue celle in componenti, probabilmente non dovresti usare una tabella per cominciare, dovresti dare uno stile a una serie di DIV per il tuo layout. Non sono sicuro del perché non riesco a metterlo in parole migliori ... immaginalo con l'gesso.
Greg,

Hmm, vuoi dire che un TD è semanticamente la stessa cosa di un DIV, quindi perché averne due di fila?
jcollum,

2
@jcollum: No, non direi che sono semanticamente uguali. TD è sicuramente una cella in una tabella; fa parte di una struttura nota: una tabella ha righe, una riga ha celle, le celle contengono dati. DIV è solo un contenitore ... può rappresentare qualsiasi cosa in qualsiasi momento e ovunque nel documento - devi applicare lo stile per ottenere qualsiasi semantica da esso in termini di scopo nel markup.
Greg,

7
Un DIV è semanticamente insignificante, quindi non vedo come possa mai essere errato.
Rex M
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.