Гид по технологиям

Ограничение количества строк текста в элементе с помощью CSS

6 min read Frontend Обновлено 10 Apr 2026
Ограничение строк текста в CSS — 2 метода
Ограничение строк текста в CSS — 2 метода

Используйте CSS, чтобы сокращать текст до фиксированного числа строк и добавлять кнопку «Развернуть/Свернуть» без JavaScript. В статье показаны два подхода: WebKit-специфичный метод с -webkit-line-clamp и более гибкий метод с вычислением высоты и градиентом. Плюс — советы по доступности, совместимости и набор тестов.

Мужчина работает за MacBook Pro

Ограничение количества текста в блоке — частая задача веб-дизайна. Обычно вы видите превью-отрывок из трёх-четырёх строк с кнопкой «Развернуть», которая показывает полный текст. Это можно сделать с помощью CSS + JavaScript, но и чистым CSS — двумя основными способами. В этой статье вы найдёте: пошаговые примеры, рабочие фрагменты кода, рекомендации по доступности и совместимости, тесты и чек-листы.

Важно: в примерах используется имя класса .cuttoff-text (с двумя буквами t). Это именно то имя, которое встречается в исходных фрагментах кода — вы можете заменить его на своё, но тогда не забудьте править CSS и HTML одновременно.

Определения

  • line-clamp — CSS-приём, позволяющий «обрезать» текст по числу строк; в современной практике часто реализуется через -webkit-line-clamp.
  • has() — селектор, позволяющий в CSS применять правила к элементам, которые имеют указанного потомка или соседний элемент в определённом состоянии.

Техника WebKit

Создайте пустую папку и два файла: index.html и style.css.

В index.html добавьте базовый HTML-шаблон:

  
  
  
  
  Document  
    
  
  
  
  
  

Внутри вставьте разметку карточек (семантичная структура: section → article):

  
    
    

Article 1

           300-word text goes here     

       
       

Article 2

           200-word text goes here     

               

Article 1

           100-word text goes here     

       

Структура проста: секция содержит три статьи, каждая статья — заголовок, абзац и input, который будет стилизован под кнопку.

Пример визуала на этапе верстки:

Изображения, показывающие секцию статей

Добавьте базовые стили в style.css — сброс боксовой модели, фон и поведение контейнера:

*, *::before, *::after {  
  box-sizing: border-box;  
}  
  
body {  
  background: #f3f3f3;  
  overflow: hidden;  
}

Сделайте grid-контейнер для карточек и стилизуйте сами карточки:

.card-group {  
  display: grid;  
  grid-template-columns: repeat(3, 1fr);  
  gap: .5rem;  
  align-items: flex-start;  
}

.card {  
  background: white;  
  padding: 1rem;  
  border: 1px solid black;  
  border-radius: .25em;  
}

h2, p {  
  margin: 0;  
}  
  
h2 {  
  margin-bottom: 1rem;  
}

Страница будет выглядеть так:

Изображение grid-контейнера с тремя карточками

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

.cuttoff-text {  
  --max-lines: 3;      
  overflow: hidden;  
     
  display: -webkit-box;      
  -webkit-box-orient: vertical;  
  -webkit-line-clamp: var(--max-lines);  
}  

Пояснение: задаём CSS-переменную –max-lines, скрываем переполнение и указываем display: -webkit-box вместе с -webkit-line-clamp для ограничения по числу строк.

Результат: на третьей строке появляется многоточие (ellipsis):

Скриншот grid-контейнера с ограничением текста до трёх строк

Ограничения этого метода:

Более гибкий подход

Этот метод даёт такую же конечную картинку, но вы сами контролируете высоту контейнера — это даёт гибкость: любой display, любая сетка и эффект градиента для плавного «затухания» текста.

Замените CSS блока .cuttoff-text на:

.cuttoff-text {  
  --max-lines: 5;  
  --line-height: 1.4;  
  height: calc(var(--max-lines) * 1em * var(--line-height));  
  line-height: var(--line-height);  
  position: relative;  
}

И пояснение: важна установка line-height, потому что итоговая высота — это умножение количества строк на размер строки (line-height × font-size). position: relative нужно для добавления псевдоэлемента с градиентом.

Добавьте градиентный псевдоэлемент, чтобы плавно скрывать последние строки:

.cuttoff-text::before {  
  content: "";  
  position: absolute;  
  height: calc(2em * var(--line-height));  
  width: 100%;  
  bottom: 0;  
  pointer-events: none;  
  background: linear-gradient(to bottom, transparent, white);  
}

Псевдоэлемент накладывает сверху градиент, создающий эффект «затухания» последней строки. pointer-events: none гарантирует, что накладываемая область не перехватит клики или выделение.

Результат с плавным градиентом:

Скриншот grid-контейнера с карточкой и эффектом затухания

Плюсы этого подхода:

Динамическая кнопка «Развернуть/Свернуть» без JavaScript

Мы уже вставили в HTML. Стилизуем input как кнопку:

.expand-btn {  
  appearance: none;  
  border: 1px solid black;  
  padding: .5em;  
  border-radius: .25em;  
  cursor: pointer;  
  margin-top: 1rem;  
}

.expand-btn:hover {  
  background-color: #ccc;  
}

.expand-btn::before {  
  content: "Expand"  
}  
  
.expand-btn:checked::before {  
  content: "Collapse"  
}

При клике текст у кнопки меняется с Expand на Collapse, но сам текст пока не разворачивается. Для связки состояния чекбокса и блока с текстом используем селектор has():

.cuttoff-text:has(+ .expand-btn:checked) {  
  height: auto;  
}

Эта запись говорит: если у элемента .cuttoff-text есть соседний (смежный) элемент .expand-btn в состоянии checked, — снимай ограничение по высоте (height: auto) и показывай весь текст.

Результат: одна карточка разворачивается, две другие остаются свернутыми.

Скриншот с одной развернутой карточкой и двумя свернутыми

Совет по доступности: используйте вместо незагруженного input чекбокса корректные aria-атрибуты и подписи. Пример доступного HTML:

Когда методы не подходят

Альтернативные подходы

Совместимость и практические советы

Таблица поддержки (обзорная, проверяйте актуальность на caniuse.com):

ПриёмПоддержка в современных браузерахЗамечания
-webkit-line-clampДа (WebKit/Blink)Используйте в сочетании с display: -webkit-box
height calc (переменные)Общая поддержкаНадёжно для гибких решений
:has()Современные браузерыМожет отсутствовать в старых версиях

Чек-лист перед выпуском

Рольные рекомендации:

Критерии приёмки

  1. Текст на карточках обрезается до указанного числа строк в поддерживаемых браузерах.
  2. Кнопка «Развернуть» меняет текст на «Свернуть» и показывает/скрывает весь текст.
  3. В развернутом виде содержимое полностью доступно для копирования и навигации клавиатурой.
  4. Паддинги и отступы сохраняются, верстка не ломается при разном объёме текста.

Тестовые сценарии

Мини-методология внедрения

  1. Добавьте компонент на локальную страницу как в примере.
  2. Выберите подход: WebKit-метод для простых случаев или гибкий метод для адаптивных макетов.
  3. Обновите переменные CSS для проектных значений (–max-lines, –line-height).
  4. Проведите кросс-браузерное тестирование и отловите места, где нужен JS-fallback.
  5. Добавьте aria-атрибуты и проведите тестирование со скринридером.

Короткое резюме

Ограничение количества строк текста можно реализовать полностью на CSS двумя способами: компактным WebKit-подходом с -webkit-line-clamp и более универсальным методом с вычислением высоты и градиентом. Для динамического раскрытия можно применить селектор :has() и стилизованный input-чекбокс. Всегда учитывайте поддержку браузеров и требования по доступности при выборе решения.

Важно

Проверяйте поддержку CSS-селекторов и свойств в целевых браузерах и добавляйте безопасные откаты для пользователей старых версий.

Ключевые ссылки и дальнейшее чтение

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Папка автозагрузки Windows — найти и управлять
Windows

Папка автозагрузки Windows — найти и управлять

Отключить исчезновение окон в macOS Sonoma
macOS

Отключить исчезновение окон в macOS Sonoma

Отключить клавишу Globe на Mac
macOS

Отключить клавишу Globe на Mac

Отключить миниатюры скриншотов на Mac
macOS

Отключить миниатюры скриншотов на Mac

RAW в JPEG на Mac — через Preview
Фото

RAW в JPEG на Mac — через Preview

Удалить фон с фото на Mac — быстро и без программ
macOS

Удалить фон с фото на Mac — быстро и без программ