¿Por qué no funcionan los puntos suspensivos CSS en la celda de la tabla?

150

Considere el siguiente ejemplo: ( demostración en vivo aquí )

$(function() {
  console.log("width = " + $("td").width());
});
td {
  border: 1px solid black;
  width: 50px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
  <tbody>
    <tr>
      <td>Hello Stack Overflow</td>
    </tr>
  </tbody>
</table>

El resultado es: width = 139y los puntos suspensivos no aparecen.

¿Que me estoy perdiendo aqui?

Misha Moroshko
fuente
2
posible duplicado de desbordamiento de texto CSS en una celda de tabla?
BoltClock
De alguna manera duplicar, pero la respuesta no proporciona una solución (como lo hace Arlen Cuss).
Florian Margaine
1
widthy heighten la tabla, las celdas siempre se usan como ancho y alto mínimos . ¡Las celdas de la tabla son diferentes!
Sr. Lister
1
@FlorianMargaine En realidad, la otra pregunta proporciona una solución alternativa: coloque un div en la celda con el ancho deseado.
Sr. Lister
Sin embargo, todavía prefiero las respuestas que figuran en esta página.
Florian Margaine

Respuestas:

102

Aparentemente, agregando:

td {
  display: block; /* or inline-block */
}

resuelve el problema también.


Otra posible solución es establecer table-layout: fixed;la tabla, y también establecerla width. Por ejemplo: http://jsfiddle.net/fd3Zx/5/

Misha Moroshko
fuente
44
Exactamente. Los elementos con display: table-cell(el valor predeterminado para los tdelementos) no aceptan un ancho.
Michael Mior
29
display: block;tipo de derrotas el propósito de usar una tabla. Me gusta la table-layout: fixed;opción, funcionó bien para mí.
Alex K
77
table-layout:fixeddistribuye el ancho de las columnas de una manera menos inteligente. ¿Hay otra opción que asigne el ancho de columna de la misma manera table-layout: normaly, sin embargo, muestre los puntos suspensivos correctamente?
anida el
Esto se atornilla con el borde de la mesa; usando max-width no.
Charlie
85

También es importante poner

table-layout:fixed;

En la tabla que contiene, por lo que también funciona bien en IE9 (si utiliza max-width).

luz de la calle
fuente
77
esto también asegurará que el desbordamiento de texto funcione en diseños receptivos
jao
3
Esto es exactamente lo que necesitaba. Tengo el ancho de la mesa al 100%. Y todas las columnas, excepto una con un ancho fijo. Esto permite que la última columna ocupe tanto espacio como queda.
matthew_360
78

Como se dijo antes, puede usar, td { display: block; }pero esto anula el propósito de usar una tabla.

Puede usar, table { table-layout: fixed; }pero tal vez desee que se comporte de manera diferente para algunas columnas.

Entonces, la mejor manera de lograr lo que desea sería envolver su texto en <div>ay aplicar su CSS al <div>(no al <td>) de esta manera:

td {
  border: 1px solid black;
}
td > div {
  width: 50px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
marcosbdm
fuente
2
Este es el método más simple que he visto y en realidad funciona en IE8.
Keith Ketterer
2
ESA es realmente la mejor solución que he visto en puntos suspensivos en tablas.
membersound
41

Intente usar en max-widthlugar de width, la tabla seguirá calculando el ancho automáticamente.

Funciona incluso en ie11(con el modo de compatibilidad ie8).

td.max-width-50 {
  border: 1px solid black;
  max-width: 50px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
<table>
  <tbody>
    <tr>
      <td class="max-width-50">Hello Stack Overflow</td>
    </tr>
    <tr>
      <td>Hello Stack Overflow</td>
    </tr>
    <tr>
      <td>Hello Stack Overflow</td>
    </tr>
  </tbody>
</table>

jsfiddle .

Asera
fuente
1
Bien descrito. Probablemente sea mejor usar ambos , para que el elemento tenga un ancho fijo. De lo contrario, podría ser más corto si el contenido lo permitiera.
LSerni
Mucho mejor que mostrar hack; tornillos de display con el borde de la mesa.
Charlie
21

Página de demostración

Para las tablas con ancho dinámico, encontré la siguiente forma de producir resultados satisfactorios. Cada uno <th>que desee tener la capacidad de texto recortado debe tener un elemento de ajuste interno que envuelva el contenido del <th>permiso text-overflowpara trabajar.

El verdadero truco es establecer max-width(en <th>) en vwunidades .

Esto hará que el ancho del elemento esté "vinculado" al ancho de la ventana gráfica (ventana del navegador) y dará como resultado un recorte de contenido receptivo. Establezca las vwunidades a un valor satisfactorio necesario.

CSS mínimo:

th{ max-width:10vw; }
      
th > .wrap{ 
   text-overflow:ellipsis;
   overflow:hidden;
   white-space:nowrap;
}

Aquí hay una demostración ejecutable:

table {
  font: 18px Arial;
  width: 40%;
  margin: 1em auto;
  color: #333;
  border: 1px solid rgba(153, 153, 153, 0.4);
}

table td, table th {
  text-align: left;
  padding: 1.2em 20px;
  white-space: nowrap;
  border-left: 1px solid rgba(153, 153, 153, 0.4);
}

table td:first-child, table th:first-child {
  border-left: 0;
}

table th {
  border-bottom: 1px solid rgba(153, 153, 153, 0.4);
  font-weight: 400;
  text-transform: uppercase;
  max-width: 10vw;
}

table th > .wrap {
  text-overflow: ellipsis;
  overflow: hidden;
  white-space: nowrap;
}
<table>
    <thead>
        <tr>
            <th>
                <div class="wrap" title="Some long title">Some long title</div>
            </th>
            <th>
                <div class="wrap">Short</div>
            </th>
            <th>
                <div class="wrap">medium one</div>
            </th>
            <th>
                <div class="wrap" title="endlessly super long title which no developer likes to see">endlessly super long title which no developer likes to see</div>
            </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>-</td>
            <td>-</td>
            <td>-</td>
            <td>very long text here</td>
        </tr>
    </tbody>
</table>

vsync
fuente
3

Solo ofrecí una alternativa porque tenía este problema y ninguna de las otras respuestas aquí tuvo el efecto deseado que quería. Entonces, en cambio, usé una lista. Ahora, semánticamente, la información que estaba enviando podría considerarse tanto datos tabulares como datos listados.

Así que al final lo que hice fue:

<ul>
    <li class="group">
        <span class="title">...</span>
        <span class="description">...</span>
        <span class="mp3-player">...</span>
        <span class="download">...</span>
        <span class="shortlist">...</span>
    </li>
    <!-- looped <li> -->
</ul>

Así que básicamente ules table, lies try spanes td.

Luego, en CSS, configuro los spanelementos para que sean display:block;y float:left;(prefiero esa combinación inline-blockya que funcionará en versiones anteriores de IE, para borrar el efecto flotante, consulte: http://css-tricks.com/snippets/css/clear- arreglar / ) y también tener las elipses:

span {
    display: block;
    float: left;
    width: 100%;

    // truncate when long
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

Luego, todo lo que debe hacer es establecer el max-widthsintervalo y eso le dará a la lista una apariencia de tabla.

diggersworld
fuente
¿Puedes aplicar ul dentro de td (por ejemplo <td><ul>...</ul></td>)? No parece funcionar para mí :(
Sam
2

En lugar de usar puntos suspensivos para resolver el problema de desbordamiento de texto, descubrí que una entrada deshabilitada y con estilo se veía mejor y aún permite al usuario ver y seleccionar toda la cadena si es necesario.

<input disabled='disabled' style="border: 0; padding: 0; margin: 0" />

Parece un campo de texto pero se puede resaltar, por lo que es más fácil de usar

craigsnyders
fuente
2
No es fácil de usar porque al usar tecnologías de asistencia, esto se lee mal como entrada y, por lo tanto, el usuario cree que puede ingresar algo. No está bien hacer un mal uso de la semántica de los elementos.
Carlo
Dios mío, esto es tan inteligente! Como es parte de la tabla, simplemente configure la entrada como sin bordes con fondo transparente. ¡Amo esta solución!
Sam
1

Verifique la box-sizingpropiedad css de sus tdelementos. Tuve un problema con la plantilla css que lo establece en border-boxvalor. Necesitas conjunto box-sizing: content-box.

David Slavík
fuente
0

Deja tus mesas como están. Simplemente envuelva el contenido dentro de los TD con un lapso que tenga aplicado el CSS de truncamiento.

/* CSS */
.truncate {
    width: 50px; /*your fixed width */
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    display: block; /* this fixes your issue */
}

<!-- HTML -->
<table>
    <tbody>
        <tr>
            <td>
                <span class="truncate">
                    Table data to be truncated if it's too long.
                </span>
            </td>
        </tr>
    </tbody>
</table>
Jeff Sieffert
fuente
Intenté esto, no funciona en DataTables.net. ¿alguna idea?
Sam
-2

Si no desea establecer max-width en td (como en esta respuesta ), puede establecer max-width en div:

function so_hack(){}

function so_hack(){} http://jsfiddle.net/fd3Zx/754/ function so_hack(){}

function so_hack(){}

Nota: 100% no funciona, pero 99% hace el truco en FF. Otros navegadores modernos no necesitan trucos div tontos.

td {
  borde: 1px negro sólido;
    relleno-izquierda: 5px;
    relleno derecho: 5px;
}
td> div {
    ancho máximo: 99%;
    desbordamiento: oculto;
    desbordamiento de texto: puntos suspensivos;
    espacio en blanco: nowrap;

}
Timo Kähkönen
fuente