Automatische Breite der CSS-Tabellenspalte


100

Wie kann ich die Größe meiner letzten Spalte automatisch anpassen? (Die letzte Spalte sollte die Breite des Inhalts automatisch anpassen. Angenommen, ich habe nur 1 Li-Element, das verkleinert werden soll, im Gegensatz zu 3 Li-Elementen usw.):

            <table cellspacing="0" cellpadding="0" border="0">
            <thead><!-- universal table heading -->
                <tr>
                    <td class="tc first"><input type="checkbox" value="true" name="data-1-check-all" id="data-1-check-all"></td>
                    <td class="tc">Type</td>
                    <th>File</th>
                    <th>Sample</th>
                    <th>Action</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>Division 1</td>
                    <td>Division 2</td>
                    <td>Division 3</td>
                    <td>Division 4</td>
                    <td>Division 5</td>
                </tr>
                <tr>
                    <td>Division 1</td>
                    <td>Division 2</td>
                    <td>Division 3</td>
                    <td>Division 4</td>
                    <td class="last">
                        <ul class="actions">
                            <li><a class="iconStats" href="#">Statystyki</a></li>
                            <li><a class="iconEdit" href="#">Edytuj</a></li>
                            <li><a class="iconDelete" href="#">Usuń</a></li>

                        </ul>
                    </td>
                </tr>
            </tbody>
        </table>

CSS:

table { table-layout: fixed; width: 100%; }
table tr { border-bottom:1px solid #e9e9e9; }
table thead td, th {border-left: 1px solid #f2f2f2; border-right: 1px solid #d5d5d5; background: #ddd url("../images/sprites4.png") repeat-x scroll 0 100% ; font-weight: bold; text-align:left;}
table tr td, th { border:1px solid #D5D5D5; padding:15px;}
table tr:hover { background:#fcfcfc;}
table tr ul.actions {margin: 0;}
table tr ul.actions li {display: inline; margin-right: 5px;}

Antworten:


218

Folgendes wird Ihr Problem lösen:

td.last {
    width: 1px;
    white-space: nowrap;
}

Flexible, klassenbasierte Lösung

Eine flexiblere Lösung besteht darin, eine .fitwidthKlasse zu erstellen und diese auf alle Spalten anzuwenden, um sicherzustellen, dass deren Inhalt in eine Zeile passt:

td.fitwidth {
    width: 1px;
    white-space: nowrap;
}

Und dann in Ihrem HTML:

<tr>
    <td class="fitwidth">ID</td>
    <td>Description</td>
    <td class="fitwidth">Status</td>
    <td>Notes</td>
</tr>

3
Funktioniert perfekt! (Mein Fall hat eine Tabellenbreite von 100% und keine anderen Spalten haben eine Breite. Dies wird auf eine Spalte angewendet.) Getestet in IE7 /
8/9

Wow, hätte nie gedacht, dass dies mit HTML-Tabellen möglich ist. Danke dir!
Kulpae

14
Anstatt die Klasse '.last' manuell hinzuzufügen, können Sie einfach 'td: last-child' als Selektor verwenden.
T.Ho

3
Diese Lösung funktioniert gut, ohne table-layout: fixeddass dies in der CSS in der Frage jsfiddle.net/hCkch/1
David Sherret

1
Effing brillant, Kumpel! Wirklich cleverer Trick, um bestimmte Spalten zu "priorisieren", um sicherzustellen, dass sie nicht durch große "Text" -Spalten wie "Beschreibung" oder "Notizen" in mehrere Zeilen zerquetscht werden. Schön! Um es noch nützlicher zu machen, würde ich die Klasse aufrufen .fitwidthund dann einfach die Klasse auf die Spalten setzen, die nicht in mehrere Zeilen verschoben werden sollen. Ich werde Ihre Antwort bearbeiten, um das hinzuzufügen.
Joshua Pinter

25

Wenn Sie sicherstellen möchten, dass die letzte Zeile nicht umbrochen wird und somit die gewünschte Größe aufweist, schauen Sie sich diese an

td {
 white-space: nowrap;
}

1

Sie können die Breite aller Zellen außer den letzten Tabellenzellen angeben und der Tabelle ein Tabellenlayout hinzufügen: fest und eine Breite.

Sie könnten einstellen

table tr ul.actions {margin: 0; white-space:nowrap;}

(oder stellen Sie dies für den letzten TD ein, wie Sander stattdessen vorgeschlagen hat).

Dies zwingt die Inline-LIs, nicht zu brechen. Leider führt dies nicht zu einer neuen Breitenberechnung im enthaltenden UL (und diesem übergeordneten TD) und führt daher nicht zu einer automatischen Größenänderung des letzten TD.

Dies bedeutet: Wenn ein Inline-Element keine bestimmte Breite hat, wird die Breite eines TD immer zuerst automatisch berechnet (falls nicht angegeben). Dann wird sein Inline-Inhalt mit dieser berechneten Breite gerendert und die white-spaceEigenschaft angewendet, wodurch sein Inhalt über die berechneten Grenzen hinaus gedehnt wird.

Ich denke, es ist nicht möglich, ohne ein Element innerhalb des letzten TD mit einer bestimmten Breite zu haben.


nicht gut. Genau das versuche ich zu wecken. Ich möchte keine Spaltenbreiten angeben. Spalten sollten automatisch verkleinert werden und die letzte Spalte sollte auf den Inhalt darin verkleinert werden.
ShaneKm

Können Sie die CSS-Definitionen für die von Ihnen verwendeten Klassen bereitstellen?
Acme

-2

Verwenden Sie Auto und Min oder Max Breite wie folgt:

td {
max-width:50px;
width:auto;
min-width:10px;
}

1
Dies funktioniert nicht wie erforderlich, wenn ich kleinere Inhalte habe, wird immer noch die maximale Breite verwendet.
Marcovtwout

Die Mindestbreite gilt nicht für Tabellenzellen.
Nick
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.