CSS-Tabellenzelle gleich breit

147

Ich habe eine unbestimmte Anzahl von Tabellenzellenelementen in einem Tabellencontainer.

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

Gibt es eine reine CSS-Methode, um die Tabellenzellen gleich breit zu machen, selbst wenn sie unterschiedlich große Inhalte enthalten?

Vielen Dank.

Bearbeiten: Eine maximale Breite würde bedeuten, zu wissen, wie viele Zellen Sie haben, denke ich?

Harry
quelle
Wie wird die Anzahl der Spalten bestimmt: Client- oder Serverseite?
Iambriansreed
Nachdem ich einige Methoden ausprobiert habe, denke ich, wenn Sie mehrere Zeilen haben möchten und diese gleich breit sein möchten, verwenden Sie Flexbox anstelle von Tabelle
Eric

Antworten:

298

Hier ist eine funktionierende Geige mit einer unbestimmten Anzahl von Zellen: http://jsfiddle.net/r9yrM/1/

Sie können jedem übergeordneten Element div(der Tabelle ) eine Breite festlegen , andernfalls beträgt sie wie gewohnt 100%.

Der Trick besteht darin, table-layout: fixed;für jede Zelle eine gewisse Breite zu verwenden, um sie auszulösen, hier 2%. Dies löst den anderen Tabellenalgorithmus aus, bei dem die Browser sehr bemüht sind, die angegebenen Abmessungen einzuhalten.
Bitte testen Sie mit Chrome (und IE8 - falls erforderlich). Es ist in Ordnung mit einer kürzlich durchgeführten Safari, aber ich kann mich nicht an die Kompatibilität dieses Tricks mit ihnen erinnern.

CSS (relevante Anweisungen):

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): Vorsicht vor Safari 6 unter OS X, es ist table-layout: fixed; falsch (oder vielleicht nur anders, sehr verschieden von anderen Browsern. Ich habe das CSS2.1 REC-Tabellenlayout nicht Korrektur gelesen;)). Seien Sie auf unterschiedliche Ergebnisse vorbereitet.

FelipeAls
quelle
1
Danke, das scheint die Antwort zu sein. Ich weiß nicht warum, aber wenn ich die Breite auf 2% setze, wird jede Spalte tatsächlich auf 2% erhöht. Aber 100% scheint großartig zu funktionieren. Irgendeine Idee, was dort los ist?
Harry
3
Ich hatte das gleiche Problem, dass ich 100% Breite für die Tabellenzellen verwenden musste. Dies geschah aufgrund eines Clearfixes, der auf das übergeordnete Element mit display: table angewendet wurde. Da Zellen mit 100% Breite in IE8 nicht funktionieren, bestand der Fix für mich darin, den Clearfix zu entfernen. Hoffentlich hilft das jemandem.
Alex Barrett
Um dies zu erweitern, funktioniert dies für einfache Layouts (1x1, 2x2, 3x3 usw.), für komplexe Layouts (1x3x1, 1x2x3x4 usw.) müssen jedoch zusätzliche divs display:tableverwendet werden, als wären sie Zeilen, nicht display:tabl-rowwie manche erwarten. Beispiel hier .
Filoxo
2
100% Breite funktionierte auf IE8 nicht (Überraschung), aber der ursprüngliche Vorschlag für 2% liefert die richtigen Ergebnisse.
1
100% Breite funktionierte auch in IE10 nicht. Es hat in IE11 funktioniert. Mit einer Breite von 1% zeigt Mobile Safari super schmale Spalten. Also habe ich einen CSS-Hack verwendet, der auf IE9 und IE10 abzielt: .my-cell { width: 100%; }; @media screen and (min-width:0\0) { .my-cell { width: 1%; } }Der CSS-Hack ist von hier: 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.

Das Alpha
quelle
Die Geige funktioniert hier nicht. Die Zellen sind immer 25%.
netAction
Diese Lösung ist für alles Dynamische, wie die vom Client gesteuerte Site-Navigation, nicht sehr skalierbar.
Eric K
Wahrscheinlich hast du recht und übrigens ist es fast zwei Jahre alt anser @QuantumDynamix. Hast du etwas Besseres im Sinn? Warum nicht einfach deine Idee teilen, die Welt über bessere Dinge informieren :-)
The Alpha
15

Nur die Verwendung max-width: 0in dem display: table-cellElement hat für mich funktioniert:

.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>

José Antonio Postigo
quelle
1
Nur hier 0pxnicht auswählen, aber keine gültige Einheit. Es sollte einfach so sein 0.
Gavin
Das hat bei mir funktioniert, aber können Sie erklären, wie das funktioniert?
Emmanual
6

Ersetzen

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

mit

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

Schauen Sie sich alle Probleme an, die mit dem Versuch verbunden sind, Divs wie Tabellen auszuführen. Sie mussten table-xxx hinzufügen, um Tabellenlayouts nachzuahmen

Tabellen werden unterstützt und funktionieren in allen Browsern sehr gut. Warum sie fallen lassen? Die Tatsache, dass sie sie nachahmen mussten, ist ein Beweis dafür, dass sie ihre Arbeit gut gemacht haben.

Meiner Meinung nach verwenden Sie das beste Tool für den Job und wenn Sie tabellarische Daten oder etwas, das tabellarischen Datentabellen ähnelt, möchten, funktionieren Sie einfach.

Sehr späte Antwort Ich weiß, aber es lohnt sich zu äußern.

DeveloperChris
quelle
2
+1 weil es funktioniert und weil CSS immer noch funktioniert, macht dies 2014 nicht in allen Browsern richtig.
Yuck
6
Manchmal möchten Sie ein tabellenartiges Layout für Dinge, die keine tabellierten Daten sind. zB Navigationselemente , die verwendet werden sollen <nav>, <ul>usw.
Ben
1
Für Responsive ist es ideal, ein div-basiertes Layout zu haben. Das Anzeigen von Tabellen auf Mobilgeräten ist eine Qual.
Pablo Rincon
Der Versuch, eine Tabelle zu emulieren, schließt ein responsives Design aus. Ich bin damit einverstanden, wenn Sie reaktionsschnelles Design wünschen, sind Tabellen nicht die Wahl.
DeveloperChris
2
Es wurden Tabellen für die Anzeige von Tabellendaten erstellt: Es war, es ist und es werden die HTML-Elemente sein, die zum Anzeigen von Tabellendaten verwendet werden. Warum sollte jemand sie (zu diesem Zweck) fallen lassen? Das Tabellenlayout wird nicht nachgeahmt : Es ist seit einiger Zeit Teil der CSS2-Empfehlung und es kommt vor, dass das Standardlayout von HTML-Tabellen display: table-etc(ganz natürlich) ist. Ich verbringe meine Tage nicht damit, Links zu erstellen, die Divs oder Divs imitieren, die Tabellen, Bereiche oder Eingaben imitieren: Ich verwende nur CSS für das Styling. Schließlich viel Glück mit IE9 für das Anwenden eines anderen Wertes der displayEigenschaft auf Tabellen-, tr-, td-Elemente.
FelipeAls
1

Das wird für alle funktionieren

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

Dies funktioniert auch für Tabellendaten, die durch Iteration erstellt wurden

tcasante1
quelle
0

Bitte schön:

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

Sie können width: 100px nicht verwenden, da die Anzeige eine Tabellenzelle ist. Sie können jedoch Max-width: 100px verwenden. dann wird deine Box niemals größer als 100px. Sie müssen jedoch einen Überlauf hinzufügen: versteckt, um sicherzustellen, dass der Contect nicht in andere Zellen blutet. Sie können auch Leerzeichen hinzufügen: nowrap, wenn Sie verhindern möchten, dass die Höhe zunimmt.

Sammy
quelle
0

Dies kann erreicht werden, indem der Tabellenzellenstil auf width: autound der Inhalt leer gesetzt wird. Die Spalten sind jetzt gleich breit, enthalten jedoch keinen Inhalt.

Fügen Sie zum Einfügen von Inhalten in die Zelle eine divmit css hinzu:

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

Sie müssen auch position: relativezu den Zellen hinzufügen .

Jetzt können Sie den eigentlichen Inhalt in das oben beschriebene div einfügen.

https://jsfiddle.net/vensdvvb/

RnMss
quelle