Il tag 'table' e 'display: table' sono una direttiva funzionale o di layout?

3

Sfondo

Ho mi è sempre piaciuta l'idea di usare la proprietà CSS di display:table . Usarlo sembra un brutto scherzo e preferisco sempre utilizzare un tag <table> diretto. Naturalmente, lo uso solo quando necessario e preferisco sempre un layout basato su% non basato su% se possibile. Ma per quelle occasioni in cui un tavolo è l'unica scelta, preferisco il tag non il CSS. Naturalmente sono stato rimproverato parecchie volte a riguardo. In una recente discussione con Toni Leigh finalmente sono riuscito a definire i miei sentimenti riguardo a questo argomento abbastanza bene da farne una discussione , quindi mi piacerebbe presentarlo qui e sentire cosa ne pensate voi ragazzi.

Definizioni cruciali

In HTML ogni tag può essere pensato per contenere tre proprietà distinte: funzionalità, layout e semantica.

La funzionalità è ciò che il tag fa . Un <table> reindirizza l'utente quando viene fatto clic. Un <a href=""> crea una casella di testo. Un <input type="text"> racchiude un blocco di contenuto in modo che possa essere ulteriormente modificato. Un <div> mostra un'immagine. Ecc.

Layout è ciò che il tag assomiglia (e suona come , se stai usando uno screen reader). Questo contiene cose come colori, bordi, spaziature, caratteri, ecc.

La semantica è ciò che il tag significa (o rappresenta ). Potrebbe essere una voce di menu, un post di blog, una fotografia, un elemento di design, ecc.

La carne del problema

Nel moderno HTML il layout è la provincia del CSS, mentre sia la funzionalità che la semantica dipendono dal nome del tag e occasionalmente da alcuni attributi, che ha l'effetto collaterale di intrecciarli. Le persone si sforzano molto per mantenere separati questi due domini (layout e funzionalità / semantica), in modo che le necessità di uno non influenzino l'altro. Per questo motivo, utilizzando <img> per il layout viene deriso, perché ciò impone una modifica semantica in cui dovrebbe essere presente solo una modifica del layout. E la soluzione alternativa è usare <table> come alternativa per ottenere effetti di layout simili a tabelle, ma senza le modifiche semantiche associate al tag display: table . (Risposta preventiva: no, un <table> non produce un zuppa tag più grande. Ricevi tutti gli stessi tag anche con <table> , sono tutti chiamati display:table ora)

Il motivo per cui mi sembra così "sbagliato" è perché vedo il <div> come una proprietà CSS che modifica la funzionalità di un tag . È come usare i CSS per cambiare una display:table in una <a> o una <form> in una <input type="text"> o qualcosa (beh, se fosse possibile). Per quanto ne so, è l'unica proprietà CSS con un tale effetto. Tutto il resto influisce solo sul layout, ma <button> fa di più. Per questo motivo sembra che non dovrebbe nemmeno essere in CSS. In particolare:

  • Vengono creati nuovi tipi di relazioni tra le dimensioni dei tag. Nei layout non tabulari, solo le relazioni genitore-figlio tra tag possono influire l'una sull'altra. In una tabella, altri tag nella stessa riga / colonna possono influire sulle dimensioni di una cella, nonché sulla larghezza / altezza totali dell'intera tabella.
  • Per peggiorare le cose, ottieni colspans / rowspans (il supporto per i browser CSS è instabile al momento, ma sta arrivando)
  • L'elemento display:table verrà stampato su ogni pagina, quando si stampa il documento.
  • Ottieni l'allineamento verticale del testo e la compressione del bordo.

E probabilmente altri a cui non ho pensato. Beh, immagino che siano specie di caratteristiche del layout, ma sono un mondo intero oltre a qualsiasi altra cosa che i CSS possono fare. Trattare alcuni markup come una tabella trasforma il browser in una modalità completamente diversa, motivo per cui penso che sia una funzionalità diversa, non solo il layout.

La domanda

Che ne pensi? Tutte le modifiche apportate da display:table-header possono essere conteggiate solo come layout, oppure si tratta anche di un cambio di funzionalità?

    
posta Vilx- 21.09.2015 - 14:26
fonte

3 risposte

3

Direi che un tag <table> ha un significato semantico. Stai codificando i dati tabulari. Principalmente, il layout non è dati tabellare, quindi l'utilizzo del tag <table> per il layout sta imponendo problemi di presentazione su un tag contenente dati.

    
risposta data 21.09.2015 - 14:38
fonte
3

CSS " display:table " non cambia la semantica di alcun elemento. Gli effetti "di funzionalità" che descrivi sono solo effetti di layout visivi, che è il dominio dei CSS.

Sei corretto che le dimensioni degli elementi al di fuori delle relazioni genitore-figlio possano influenzarsi a vicenda quando si utilizza il layout della tabella. Questo è il punto centrale del layout della tabella in poche parole. Altre proprietà di layout come float influenzano anche il posizionamento e il ridimensionamento di altri elementi al di fuori di genitori / figli. L'effetto è un layout puramente visivo - non è come disegnare un elemento come una tabella trasforma improvvisamente un altro elemento da form in script . Non ci sono effetti semantici su altri elementi.

L'allineamento verticale e il collasso del bordo sono puramente effetti visivi, e di nuovo ci sono molti altri esempi in cui il modello di visualizzazione del css influenzerà l'interpretazione di altre proprietà del css. Cioè la modifica del display da ' inline ' a ' block ' o di ' inline-block ' cambierà il modo in cui vengono interpretati il bordo, il riempimento e i margini.

Tutti i valori disponibili di display -property possono essere detti per cambiare il layout in una modalità diversa che influisce su molte altre proprietà css.

    
risposta data 21.09.2015 - 15:29
fonte
0

Non sono abbastanza sicuro di cosa intendi per "funzionalità", ma display è sicuramente una proprietà speciale. display modifica la relazione tra come gli elementi interagiscono tra loro. La proprietà display può cambiare un elemento di blocco (si comporta come una scatola) per diventare elemento in linea (si comporta come il testo) o viceversa.

AFAICT, display è l'unica proprietà CSS che cambia in realtà non solo l'aspetto dell'elemento, ma l'intero algoritmo utilizzato per il rendering dell'elemento, come l'elemento interagisce con altri elementi durante il layout e come vengono interpretate tutte le altre proprietà .

Quando guardi quali sono gli altri valori per display , allora display: table non è davvero molto speciale.

    
risposta data 22.09.2015 - 18:45
fonte

Leggi altre domande sui tag