Dlaczego elipsy CSS nie działają w komórce tabeli?

Rozważ następujący przykład: (live demo tutaj)

$(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>

Wyjście to: width = 139, a elipsa się nie pojawia.

Co mi umyka?
Author: ths, 2012-04-29

11 answers

Najwyraźniej, dodając:

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

Rozwiązuje również problem.


Innym możliwym rozwiązaniem jest ustawienie table-layout: fixed; dla tabeli, a także ustawienie width. Na przykład: http://jsfiddle.net/fd3Zx/5/

 107
Author: Misha Moroshko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-29 13:49:16

Ważne jest również, aby umieścić

table-layout:fixed;

Na tabelę zawierającą, więc działa dobrze w IE9 (jeśli używasz max-width), jak również.

 89
Author: streetlight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-11 12:05:50

Jak wspomniano wcześniej, możesz użyć td { display: block; }, ale to nie pozwala na użycie tabeli.

Możesz użyć table { table-layout: fixed; }, ale może chcesz, aby zachowywał się inaczej dla niektórych columów.

Więc najlepszym sposobem na osiągnięcie tego, co chcesz, byłoby zawinięcie tekstu w <div> i zastosowanie CSS do <div> (nie do <td>) w następujący sposób:

td {
  border: 1px solid black;
}
td > div {
  width: 50px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
 81
Author: marcosbdm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-03 00:37:34

Spróbuj użyć max-width zamiast width, tabela będzie nadal obliczać szerokość automatycznie.

Działa nawet w ie11 (z trybem zgodności 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 .

 44
Author: Asherah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-05 20:47:51

Strona Demo

Dla tabel o szerokości dynamicznej znalazłem poniżej sposób na uzyskanie satysfakcjonujących wyników. Każdy <th>, który chce mieć możliwość przycinania tekstu powinien mieć wewnętrzny element zawijania, który zawija zawartość <th> pozwolić text-overflow do pracy.

Prawdziwą sztuką jest ustawienie max-width (na <th>) w vw jednostki .

Spowoduje to, że Szerokość elementu zostanie "powiązana" z szerokością viewport (okno przeglądarki) i spowoduje przycinanie treści responsywnych. Ustaw jednostki vw na wymaganą wartość.

Minimal CSS:

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

Demo (z edytowalnymi tekstami):

document.designMode="on"
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>
 23
Author: vsync,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-15 13:15:55

Po prostu oferując alternatywę, ponieważ miałem ten problem i żadna z innych odpowiedzi tutaj nie przyniosła pożądanego efektu. Więc zamiast tego użyłem listy. Teraz semantycznie informacje, które wyprowadzałem, mogły być traktowane zarówno jako dane tabelaryczne, ale także dane wymienione.

Więc w końcu to co zrobiłem było:

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

Więc w zasadzie ul jest table, li jest tr i span jest td.

Następnie w CSS ustawiam span elementy na display:block; i float:left; (wolę taką kombinację do inline-block Jak to będzie działać w starszych wersjach IE, aby wyczyścić efekt float zobacz: http://css-tricks.com/snippets/css/clear-fix/) i mieć również elipsy:

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

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

Wtedy wystarczy ustawić max-widths swoich zakresów, a to nada liście wygląd tabeli.

 3
Author: diggersworld,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-15 17:04:43

Zamiast używać wielokropka do rozwiązania problemu przepełnionego tekstu, odkryłem, że wyłączone i stylizowane wejście wyglądało lepiej i nadal pozwala użytkownikowi przeglądać i zaznaczać cały ciąg znaków, jeśli zajdzie taka potrzeba.

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

Wygląda jak pole tekstowe, ale jest bardziej przyjazne dla użytkownika

 2
Author: craigsnyders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-03 09:11:02

Sprawdź box-sizing właściwości css Twoich elementów td. Miałem problem z szablonem css, który ustawia go na wartość border-box. Potrzebujesz zestawu box-sizing: content-box.

 1
Author: David Slavík,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-07 14:48:21

Próbowałem wielu z powyższych rozwiązań, ale żaden z nich nie czuł się elastyczny lub satysfakcjonujący.

Ten mały hack o max-width: 1px może być zastosowany bezpośrednio do elementu td

.truncated-cell {
   max-width: 1px;
   white-space: nowrap;
   overflow: hidden;
   text-overflow: ellipsis;
 }
 1
Author: J.Kirk.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-06 13:59:26

Zostaw swoje stoły tak, jak są. Po prostu owinąć zawartość wewnątrz TD z zakresu, który ma CSS okrojenia stosowane.

/* 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>
 0
Author: Jeff Sieffert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-16 21:46:56

Jeśli nie chcesz ustawić max-width na td( jak w ta ODPOWIEDŹ), możesz ustawić max-width na div:

function so_hack(){}

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

function so_hack(){}

Uwaga: 100% nie działa, ale 99% działa w FF. Inne nowoczesne przeglądarki nie wymagają głupich hacków div.

td {
  border: 1px solid black;
    padding-left:5px;
    padding-right:5px;
}
td>div{
    max-width: 99%;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;

}
 -2
Author: Timo Kähkönen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:14