Как обрезать текст и добавить в конце многоточие?

Иногда приходится ограничивать длинный текст, к примеру, в блоке с фиксированными размерами, чтобы текст не выходил за пределы этого блока. Часто делается так: текст, который не помещается в заданные размеры, обрезается, а в конце текста добавляется многоточие. Оно подсказывает пользователю, что текст отображается лишь частично.

Способ обрезания текста зависит от длины и числа строк.

Однострочный текст

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

  1. Текст должен выводиться в одну строку без переносов. Для запрета переносов мы используем свойство white-space со значением nowrap.
  2. Текст за пределами блока скрывается от просмотра с помощью свойства overflow со значением hidden.

Комбинируя три свойства white-space, overflow и text-overflow получим обрезанную строку с многоточием в конце (пример 1).

Пример 1. Использование text-overflow

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Обрезание строки</title> <style> .truncate { background: #f4eddf; /* Цвет фона */ padding: 10px; /* Поля вокруг текста */ white-space: nowrap; /* Текст не переносится */ overflow: hidden; /* Обрезаем всё за пределами блока */ text-overflow: ellipsis; /* Добавляем многоточие */ } </style> </head> <body> <div class="truncate">На улицах и пустырях мальчики запускают воздушных змеев, а девочки играют деревянными ракетками с многоцветными рисунками в ханэ.</div> </body> </html>

Результат данного примера показан на рис. 1.

Вид обрезанного однострочного текста

Рис. 1. Вид обрезанного однострочного текста

Многострочный текст

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

  1. Свойство -webkit-line-clamp, которое ограничивает число строк. Значение 3 отобразит три строки, значение 4 — четыре строки.
  2. Свойство display со значением -webkit-box.
  3. Свойство -webkit-box-orient со значением vertical.
  4. Свойство overflow со значением hidden, оно скрывает текст за пределами блока.

Заметьте, что в большинстве случаев мы имеем дело не со стандартными стилевыми свойствами, а добавляем к ним префикс -webkit-. При этом все эти свойства с префиксами работают даже в Firefox.

Свойство display: -webkit-box в настоящий момент устарело, при вёрстке сейчас используется display: flex. Аналогично устарело и -webkit-box-orient: vertical, сейчас вместо него применяется flex-direction: column. При этом нельзя просто заменить устаревшие свойства современными, перестанет работать ограничение строк.

Также есть проблема и с высотой блока — при добавлении padding его значение прибавляется к высоте строк, в итоге отображается часть лишней строки. Чтобы этого избежать можно явно задать высоту блока или вложить один блок внутрь другого. В примере 3 свойство padding применяется к <div>, а набор свойств для ограничения текста к <p>.

Пример 2. Использование -webkit-line-clamp

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Обрезание строки</title> <style> .truncate { background: #f4eddf; /* Цвет фона */ padding: 10px; /* Поля вокруг текста */ } .truncate p { margin: 0; /* Убираем внешний отступ */ -webkit-line-clamp: 2; /* Число отображаемых строк */ display: -webkit-box; /* Включаем флексбоксы */ -webkit-box-orient: vertical; /* Вертикальная ориентация */ overflow: hidden; /* Обрезаем всё за пределами блока */ } </style> </head> <body> <div class="truncate"><p>На улицах и пустырях мальчики запускают воздушных змеев, а девочки играют деревянными ракетками с многоцветными рисунками в ханэ. Кроме этого, здесь есть ценнейшие коллекции мексиканских масок, бронзовые и каменные статуи из Индии и Цейлона, бронзовые барельефы и изваяния, созданные мастерами Экваториальной Африки пять-шесть веков назад.</p></div> </body> </html>

Результат данного примера показан на рис. 2.

Вид обрезанного многострочного текста

Рис. 2. Вид обрезанного многострочного текста

Обратите внимание, что здесь нам не нужен text-overflow, многоточие добавляется через свойство -webkit-line-clamp.

Использование JavaScript

Если не хочется связываться с устаревшими свойствами, всегда можно воспользоваться JavaScript для решения нашей задачи. Библиотека Clamp.js позволяет выбрать алгоритм работы — с помощью -webkit-line-clamp, в этом случае применяется набор свойств из примера 2 или путём явного обрезания строки (пример 3).

Пример 3. Использование Clamp.js

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Обрезание строки</title> <style> .truncate { background: #f4eddf; padding: 10px; } .truncate p { margin: 0; } </style> </head> <body> <div class="truncate"><p>На улицах и пустырях мальчики запускают воздушных змеев, а девочки играют деревянными ракетками с многоцветными рисунками в ханэ. Кроме этого, здесь есть ценнейшие коллекции мексиканских масок, бронзовые и каменные статуи из Индии и Цейлона, бронзовые барельефы и изваяния, созданные мастерами Экваториальной Африки пять-шесть веков назад.</p></div> <script src="https://cdnjs.cloudflare.com/ajax/libs/Clamp.js/0.5.1/clamp.min.js"></script> <script> // Выбираем все элементы <p> внутри класса .truncate var truncate = document.querySelector(".truncate p"); $clamp(truncate, { clamp: 3, // Число строк useNativeClamp: false // НЕ используем -webkit-line-clamp }); </script> </body> </html>

Обратите внимание на параметр useNativeClamp. По умолчанию его значение равно true, в этом случае к элементу добавляется свойство -webkit-line-clamp. Если же указать значение false, тогда строка обрезается явно. Между этими алгоритмами Clamp.js есть небольшая разница, заметная при изменении размера окна браузера. Использование useNativeClamp:true обрезает строку лишь при необходимости, когда она превышает три строки. useNativeClamp:false обрезает всегда и при изменении размеров блока строка так и остаётся обрезанной.

См. также