Пошаговое руководство по усечению текста в тексте CSS

Пошаговое руководство по усечению текста в тексте CSS

29 апреля 2023 г.

В этом посте я покажу вам, как реализовать усечение текста в CSS. Я расскажу, как сократить как одну строку, так и несколько строк. Я также упомяну некоторые распространенные проблемы, с которыми вы можете столкнуться при усечении текста CSS.

Обрезка текста в CSS

Обрезанный или сокращенный текст чаще всего встречается при работе над дизайном со столбцами одинаковой высоты. Но обычно текст для этих столбцов является динамическим. Недавно мне пришлось поработать над таким дизайном на работе.

Row of articles using a card design that shows off CSS text truncate

Названия категорий, такие как Mario, Nintendo, Call of Duty: Modern Warfare и т. д., должны быть в одной строке. Если он не подходит, то мне нужно его обрезать. Мне также нужно урезать заголовок статьи до 4 строк. Итак, для этого конкретного макета мне пришлось обрезать текст CSS как для одной строки, так и для нескольких строк.

Как обрезать текст CSS?

Начнем с однострочного CSS-текста, усеченного тегом "p". Вы можете следить за мной, используя этот фрагмент. Вот ссылка на готовый код, если вы хотите скопировать его оттуда.

<p class="single-truncate">
  Call of Duty: Modern Warfare
</p>

<style>
/* global styles */
body {
  min-height: 100vh;
  display: grid;
  place-items: center;
  gap: 0.8em;
  font-family: Arial,Helvetica Neue,Helvetica,sans-serif;
  font-size: 1.6rem;
}

p {
  background: tomato;
  padding: 1em;
}
</style>

box with the text, Call of Duty: Modern Warfare

Вот шаги, которые необходимо выполнить, чтобы обрезать этот текст.

1. Установка фиксированной ширины с помощью CSS

Вам нужно установить ширину элемента, на который вы нацеливаетесь. Таким образом, браузер знает, какой длины должен быть текст, прежде чем вы его обрежете.

/* truncate stuff */
.single-truncate {
  width: 150px;
}

box with the text, Call of Duty: Modern Warfare

2. Использование свойства пробела в CSS

Чтобы избежать переноса текста на следующую строку, нам нужно установить white- свойство пробела для nowrap.

.single-truncate {
  width: 150px;
  white-space: nowrap;
}

Box with the text, Call of Duty: Modern Warfare, Modern Warfare is sticking outside the box

3. Использование CSS-свойства переполнения

Далее вам нужно установить скрытое свойство переполнения. Это скрывает текст, когда он выходит за пределы своей ширины.

.single-truncate {
  width: 150px;
  white-space: nowrap;
  overflow: hidden;
}

Box with the text Call of Duty: Modern Warfare, Modern Warfare is clipped by the border and hidden

4. CSS обрезать с многоточием

Мы успешно обрезали текст. Но было бы неплохо иметь какое-то указание на то, что мы его усекли. Давайте добавим многоточие в конец сокращенного текста. Мы можем сделать это, установив для свойства text-overflow значение многоточия.

.single-truncate {
  width: 150px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

Box with the text Call of Duty: Modern Warfare, Modern Warfare is truncated

<цитата>

Все, что вам нужно запомнить, — это 4 свойства CSS. Ширина, пробел, переполнение, переполнение текстом или запомните аббревиатуру WWOT. Вы можете использовать "Мы не будем переполнять текст" в качестве мнемоники. Возможно, вы сможете придумать что-то получше.

Как обрезать несколько строк с помощью CSS?

Обрезать текст для нескольких строк немного сложнее. Давайте снова начнем с простого тега "p", но на этот раз с большим количеством текста и сделаем его шире.

<p class="multiple-truncate">
   Nintendo E3 2021: Direct Dates and Time, Predictions, Rumours and Zelda Plans 
</p>

<style>
/** other styles ***/

.multiple-truncate {
  width: 250px;
}
</style>

Box with an article title

Сейчас в тексте 5 строк. Давайте посмотрим, сможем ли мы сократить его до 4 строк.

Как использовать зажим строки в CSS

Это свойство работает, только если для свойства display задано значение -webkit-box. или -webkit-inline-box. Кроме того, для свойства -webkit-box-orient необходимо установить вертикальное .

<цитата>

Примечание. Это свойство изначально было реализовано в WebKit и имеет некоторые проблемы. Он был стандартизирован для устаревшей поддержки.

Применительно к якорным элементам усечение может происходить в середине текста, не обязательно в конце.

Теперь давайте добавим новые правила в наш класс множественного усечения и посмотрим, что произойдет.

  .multiple-truncate {
    width: 250px;

  /* truncates text   */
  -webkit-line-clamp: 4;
  display: -webkit-box;
  -webkit-box-orient: vertical;
}

Box with an article title, ellipsis after the fourth line but the fifth line is also showing

Это не совсем то, что мы искали. Проблема с этим подходом заключается в том, что мы не сможем использовать padding-bottom для фактического текста. В противном случае на месте, занимаемом нижним отступом, будет отображаться усеченный текст. Итак, давайте пока удалим нижний отступ.

.multiple-truncate {
  width: 250px;

  /* truncates text   */
  -webkit-line-clamp: 4;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  padding-bottom: 0;
}

Затем нам нужно скрыть усеченный текст, установив для параметра overflow значение hidden.

.multiple-truncate {
  width: 250px; 

 /* truncates text   */
  -webkit-line-clamp: 4;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  padding-bottom: 0;
  overflow: hidden;
}

Недостатком этого подхода является то, что вы не можете использовать padding-bottom для текста. Вам нужно будет добавить отступ к родителю или попробовать что-то еще.

Одна вещь, которую вы можете попробовать, это установить границу для псевдоэлемента «после». Цвет границы должен быть таким же, как фон для текста. Затем вам нужно установить ширину границы в значение padding-bottom, которое вы хотите. Для этого вы можете использовать миксин SCSS или переменные CSS, чтобы сделать его более надежным и пригодным для повторного использования.

.multiple-truncate:after {
  content: '';
  display: block;
  border-bottom: 1em solid tomato;
}

box with an article title, truncated after 4 lines

Обрезать текст с помощью flexbox

<цитата>

Подобное усечение текста не работает, если обрезаемый элемент имеет отображаемое значение flex или inline-flex.

Текст все равно будет сокращен, но многоточия в конце не будет. Я не уверен, почему это происходит и есть ли обходные пути для этого. Если у вас есть какие-либо идеи, дайте мне знать в комментариях ниже.

Обрезать текст с помощью SCSS

Вот два миксина SCSS, которые облегчат усечение текста.

@mixin truncate-single-line($width) {
  width: $width;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

@mixin truncate-multiple-lines($width, $lines, $paddingBottom: false, $bg) {
  width: $width;
  -webkit-line-clamp: $lines;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  overflow: hidden;
  padding-bottom: 0;

  @if $paddingBottom {
    &:after {
    content: '';
    display: block;
      border-bottom-width: $paddingBottom;
      border-bottom-style: solid;
      border-bottom-color: $bg;
    }
  }
}

Вы даже можете использовать переменные CSS для аргумента $paddingBottom, а затем использовать медиа-запросы, чтобы сделать его отзывчивым без изменения миксина.

.multiple-truncate--with-mixin {
  --pd: 1em;
 padding: var(--pd);
  @include truncate-multiple-lines($width: 250px, $lines: 4, $bg: tomato, $paddingBottom: var(--pd));

 @media (max-width: 600px) {
    --pd: 0.2em;
  }
}

Обзор обрезания текста CSS

Вот краткий обзор того, как сделать усечение текста с помощью CSS:

* Усеченный или сокращенный текст обычно используется в проектах со столбцами одинаковой высоты, где текст является динамическим. * Чтобы обрезать текст в CSS, выполните следующие действия:

  1. Установите фиксированную ширину целевого элемента.
  2. Используйте свойство пробела и задайте для него значение nowrap, чтобы избежать переноса текста на следующую строку.
  3. Используйте свойство переполнения и установите для него значение "скрытый", чтобы скрыть текст, когда он выходит за пределы своей ширины.
  4. Используйте свойство text-overflow и задайте для него значение "многоточие", чтобы добавить указание на то, что текст был усечен.
  5. Обрезать текст для нескольких строк сложнее, но это можно сделать, установив фиксированную высоту элемента, используя свойство display и задав для него значения '-webkit-box' и '-webkit-line-clamp', а также установив количество отображаемых строк.

Каков ваш опыт с усечением текста в CSS? Какие техники вы пробовали? Знаете ли вы другие способы сделать это? Позвольте мне знать в комментариях ниже. Я надеюсь, что это была полезная статья.

:::информация Также опубликовано здесь.

:::


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE