Feste Tabellenzellenbreite

175

Viele Leute verwenden immer noch Tabellen, um Steuerelemente, Daten usw. zu gestalten - ein Beispiel dafür ist das beliebte jqGrid. Es passiert jedoch etwas Magisches, das ich nicht zu ergründen scheinen kann (seine Tische zum lauten Schreien, wie viel Magie könnte es möglicherweise geben?)

Wie ist es möglich, die Spaltenbreite einer Tabelle festzulegen und zu befolgen, wie es jqGrid tut? Wenn ich versuche, dies zu replizieren <td style='width: 20px'>, wird die Zelle erweitert , selbst wenn ich alle festlege , sobald der Inhalt einer dieser Zellen größer als 20 Pixel ist!

Irgendwelche Ideen oder Einsichten?

Jimbo
quelle

Antworten:

249

Sie können versuchen, das <col>Tag-Tabellen-Styling für alle Zeilen zu verwenden, müssen jedoch den table-layout:fixedStil für die <table>CSS-Klasse oder die Tabelle festlegen und den overflowStil für die Zellen festlegen

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col

<table class="fixed">
    <col width="20px" />
    <col width="30px" />
    <col width="40px" />
    <tr>
        <td>text</td>
        <td>text</td>
        <td>text</td>
    </tr>
</table>

und das ist dein CSS

table.fixed { table-layout:fixed; }
table.fixed td { overflow: hidden; }
Jäger
quelle
15
col würde nicht in HTML5 funktionieren, sondern die Breite der einzelnen td stattdessen durch Inline-CSS- oder CSS-Klassen
festlegen
10
Die akzeptierte Antwort funktioniert nur, wenn Sie explizit eine Breite für die gewünschte Tabelle anwenden. Funktioniert einwandfrei, unabhängig davon, ob Sie eine Einheit oder einen Prozentsatz verwenden. Ich dachte, ich würde darauf hinweisen, da die Antwort von @ totymedli keine Stimmen erhielt und ich nicht wollte, dass Benutzer sie ignorieren. Der Wortumbruchvorschlag ist jedoch nur erforderlich, wenn Sie dies anstreben.
Thebdawk05
Was passiert, wenn Sie Zeilen mit nur 1 TD-Element haben, die mehrere Spalten umfassen? Wenn Sie Ihren Beispielcode <TD colspan="3">in einer Reihe alleine hätten, wäre er 90px?
Sab669
Danke, es hat geholfen. Fügen Sie dies für Datenüberlappungen hinzu table.fixed td { word-wrap: break-word; }.
Parag Tyagi
Der Wortumbruchvorschlag ist nicht erforderlich, aber für den Rest der SO-Benutzer nützlich und für die Frage recht relevant, da in den meisten Szenarien mit ziemlicher Sicherheit überlaufende Inhalte in Tabellen mit fester Breite auftreten.
Amy Pellegrini
100

Jetzt haben wir in HTML5 / CSS3 eine bessere Lösung für das Problem. Meiner Meinung nach wird diese reine CSS-Lösung empfohlen:

table.fixed {table-layout:fixed; width:90px;}/*Setting the table width is important!*/
table.fixed td {overflow:hidden;}/*Hide text outside the cell.*/
table.fixed td:nth-of-type(1) {width:20px;}/*Setting the width of column 1.*/
table.fixed td:nth-of-type(2) {width:30px;}/*Setting the width of column 2.*/
table.fixed td:nth-of-type(3) {width:40px;}/*Setting the width of column 3.*/
<table class="fixed">
    <tr>
        <td>Veryverylongtext</td>
        <td>Actuallythistextismuchlongeeeeeer</td>
        <td>We should use spaces tooooooooooooo</td>
    </tr>
</table>

Sie müssen die Tabellen widthauch in der Spuklösung einstellen . Sonst funktioniert es nicht.
Eine neue CSS3-Funktion, die vsync vorgeschlagen hat, ist : word-break:break-all;. Dadurch werden die Wörter ohne Leerzeichen auch in mehrere Zeilen aufgeteilt. Ändern Sie einfach den Code wie folgt:

table.fixed { table-layout:fixed; width:90px; word-break:break-all;}

Endergebnis

Tabelle gerendert

totymedli
quelle
Wenn Sie eine Reihe mit a einwerfen colspan, scheint dies diese Lösung zu brechen. Irgendwelche Vorschläge zur Verwendung dieser Lösung mit einer Tabelle, die colspan> 1 enthält ?
Eric K
@QuantumDynamix Ich habe dies behoben, indem ich als erste Zeile eine Zeile ohne Spaltenbereiche eingefügt habe, nur alle einzelnen Spalten mit Breiten. Ich habe dann diese Zeile mit 0 Höhe, Rand: keine, Sichtbarkeit: versteckt, Polsterung: 0px usw. versteckt, dann ist die zweite Zeile die erste, die ich sehen möchte, wo es Colspans gibt. Die erste Zeile mit einzelnen Zellen mit fester Breite legt die Breiten fest.
AaronLS
@totymedli Irgendwelche Ideen, wie ich meine Tabelle dazu bringen kann, die Summe aller meiner Spaltenbreiten zu übernehmen? Meine Tabelle wird ein wenig dynamisch generiert und ich kann die Tabellenbreite nicht im Voraus berechnen, aber ich möchte nicht 100% verwenden, da dies einige Elemente ausdehnt.
AaronLS
14
table td 
{
  table-layout:fixed;
  width:20px;
  overflow:hidden;
  word-wrap:break-word;
}
ajreal
quelle
9
Sind Sie sicher, dass Sie table-layoutein td-Element verwenden können?
Nick
@ Nick - es funktioniert in Ordnung. Hovewer ich muss auch min-width und max-width Eigenschaft hinzufügen (gleicher Wert wie width), und dann wurde es wirklich feste Breite.
Denis Khay
11

Ich hatte eine lange Tabelle td Zelle, dies zwang die Tabelle an die Ränder des Browsers und sah hässlich aus. Ich wollte nur, dass diese Spalte nur eine feste Größe hat und die Wörter bricht, wenn sie die angegebene Breite erreicht. Das hat bei mir also gut funktioniert:

<td><div style='width: 150px;'>Text to break here</div></td>

Sie müssen keinen Stil für Tabellen- und Tr-Elemente angeben. Sie können auch Überlauf verwenden: versteckt; wie von anderen Antworten vorgeschlagen, aber es führt dazu, dass der überschüssige Text verschwindet.

Tarik
quelle
2
Oder Sie können bei Bedarf die maximale Breite anstelle der Breite verwenden. Auf diese Weise können Sie den Text nur dann unterbrechen, wenn Sie Ihre Breitenbeschränkung erreicht haben. Und die Tabellenzelle hat keinen leeren Raum, wenn Ihr Text kleiner als die angegebene Breite ist. <td> <div style = 'max-width: 150px;'> Text, der hier unterbrochen werden soll </ div> </ td>
Tarik
1
table { 
    table-layout:fixed; width:200px;
}
table tr {
    height: 20px;
}

10x10

user1993774
quelle
0

für FULLSCREEN-Breitentabelle:

  • Tischbreite MUSS 100% sein

  • Wenn N Spalten benötigt werden, MÜSSEN THs N + 1 sein

Beispiel für 3 Spalten:

table.fixed {
      table-layout: fixed;
      width: 100%;
    }
    table.fixed td {
      overflow: hidden;
    }
  <table class="fixed">
      <col width=20 />
      <col width=20 />
      <col width=20 />
    <tr>
      <th>1</th>
      <th>2</th>
      <th>3</th>
      <th>FREE</th>
    </tr>
    <tr>
      <td>text111111111</td>
      <td>text222222222</td>
      <td>text3333333</td>
    </tr>
  </table>

Ramil Gilfanov
quelle
-2
table
{
  table-layout:fixed;
}
td,th
{
  width:20px; 
  word-wrap:break-word;
}

: erstes Kind ...: n-tes Kind (1) oder ...

xhdix
quelle