Ancho automático de la columna de la tabla CSS

100

Dado lo siguiente, ¿cómo puedo hacer que mi última columna se ajuste automáticamente a su contenido? (La última columna debe tener un tamaño automático de ancho para el contenido. Supongamos que solo tengo 1 elemento li, debería encogerse en lugar de tener 3 elementos li, etc.):

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

Respuestas:

218

Lo siguiente resolverá su problema:

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

Solución flexible basada en clases

Y una solución más flexible es crear una .fitwidthclase y aplicarla a cualquier columna que desee para asegurarse de que su contenido se ajuste en una línea:

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

Y luego en tu HTML:

<tr>
    <td class="fitwidth">ID</td>
    <td>Description</td>
    <td class="fitwidth">Status</td>
    <td>Notes</td>
</tr>
Doug Amos
fuente
3
¡Funciona perfectamente! (mi caso tiene un ancho de tabla del 100% y ninguna otra columna tiene ancho. Se aplicó esto a una columna). Probado en IE7 /
8/9
wow, nunca pensé que esto fuera posible con tablas html. ¡Gracias!
kulpae
14
En lugar de agregar manualmente la clase '.last', puede usar 'td: last-child' como selector.
T.Ho
3
Esta solución funciona bien sin table-layout: fixedeso se establece en el css en la pregunta jsfiddle.net/hCkch/1
David Sherret
1
¡Effing genial, amigo! Un truco realmente inteligente para "priorizar" ciertas columnas para asegurarse de que no se aplasten en varias líneas por columnas grandes de "texto", como "Descripción" o "Notas". ¡Buena esa! Para hacerlo aún más útil, llamaría a la clase .fitwidthy luego simplemente establecería la clase en las columnas que no desea que vayan a varias líneas. Editaré tu respuesta para agregar eso.
Joshua Pinter
25

Si desea asegurarse de que la última fila no se ajuste y, por lo tanto, el tamaño que desee, eche un vistazo a

td {
 white-space: nowrap;
}
Lijadora
fuente
1

Puede especificar el ancho de todas las celdas de la tabla excepto las últimas y agregar un diseño de tabla: fijo y un ancho a la tabla.

Usted podría establecer

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

(o establezca esto para el último TD como sugirió Sander).

Esto obliga a que los LI en línea no se rompan. Desafortunadamente, esto no conduce a un nuevo cálculo de ancho en el UL contenedor (y este TD principal) y, por lo tanto, no ajusta automáticamente el último TD.

Esto significa: si un elemento en línea no tiene un ancho determinado, el ancho de un TD siempre se calcula automáticamente primero (si no se especifica). Luego, su contenido en línea con este ancho calculado se procesa y white-spacese aplica la propiedad -propiedad, extendiendo su contenido más allá de los límites calculados.

Entonces supongo que no es posible sin tener un elemento dentro del último TD con un ancho específico.

cumbre
fuente
no es bueno. eso es exactamente lo que estoy tratando de evitar. No quiero especificar anchos de columna. las columnas deben tener un tamaño automático y la última columna debe reducirse al contenido que contiene.
ShaneKm
¿Puede proporcionar las definiciones de CSS para las clases que utilizó?
acme
-2

use auto y ancho mínimo o máximo como este:

td {
max-width:50px;
width:auto;
min-width:10px;
}
Abudayah
fuente
1
Esto no funciona como se requiere, cuando tengo un contenido más pequeño, todavía usa el ancho máximo.
marcovtwout
el ancho mínimo no se aplica a la celda de la tabla.
Nick