Larghezza uguale cella cella-tabella CSS


148

Ho un numero indeterminato di elementi di celle di tabella all'interno di un contenitore di tabelle.

<div style="display:table;">
  <div style="display:table-cell;"></div>
  <div style="display:table-cell;"></div>
</div>

Esiste un modo CSS puro per far sì che le celle della tabella abbiano la stessa larghezza anche se al loro interno hanno contenuti di dimensioni diverse?

Grazie.

Modifica: Avere una larghezza massima implicherebbe sapere quante celle hai penso?


Come viene determinato il numero di colonne: lato client o server?
iambriansreed

Dopo aver provato alcuni metodi, penso che se vuoi avere più righe e desideri che abbiano la stessa larghezza, usa flexbox invece di tabella
Eric

Risposte:


299

Ecco un violino funzionante con un numero indeterminato di celle: http://jsfiddle.net/r9yrM/1/

Puoi fissare una larghezza a ciascun genitore div(la tabella ), altrimenti sarà normale al 100%.

Il trucco è usare table-layout: fixed;e una certa larghezza su ogni cella per attivarlo, qui il 2%. Ciò attiverà l' altro algoritmo di tabella, quello in cui i browser si sforzano molto di rispettare le dimensioni indicate.
Si prega di testare con Chrome (e IE8- se necessario). Va bene con un Safari recente ma non ricordo la compatibilità di questo trucco con loro.

CSS (istruzioni pertinenti):

div {
    display: table;
    width: 250px;
    table-layout: fixed;
}

div > div {
    display: table-cell;
    width: 2%; /* or 100% according to OP comment. See edit about Safari 6 below */
}

EDIT (2013): Attenzione a Safari 6 su OS X, ha table-layout: fixed; sbagliato (o forse solo diverso, molto diverso dagli altri browser. Non ho letto le bozze del layout della tabella REC CSS2.1;)). Preparati a risultati diversi.


1
Grazie, questa sembra la risposta. Non so perché, ma se imposto la larghezza al 2%, in realtà ogni colonna viene aumentata del 2%. Ma il 100% sembra funzionare alla grande. Qualche idea di cosa sta succedendo lì?
Harry,

3
Mi sono imbattuto nello stesso problema della necessità di utilizzare una larghezza del 100% sulle celle della tabella. Ciò stava accadendo a causa di un clearfix applicato all'elemento genitore con display: table. Poiché le celle con larghezza del 100% non funzionano in IE8, la soluzione per me era rimuovere il clearfix. Spero che questo aiuti qualcuno.
Alex Barrett,

Per espandersi su questo, questo funziona con layout semplici (1x1, 2x2, 3x3, ecc.) Ma layout complessi (1x3x1, 1x2x3x4, ecc.) Richiedono l'uso di ulteriori divs display:tablecome se fossero righe, non display:tabl-rowcome ci si potrebbe aspettare. Esempio qui .
Filoxo,

2
La larghezza del 100% non ha funzionato su IE8 (sorpresa) ma il suggerimento iniziale per il 2% fornisce i risultati corretti.

1
Anche la larghezza del 100% non funzionava in IE10. E ha fatto il lavoro in IE11. E l'1% di larghezza ha fatto Mobile Safari mostrare colonne super strette. Così ho finito per usare un hack CSS mirato a IE9 e IE10: .my-cell { width: 100%; }; @media screen and (min-width:0\0) { .my-cell { width: 1%; } }l'hack CSS è da qui: stackoverflow.com/a/24321386/6962
Henrik N

29

HTML

<div class="table">
    <div class="table_cell">Cell-1</div>
    <div class="table_cell">Cell-2 Cell-2 Cell-2 Cell-2Cell-2 Cell-2</div>
    <div class="table_cell">Cell-3Cell-3 Cell-3Cell-3 Cell-3Cell-3</div>
    <div class="table_cell">Cell-4Cell-4Cell-4 Cell-4Cell-4Cell-4 Cell-4Cell-4Cell-4Cell-4</div>
</div>

CSS

.table{
    display:table;
    width:100%;
    table-layout:fixed;
}
.table_cell{
    display:table-cell;
    width:100px;
    border:solid black 1px;
}

DEMO.


Il violino non funziona qui. Le celle sono sempre del 25%.
netAction

Questa soluzione non è molto scalabile per nulla di dinamico, come la navigazione del sito controllata dal client.
Eric K,

Probabilmente hai ragione e a proposito, è quasi due anni che rispondo @QuantumDynamix. Hai qualcosa di meglio in mente? Perché non solo condividere la tua idea, fai sapere al mondo cose migliori :-)
The Alpha

15

Usando solo max-width: 0nel display: table-cellelemento funzionato per me:

.table {
  display: table;
  width: 100%;
}

.table-cell {
  display: table-cell;
  max-width: 0px;
  border: 1px solid gray;
}
<div class="table">
  <div class="table-cell">short</div>
  <div class="table-cell">loooooong</div>
  <div class="table-cell">Veeeeeeery loooooong</div>
</div>


1
Sto solo facendo un pignolo qui, ma 0pxnon è un'unità valida. Dovrebbe essere 0.
Gavin,

Questo ha funzionato per me, ma potresti spiegare come funziona?
Emmanual,

6

Sostituire

  <div style="display:table;">
    <div style="display:table-cell;"></div>
    <div style="display:table-cell;"></div>
  </div>

con

  <table>
    <tr><td>content cell1</td></tr>
    <tr><td>content cell1</td></tr>
  </table>

Guarda tutti i problemi che circondano il tentativo di far funzionare i div come tabelle. Hanno dovuto aggiungere table-xxx per imitare i layout delle tabelle

Le tabelle sono supportate e funzionano molto bene in tutti i browser. Perché abbandonarli? il fatto che dovevano imitarli è la prova che hanno fatto bene il loro lavoro.

A mio avviso, utilizzare lo strumento migliore per il lavoro e se si desidera che i dati siano tabulari o qualcosa che assomigli a tabelle di dati tabulari, funzioni.

Risposta molto tardi lo so, ma vale la pena esprimere.


2
+1 perché funziona e perché i CSS continuano a funzionare, nel 2014 non lo fa correttamente su tutti i browser.
Yuck,

6
A volte si desidera un layout simile a una tabella per elementi che non sono dati tabulari. ad esempio elementi di navigazione che dovrebbero utilizzare <nav>, <ul>ecc
Ben

1
Per reattivo è l'ideale avere un layout basato su div. La visualizzazione di tabelle nei dispositivi mobili è una seccatura.
Pablo Rincon,

Cercare di emulare una tabella impedisce il design reattivo. Sono d'accordo se si desidera un design reattivo, le tabelle non sono la scelta.
DeveloperChris,

2
Le tabelle sono state create per la visualizzazione di dati tabulari: lo era, lo è e saranno gli elementi HTML da utilizzare per visualizzare i dati tabulari, perché qualcuno dovrebbe abbandonarli (a tale scopo)? Il layout della tabella non è imitato : fa parte della raccomandazione CSS2 da un po 'di tempo e succede che il layout predefinito delle tabelle HTML è display: table-etc(abbastanza naturalmente). Non passo le mie giornate a creare collegamenti imitando div o div imitando tabelle, span o input: sto solo usando CSS per lo styling. Infine, buona fortuna con IE9 per l'applicazione di qualsiasi altro valore della displayproprietà agli elementi table, tr, td.
FelipeAls,

1

questo funzionerà per tutti

<table border="your val" cellspacing="your val" cellpadding="your val" role="grid" style="width=100%; table-layout=fixed">
<!-- set the table td element roll attr to gridcell -->
<tr>
<td roll="gridcell"></td>
</tr>
</table>

Questo funzionerà anche per i dati di tabella creati dall'iterazione


0

Ecco qui:

http://jsfiddle.net/damsarabi/gwAdA/

Non è possibile utilizzare larghezza: 100 px, poiché il display è una cella di tabella. Puoi tuttavia utilizzare Larghezza massima: 100 px. quindi la tua scatola non sarà mai più grande di 100px. ma devi aggiungere un overflow: nascosto per assicurarti che il contect non sanguini su altre celle. puoi anche aggiungere uno spazio bianco: nowrap se desideri che l'altezza non aumenti.


0

Questo può essere fatto impostando lo stile della cella di tabella su width: autoe il contenuto è vuoto. Le colonne sono ora uguali in larghezza, ma non contengono alcun contenuto.

Per inserire contenuto nella cella, aggiungi un divcon css:

position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;

È inoltre necessario aggiungere position: relativealle celle.

Ora puoi inserire il contenuto effettivo nel div di cui sopra.

https://jsfiddle.net/vensdvvb/

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.