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;}
ShaneKm
quelle

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>
Doug Amos
quelle
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;
}
Sander
quelle
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.

Gipfel
quelle
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;
}
Abudayah
quelle
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