¿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?



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/


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).


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

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 .


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>


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.


¿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


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.


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>

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;

}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.