Переповнення тексту CSS: еліпсис; не працює?


368

Я не знаю, чому цей простий CSS не працює ...

.app a {
  height: 18px;
  width: 140px;
  padding: 0;
  overflow: hidden;
  position: relative;
  margin: 0 5px 0 5px;
  text-align: center;
  text-decoration: none;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: #000;
}
<div class="app">
  <a href="">Test Test Test Test Test Test</a>
</div>

Слід відрізати навколо 4-го "Тесту"




FF only- якщо filterзастосовано, еліпсис не відображатиметься. помилка відкрита
vsync

1
Я написав пост про вирішення питань з text-overflow: brainlessdeveloper.com/2017/07/29/why-wont-my-text-overflow
Фаусто Н.А.,

1
у моєму випадку зняття дисплея: flex з елемента допомогло
Eduard

Відповіді:


908

text-overflow:ellipsis; працює лише тоді, коли є правдою наступне:

  • Ширина елемента повинна бути обмежена в px(пікселях). Ширина в %(відсотках) не працюватиме.
  • Елемент повинен мати overflow:hiddenі white-space:nowrapвстановлювати.

Причина у вас тут є проблеми в тому, що widthваш aелемент не обмежений. У вас є widthналаштування, але оскільки елемент встановлений display:inline(тобто за замовчуванням), він ігнорує його, і більше нічого не обмежує його ширину.

Ви можете виправити це, виконавши одне з наступних дій:

  • Встановіть елемент display:inline-blockабо display:block(можливо, колишній, але це залежить від потреб вашого макета).
  • Встановіть один із його елементів контейнера display:blockта надайте цьому елементу фіксований widthабо max-width.
  • Встановіть елемент float:leftабо float:right(можливо, колишній, але знову ж таки, або має мати такий же ефект, що стосується еліпсису).

Я б запропонував display:inline-block, оскільки це матиме мінімальний побічний вплив на ваш макет; він працює дуже схоже на display:inlineте, що він використовує в даний час, що стосується макета, але сміливо експериментуйте і з іншими моментами; Я намагався дати якомога більше інформації, щоб допомогти вам зрозуміти, як ці речі взаємодіють разом; значна частина розуміння CSS - це розуміння того, як різні стилі працюють разом.

Ось фрагмент із вашим кодом із display:inline-blockдоданим, щоб показати, наскільки ви були близькими.

.app a {
  height: 18px;
  width: 140px;
  padding: 0;
  overflow: hidden;
  position: relative;
  display: inline-block;
  margin: 0 5px 0 5px;
  text-align: center;
  text-decoration: none;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: #000;
}
<div class="app">
  <a href="">Test Test Test Test Test Test</a>
</div>

Корисні посилання:


12
Що робити, якщо я не можу використовувати задану ширину завдяки чуйному дизайну?
SearchForKnowledge

5
Зауважте, що максимальна ширина також працює. Це допомогло мені, оскільки у мене була піктограма, яка мала обіймати кінець тексту незалежно від ширини його діапазону. (Інакше піктограма пливе праворуч, якби текст не зайняв повну ширину прольоту)
Кевін

2
Примітка: white-space: nowrapнасправді не потрібно. Ми ще можемо бачити еліпси навіть без нього. Для декількох рядків text-overflowдивіться це SO
безслідне

24
Не впевнений, це нещодавня зміна чи ні, але в Chrome 50 (бета) вам не потрібно встановлювати ширину у значення px - "100%" також працює. white-space: nowrapПотрібно, хоча.
thoan

13
Вам НЕ потрібно встановлювати фіксований widthна всіх. Все, що вам потрібно зробити, це встановити a, white-space: nowrap;і це працює просто чудово.
adamj

37

Прийнята відповідь приголомшлива. Однак ви все одно можете використовувати %ширину і досягти text-overflow: ellipsis. Рішення просте:

display: inline-block; /* for em, a, span, etc (inline by default) */
text-overflow: ellipsis;
width: calc (80%); /* The trick is here! */

Здається , кожен раз , коли ви використовуєте calc, остаточне значення відображається в абсолютних пікселів, які послідовно перетворює 80%в щось на зразок 800pxдля 1000px-Width контейнера. Тому замість використання width: [YOUR PERCENT]%використовуйте width: calc([YOUR PERCENT]%).


16

Тож якщо у вас виникне це питання, тому що у вас виникають проблеми, намагаючись змусити еліпсис працювати всередині display: flexконтейнера, спробуйте додати min-width: 0його до найкондитнішого контейнера, який переповнює його батьківський, навіть якщо ви вже встановили overflow: hiddenйого і подивіться, як це працює для вас.

Більш детально та робочий приклад цього коду від aj-foster . Повністю зробив трюк у моєму випадку.


2
Прекрасне рішення - це також єдине розміщене тут, яке працює для position: stickyелемента в display: flexконтейнері.
Джеймс Дінсдейл

2
Я думаю, що варто було б включити до обраної відповіді. Це вирішило моє питання. Дякую!
j0nd0n7

1
Ви, пане, геній.
Натан Осман

1
дякую людину, врятував день
Парасолька

7

Також переконайтеся , що word-wrapвстановлено в нормальний для IE10 і нижче.

Нижче наведені стандарти визначають поведінку цього властивості як залежне від налаштування властивості "перетворення тексту". Однак налаштування wordWrap завжди ефективні в Windows Internet Explorer, оскільки Internet Explorer не підтримує властивість "обгортання тексту".

Отже, у моєму випадку word-wrapбуло встановлено, що слово розбиття (успадковане чи за замовчуванням?) Спричиняє text-overflowроботу в FF та Chrome, але не в IE.

мс інформація про властивість перенесення слів


5

anchor, span... теги за замовчуванням є вбудованими елементами , у випадку, якщо widthвластивість вбудованих елементів не працює. Таким чином, ви повинні перетворити свій елемент в один inline-blockабо в block levelелементи


5

Додайте чотири рядки, написані після інформації для роботи еліпсису

.app a
{
 color: #fff;
 font: bold 15px/18px Arial;
 height: 18px;
 margin: 0 5px 0 5px;
 padding: 0;
 position: relative;
 text-align: center;
 text-decoration: none;
 width: 140px;

 /* 
 Note: The Below 4 Lines are necessary for ellipsis to work.
 */

 display: block;/* Change it as per your requirement. */
 overflow: hidden;
 text-overflow: ellipsis;
 white-space: nowrap;
}



1

У завантажувальній програмі 4 ви можете додати .text-truncateклас для врізання тексту еліпсисом.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>

<!-- Inline level -->
<span class="d-inline-block text-truncate" style="max-width: 250px;">
  The quick brown fox jumps over the lazy dog.
</span>


1

ОБОВ'ЯЗКОВО містити

  text-overflow: ellipsis;
  white-space: nowrap;
  overflow: hidden;

НЕ МОЖЕ містити

display: inline

ДОЛЖЕН би містити

position: sticky


0

Мені довелося зробити декілька довгих описів еліпса (візьміть лише одну смугу), реагуючи, тому моє рішення полягало в тому, щоб текст міг обгортати (замість white-space: nowrap), а замість фіксованої ширини я додав фіксовану висоту:

span {
  display: inline-block;
  line-height: 1rem;
  height: 1rem;
  overflow: hidden;
  // OPTIONAL LINES
  width: 75%;
  background: green;
  //  white-space: normal; default
}
<span>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Commodi quia quod reprehenderit saepe sit. Animi deleniti distinctio dolorum iste molestias reiciendis saepe. Ea eius ex, ipsam iusto laudantium natus obcaecati quas rem repellat temporibus! A alias at, atque deserunt dignissimos dolor earum, eligendi eveniet exercitationem natus non, odit sint sit tempore voluptate. Commodi culpa ex facere id minima nihil nulla omnis praesentium quasi quia quibusdam recusandae repellat sequi ullam, voluptates. Aliquam commodi debitis delectus magnam nulla, omnis sequi sint unde voluptas voluptatum. Adipisci aliquam deserunt dolor enim facilis libero, maxime molestias, nemo neque non nostrum placeat reprehenderit, rerum ullam vel? A atque autem consectetur cum, doloremque doloribus fugiat hic id iste nemo nesciunt officia quaerat quibusdam quidem quisquam similique sit tempora vel. Accusamus aspernatur at au
</span>



0

Я зіткнувся з тим же питанням, і, схоже, жодне з вищезгаданих рішень не працює для Safari. Для браузера, який не є сафарі, це працює чудово:

display: block; /* or in-line block according to your requirement */
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;

Для Сафарі це те, що працює для мене. Зауважте, що медіа-запит, щоб перевірити, чи є браузер Safari, може змінитися з часом, тому просто поцікавтеся медіа-запитом, якщо він не працює для вас. З line-clampвластивістю також можна було б мати кілька рядків в Інтернеті з еліпсисом, дивіться тут .

// Media-query for Safari-only browser.
@media not all and (min-resolution: 0.001dpcm) {
  @media {
    -webkit-line-clamp: 1;
    -webkit-box-orient: vertical;
    display: -webkit-box;
    white-space: normal;
  }
}

0

https://stackoverflow.com/a/53784508/5626747

Не можу коментувати через репутацію, тому я роблю ще одну відповідь:

У цьому випадку вам також доведеться видалити загально запропоновану display: block;властивість із елемента, який ви встановили text-overflow: ellipsis;, або він буде відрізаний без ... наприкінці.


-1

Запишіть це у своєму правилі css.

display: block; /* or in-line block according to your requirement */
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;

Ви також можете переглянути це, jsfiddle.net/ManiAnand/5v6pfy9w
Мані Абі Ананд

Якщо ширину можна вказати, моя відповідь неправильна. Все, що ви тільки що додали у своїй відповіді блок відображення, я написав фрагмент, а не цілі коди, тому можна додати інші речі, але не маючи нічого спільного з проблемою !! Чи можете ви, будь ласка, вказати, як моя відповідь невірна?
Сірай Алам

1
Потрібно вказати ширину, а також дисплей. Якщо ширина відсотка або невизначена і не встановлена ​​на жорсткі одиниці, переповнення не буде обмежено і воно не працюватиме. Дивіться прийняту відповідь.
jlesse

Ширина вже встановлена ​​оп. Я дав фрагмент, щоб додати його коди
Siraj Alam
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.