Переповнення тексту CSS у комірці таблиці?


499

Я хочу використовувати CSS text-overflowу комірці таблиці, якщо текст занадто довгий, щоб розміститися на одному рядку, він буде обрізати еліпсисом, а не перетворювати на кілька рядків. Чи можливо це?

Я спробував це:

td {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

Але, white-space: nowrapздається, текст (і його комірка) постійно розширюється вправо, висуваючи загальну ширину таблиці понад ширину контейнера. Однак без цього текст продовжує перетворюватися на кілька рядків, коли він потрапляє на край клітинки.


9
Осередки таблиці не справляються overflowдобре. Спробуйте ввести дів у клітинку та вкажіть її.
Містер Лістер

Відповіді:


897

Щоб обрізати текст еліпсисом, коли він переповнює комірку таблиці, вам потрібно буде встановити max-widthвластивість CSS для кожного tdкласу, щоб переповнення працювало. Ніяких додаткових роздрібних макетів не потрібно

td {
    max-width: 100px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

Для чуйних макетів; використовуйте max-widthвластивість CSS, щоб вказати ефективну мінімальну ширину стовпця, або просто використовувати max-width: 0;для необмеженої гнучкості. Також, що містить таблицю, потрібна буде певна ширина, як правило width: 100%;, і стовпці зазвичай мають їх ширину, встановлену як відсоток від загальної ширини

table {
    width: 100%;
}
td {
    max-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
td.columnA {
    width: 30%;
}
td.columnB {
    width: 70%;
}

Історичний: Для IE 9 (або менше) вам потрібно мати це у своєму HTML, щоб виправити специфічну для IE проблему візуалізації

<!--[if IE]>
<style>
    table {
        table-layout: fixed;
        width: 100px;
    }
</style>
<![endif]-->

7
Таблиці також потрібна ширина, щоб це працювало в IE. jsfiddle.net/rBthS/69
Тревор Діксон

1
Якщо встановити width: 100%;іmin-width: 1px; комірка завжди буде максимально широкою і використовуватиме еліпсис для врізання тексту лише тоді, коли це потрібно (не тоді, коли ширина елемента досягає певного розміру) - це дуже корисно для чуйних макетів.
Дункан Уокер

2
@OzrenTkalcecKrznaric він працює display: table-cellдійсно, але не тоді, коли значення max-widthвизначено у відсотках (%). Тестовано на FF 32
Грег

14
(Дотримуючись вищесказаного) у випадку, коли ви використовуєте% значень, тоді лише використання table-layout: fixedелемента з display: tableвиконає трюк
Грег

1
Як щодо того, якщо ви хочете, щоб ширина стовпців призначалася автоматично в такий спосіб, як, наприклад, таблиця, що реагує на завантаження? встановлення максимальної ширини буде втручатися в це. Чи існує рішення?
гніздо

81

Визначення max-widthчи фіксовану ширину працює не у всіх ситуаціях, і таблиця повинна бути текучою та автоматично розміщувати її комірки. Ось для чого призначені таблиці.

Використовуйте це: http://jsfiddle.net/maruxa1j/

HTML:

<td class="ellipsis">
    <span>This Text Overflows and is too large for its cell.</span>
</td>

CSS:

.ellipsis {
    position: relative;
}
.ellipsis:before {
    content: '&nbsp;';
    visibility: hidden;
}
.ellipsis span {
    position: absolute;
    left: 0;
    right: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

Працює на IE9 та інших браузерах.


Примітка. Цей розчин обгортає вміст комірок в <span>елементи.
Рой Тінкер

2
Це дійсно розумне рішення, і добре працює для всіх таблиць, для яких я потребував би рішення. Однак потрібно вимагати встановлення ширини, якщо ви не хочете, щоб усі комірки таблиці були однакової ширини.
Кевін Біл

Коли немає фіксованої ширини, це рішення працює найкраще. Дуже розумно дійсно!
авіденік

1
Це зберігає вертикальне вирівнювання, коли іншого рішення, як display: blockне було,
j3ff

Просто найкраще рішення будь-коли! Досить геніальний. Дуже дякую.
ClownCoder

39

Чому це відбувається?

Здається, цей розділ на w3.org припускає, що переповнення тексту стосується лише блокових елементів :

11.1.  Overflow Ellipsis: the ‘text-overflow’ property

text-overflow      clip | ellipsis | <string>  
Initial:           clip   
APPLIES TO:        BLOCK CONTAINERS               <<<<
Inherited:         no  
Percentages:       N/A  
Media:             visual  
Computed value:    as specified  

MDN говорить те ж саме .

У цьому jsfiddle є ваш код (з кількома модифікаціями налагодження), який добре працює, якщо він застосований до divа td. Він також має єдине вирішення, про яке я міг швидко придумати, загорнувши вміст блоку, tdщо містить div. Однак це виглядає як "потворна" розмітка для мене, тому я сподіваюся, що хтось інший має краще рішення. Код для перевірки виглядає приблизно так:

td, div {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  border: 1px solid red;
  width: 80px;
}
Works, but no tables anymore:
<div>Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah.</div>

Works, but non-semantic markup required:
<table><tr><td><div>Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah.</div></td></tr></table>


2
Приємно, дякую. Я не міг видалити комірки таблиці зі своєї розмітки, тому замість цього я просто загорнув вміст у divs (з їх шириною, встановленою на ширину комірок) і застосував там переповнення. Працював як шарм!
daGUY

28

Якщо ви не хочете нічого встановлювати фіксовану ширину

Наведене нижче рішення дозволяє мати довгий вміст комірок таблиці, але не повинен впливати ні на ширину батьківської таблиці, ні на висоту батьківського рядка. Наприклад, де ви хочете мати таблицю, width:100%яка все ще застосовує функцію автоматичного розміру до всіх інших комірок. Корисно в сітках даних зі стовпцем "Примітки" або "Коментар" або щось подібне.

введіть тут опис зображення

Додайте ці 3 правила до свого CSS:

.text-overflow-dynamic-container {
    position: relative;
    max-width: 100%;
    padding: 0 !important;
    display: -webkit-flex;
    display: -moz-flex;
    display: flex;
    vertical-align: text-bottom !important;
}
.text-overflow-dynamic-ellipsis {
    position: absolute;
    white-space: nowrap;
    overflow-y: visible;
    overflow-x: hidden;
    text-overflow: ellipsis;
    -ms-text-overflow: ellipsis;
    -o-text-overflow: ellipsis;
    max-width: 100%;
    min-width: 0;
    width:100%;
    top: 0;
    left: 0;
}
.text-overflow-dynamic-container:after,
.text-overflow-dynamic-ellipsis:after {
    content: '-';
    display: inline;
    visibility: hidden;
    width: 0;
}

Форматуйте подібний HTML у будь-якій комірці таблиці, у якій потрібно динамічне переповнення тексту:

<td>
  <span class="text-overflow-dynamic-container">
    <span class="text-overflow-dynamic-ellipsis" title="...your text again for usability...">
      //...your long text here...
    </span>
  </span>
</td>

Додатково застосуйте бажану min-width(або взагалі жодну) до комірки таблиці.

Звичайно загадка: https://jsfiddle.net/9wycg99v/23/


Найкорисніша відповідь: Динамічний еліпсис просто приголомшливий.
lucifer63

Він змінює вибрані межі ширини кожного стовпця, наприклад, якщо у вас визначено кілька стовпців, max-width: Xвони тепер можуть бути ширшими - я думав, що це через display: flexвикористання, але я видалив це і не бачу різниці ...
user9645

24

Здається, що якщо ви вкажете table-layout: fixed;на tableелементі, то ваші стилі для tdповинні вступити в силу. Це також вплине на розмір клітин.

Sitepoint трохи обговорює методи компонування таблиць тут: http://reference.sitepoint.com/css/tableformatting


2
Це має бути правильною відповіддю, коли ви не хочете вказувати ширину таблиці.
Адріан

20

Якщо ви просто хочете, щоб таблиця була автоматично розміщена

Без використання max-widthабо процентної ширини стовпців table-layout: fixedтощо

https://jsfiddle.net/tturadqq/

Як це працює:


Крок 1: Дозвольте автоматичному розташуванню таблиці зробити свою справу.

Коли є один або кілька стовпців з великою кількістю тексту, він максимально скоротить інші стовпці, а потім оберне текст довгих стовпців:

введіть тут опис зображення


Крок 2: Загорніть вміст комірок у div, а потім встановіть цей div max-height: 1.1em

(додаткові 0,1ем призначені для символів, які відображають трохи нижче текстової бази, наприклад, хвіст 'g' та 'y')

введіть тут опис зображення


Крок 3: Встановіть titleдіви

Це добре для доступності та необхідне для маленької хитрості, яку ми використаємо за мить.

введіть тут опис зображення


Крок 4: Додайте CSS ::afterу діві

Це хитрий біт. Ми встановлюємо CSS ::after, з content: attr(title), а потім розміщуємо його над ділом і встановлюємо text-overflow: ellipsis. Я забарвив його тут червоним, щоб було зрозуміло.

(Зверніть увагу, як довгий стовпчик тепер має хвостовий еліпсис)

введіть тут опис зображення


Крок 5: Встановіть колір тексту ділення transparent

І ми закінчили!

введіть тут опис зображення


2
Це дивовижне та ідеальне рішення! Цікаво, чому це отримало негативний голос замість більшості результатів !!
zendu

2
Дивовижно, чоловіче! (@ user9645 - це не так: нехай це працює з таблицею, поданою за допомогою Vue.js - обов'язково поставте заголовки на діви, а не на td)
Крістіан Опіц

@ChristianOpitz - Так, я, мабуть, це якось переплутав ... повторив це, і він працює.
user9645

Я помітив, що такий підхід не вдається, якщо використовувати <a>замість <div>внутрішньої комірки таблиці. Додавання word-break: break-all;вирішує проблему. Приклад: jsfiddle.net/de0bjmqv
zendu

Просто здорово. І вам навіть не потрібно мати однаковий текст у клітинках (заголовків достатньо), і тоді вам не потрібно max-висота: 1.1em і т.д. - все, що вам потрібно для дівок, це позиція: относительно ;.
KS74

13

Якщо вона в процентній ширині таблиці або ви не можете встановити фіксовану ширину на комірці таблиці. Ви можете подати заявку, table-layout: fixed;щоб вона працювала.

table {
  table-layout: fixed;
  width: 100%;
}
td {
  text-overflow: ellipsis;
  white-space: nowrap;
  overflow: hidden;
  border: 1px solid red;
}
<table>
  <tr>
    <td>Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah.</td>
    <td>Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah.</td>
  </tr>
</table>


5

Загорніть вміст комірок у гнучкий блок. Як бонус, автоматична комірка підходить для видимої ширини.

table {
  width: 100%;
}

div.parent {
  display: flex;
}

div.child {
  flex: 1;
  width: 1px;
  overflow-x: hidden;
  text-overflow: ellipsis;
}
<table>
  <tr>
    <td>
      <div class="parent">
        <div class="child">
          xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        </div>
      <div>
    </td>
  </tr>
</table>


3
Мені також довелося додати white-space: nowrap;до childкласу.
Росс Аллен

3

Я вирішив це, використовуючи абсолютно розміщений div всередині клітини (відносний).

td {
    position: relative;
}
td > div {
    position: absolute;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 100%;        
}

Це воно. Тоді ви можете або додати значення top: value до div, або вертикально відцентрувати його:

td > div {      
    top: 0;
    bottom: 0;
    margin: auto 0;
    height: 1.5em; // = line height 
}

Щоб отримати трохи місця з правого боку, ви можете трохи зменшити максимальну ширину.


Було б добре з JSFiddle, як і багато інших відповідей на це популярне питання.
ома

Так, це працює, але я використовував трохи різні стилі для дівів: зліва: 0; верх: 0; право: 0; низ: 0; padding: 2px; щоб дістати правильне положення та мати таку ж прокладку, як у клітинках таблиці.
KS74

0

У моєму випадку це працювало як у Firefox, так і в Chrome:

td {
  max-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  width: 100%;
}

-5

Це версія, яка працює в IE 9.

http://jsfiddle.net/s27gf2n8/

<div style="display:table; table-layout: fixed; width:100%; " >
        <div style="display:table-row;">
            <div style="display:table-cell;">
                <table style="width: 100%; table-layout: fixed;">
                    <div style="text-overflow:ellipsis;overflow:hidden;white-space:nowrap;">First row. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.</div>
                </table>
            </div>
            <div style="display:table-cell;">
                Top right Cell.
            </div>
        </div>
        <div style="display:table-row;">
            <div style="display:table-cell;">
                <table style="width: 100%; table-layout: fixed;">
                    <div style="text-overflow:ellipsis;overflow:hidden;white-space:nowrap;">Second row - Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.</div>
                </table>
            </div>
            <div style="display:table-cell;">
                Bottom right cell.
            </div>
        </div>
    </div>

6
a <div> як пряма дитина <table>? Це не здається правильним!
Міхель

@michiel FYI - браузери можуть обробляти Divs нижче тегів таблиці.
Райан О'Коннелл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.