← Назад к вопросам
Как решить проблему обрезанного текста?
1.2 Junior🔥 111 комментариев
#Soft Skills и рабочие процессы
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение проблемы обрезанного текста в веб-приложениях
Обрезание текста - частая проблема при адаптивном дизайне. Существует несколько подходов, в зависимости от контекста и требований дизайна.
CSS решения - однострочный текст
Способ 1: Ellipsis (три точки)
/* Для одной строки */
.truncate {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 200px;
}
<p class="truncate">Очень длинный текст, который будет обрезан с тремя точками в конце</p>
Способ 2: Скрытие переполнения
.truncate-overflow {
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 1; /* Количество строк */
-webkit-box-orient: vertical;
}
Многострочное обрезание
Способ 1: -webkit-line-clamp (современный браузеры)
.text-truncate-2 {
display: -webkit-box;
-webkit-line-clamp: 2; /* Показать 2 строки максимум */
-webkit-box-orient: vertical;
overflow: hidden;
word-wrap: break-word;
line-height: 1.5;
max-height: calc(1.5em * 2); /* Высота для 2 строк */
}
<div class="text-truncate-2">
Это очень длинный текст, который будет отображаться максимум на двух строках, а остальное будет скрыто с многоточием в конце.
</div>
React компонент для обрезания текста
import React, { useState, useRef, useEffect } from 'react';
interface TextTruncateProps {
text: string;
maxLength?: number;
lines?: number; // Количество строк для отображения
}
export function TextTruncate({ text, maxLength = 100, lines = 1 }: TextTruncateProps) {
const [isTruncated, setIsTruncated] = useState(false);
const [isExpanded, setIsExpanded] = useState(false);
const ref = useRef<HTMLDivElement>(null);
useEffect(() => {
const element = ref.current;
if (element && element.scrollHeight > element.clientHeight) {
setIsTruncated(true);
}
}, [text]);
if (isExpanded) {
return (
<div>
<p>{text}</p>
{isTruncated && (
<button onClick={() => setIsExpanded(false)} className="text-blue-500 underline">
Скрыть
</button>
)}
</div>
);
}
return (
<div>
<div
ref={ref}
className={`line-clamp-${lines}`}
>
{text}
</div>
{isTruncated && (
<button onClick={() => setIsExpanded(true)} className="text-blue-500 underline">
Читать далее
</button>
)}
</div>
);
}
// Использование
<TextTruncate text="Очень длинный текст..." lines={2} />
Tailwind CSS подход
// Одна строка
<p className="truncate">Очень длинный текст будет обрезан с ellipsis</p>
// Две строки (требует расширенной конфига)
<p className="line-clamp-2">Текст на две строки максимум</p>
// Динамическое количество строк
<div className="overflow-hidden text-ellipsis" style={{
display: '-webkit-box',
WebkitLineClamp: 3,
WebkitBoxOrient: 'vertical'
}}>
{longText}
</div>
Продвинутый подход: Обрезание с сохранением слов
function truncateText(text: string, maxLength: number, addEllipsis = true): string {
if (text.length <= maxLength) return text;
// Обрезаем по максимальной длине
let truncated = text.substring(0, maxLength);
// Находим последний пробел для сохранения целых слов
const lastSpace = truncated.lastIndexOf(' ');
if (lastSpace > 0) {
truncated = truncated.substring(0, lastSpace);
}
return addEllipsis ? truncated + '...' : truncated;
}
// Использование
const text = "Это очень длинный текст, который нужно обрезать корректно";
console.log(truncateText(text, 20)); // "Это очень длинный...";
Когда использовать какой подход
- white-space: nowrap + ellipsis - для заголовков и коротких строк
- -webkit-line-clamp - для карточек и описаний (2-3 строки)
- React компонент с expand - когда нужна интерактивность
- JavaScript обрезание - для SEO и динамического контента
Важные замечания
- Всегда проверяйте поддержку браузеров для -webkit- свойств
- Убедитесь, что обрезанный текст остается читаемым
- Для доступности добавляйте title атрибут или tooltip
- Для SEO используйте JavaScript-обрезание на клиенте, не сокращайте на сервере