White-space в CSS: полное руководство по переносу текста

Управляем пробелами и переносами

White-space в CSS: полное руководство по переносу текста

Если вы когда-либо пытались вывести на экран стихи, ASCII-арт или комментарии пользователей, то наверняка уже сталкивались с поведением браузера: вы нажимаете Enter в HTML-разметке, а он делает вид, что ничего не произошло. Десять пробелов? Будет один. Абзац? Какой абзац?

Иногда бывает наоборот: подпись на кнопке вдруг переносится на вторую строку и рушит весь дизайн, а длинная ссылка разбивает мобильную вёрстку.

За всё это поведение отвечает CSS-свойство white-space. Сегодня разберём, как оно управляет пробелам, переносами и длинными строками.

Что такое white-space в CSS

В HTML любой текст по умолчанию ведёт себя как газетная колонка: неважно, сколько пробелов или пустых строк вы поставили в коде, — браузер склеит их в один-единственный пробел. И именно свойство white-space решает судьбу всех «невидимых» символов: обычных пробелов, табуляции и переносов строк.

По спецификации white-space — это сокращение, которое объединяет в себе сразу два механизма:

  1. white-space-collapse: что делать с пробелами — схлопывать или сохранять.
  2. text-wrap-mode: что делать, когда текст доходит до края блока, — переносить на новую строку или продолжать писать за границей экрана.

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

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

Синтаксис свойства white-space

Пишется стандартно, как и любое другое свойство CSS. Принимает одно ключевое слово.

.box {
  white-space: normal;    /* Стандартное поведение */
  white-space: nowrap;    /* Запрет переносов строк */
  white-space: pre;       /* Как в теге <pre>: пробелы и переносы сохраняются */
  white-space: pre-wrap;  /* Сохраняем пробелы, строки переносим */
  white-space: pre-line;  /* Сохраняем Enter, но убиваем пробелы */
}

Есть ещё странность вроде break-spaces, но о ней поговорим позже.

Значения по умолчанию

Если вы не трогаете это свойство, браузер применяет значение white-space: normal. Это стандартный режим, к которому мы привыкли в вёрстке:

  1. Пробелы: если поставите 10 пробелов подряд, браузер превратит их в один.
  2. Переносы строк через Enter: в коде они считаются просто пробелом — текст выстраивается в одну длинную строку.
  3. Переполнение: если текст упирается в правый край родительского блока, он автоматически переносится на новую строку.

Это логично для обычного текста, но ужасно неудобно, если вы пытаетесь вывести на экран стихи, код, ASCII-арт или сообщения чата, где важна структура.

Основные значения white-space и их действие

Разберём пять важных значений. Каждое из них управляет двумя параметрами: пробелами внутри строки и переносами на границе блока.

👉 Важный момент: свойство white-space управляет только обычными пробелами, которые вы ставите клавишей Space. Если вы используете неразрывный пробел — спецсимвол &nbsp; в HTML или Option+Space на Mac, — браузер считает его буквой, а не пустотой. Такие пробелы никогда не схлопываются, независимо от настроек CSS.

Если вы повторяете примеры из статьи в VS Code или другой IDE и у вас установлен плагин Prettier, он может автоматически удалять лишние пробелы при сохранении файла. Чтобы этого не произошло, на время экспериментов отключите форматирование или оберните текст в тег <pre> — внутри него редакторы обычно не трогают пробелы.

normal: стандартное поведение

Это значение по умолчанию. Браузер ведёт себя как редактор газеты: экономит место.

   .normal {
     white-space: normal;
   }

И вот как это выглядит в верстке:

  • Пробелы схлопываются — несколько пробелов подряд превращаются в один.
  • Переносы игнорируются.
  • Границы блока: текст переносится на новую строку, если не влезает по ширине.

Используется в 99% обычных текстов на сайтах. Статьи, новости, описания товаров — везде, где нам всё равно, как автор расставил отступы в исходном тексте.

nowrap: запрет переноса строк

Режим бесконечной строки. Текст выстраивается в одну линию и никогда не переносится, даже если он пробил край экрана и ушёл за горизонт. Единственное, что может его разорвать, — тег <br>. Все лишние пробелы убираются:

Где используется:

  1. Кнопки и бейджи: чтобы текст «Купить сейчас» не развалился на «Купить» и «сейчас» на разных строках.
  2. Цены и единицы измерения: чтобы 10 000 ₽ всегда было вместе.
  3. Горизонтальные скроллы: например, список тегов или сторис — там элементы должны идти в ряд.

pre: сохранение пробелов и переносов

Работает ровно так же, как HTML-тег <pre>. Браузер говорит: «Я ничего не трогаю. Как ты написал в редакторе кода, так я и выведу».

  • Пробелы сохраняются все.
  • Enter тоже сохраняется.
  • Текст не переносится. Если строка длинная, она просто вылезет за пределы контейнера и сломает вёрстку — появится горизонтальный скролл.

Используется исключительно для вывода сниппетов кода или ASCII-арта. В обычном интерфейсе это опасно, так как ломает адаптивность.

pre-wrap: сохранение с автоматическим переносом

Это «умная» версия pre. Самое полезное свойство для контента, который создают пользователи.

  • Пробелы и Enter сохраняются, как в pre.
  • Текст переносится, как в normal.

Используется для оформления комментариев, чатов, отзывов. Представьте, что пользователь написал стих или отформатировал сообщение лесенкой. Если вы используете normal, всё превратится в кашу. Если pre — длинная строка порвёт дизайн. А вот pre-wrap сохранит красоту авторского форматирования, но аккуратно перенесёт текст на мобилке.

pre-line: игнорирование пробелов, сохранение переносов

Гибридный режим для тех, кто любит чистоту, но уважает абзацы.

  • Пробелы схлопываются, как в normal. Лишние отступы внутри строки исчезают.
  • Enter сохраняется. Каждый перевод строки в коде станет новой строкой на экране.
  • Текст переносится.

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

Полезный блок со скидкой

Если вам интересно разбираться со смартфонами, компьютерами и прочими гаджетами и вы хотите научиться создавать софт под них с нуля или тестировать то, что сделали другие, — держите промокод Практикума на любой платный курс: KOD (можно просто на него нажать). Он даст скидку при покупке и позволит сэкономить на обучении.

Бесплатные курсы в Практикуме тоже есть — по всем специальностям и направлениям, начать можно в любой момент, карту привязывать не нужно, если что.

Практическое применение white-space

Теория позади, теперь суровая реальность: на примерах посмотрим, где эти свойства спасают вёрстку от краха.

Когда использовать nowrap

Значение nowrap — это «клей» для текста. Оно запрещает перенос строки, даже если места не хватает.

Конечно, пуристы скажут: «Используйте неразрывный пробел &nbsp; или прогоняйте текст через „Типограф“». И они правы: это семантически верный путь. Но в реальных приложениях данные часто прилетают с бэкенда грязными, а контент-менеджеры забывают про спецсимволы. Поэтому white-space: nowrap — это ваша CSS-страховка.

Представьте кнопку «Купить 🛒». Если контейнер сожмётся, при стандартных настройках вы получите перенос эмодзи на другую строку:

Выглядит плохо. Свойство white-space: nowrap гарантирует, что иконка всегда будет приклеена к тексту, а кнопка скорее расширится, чем развалится.

Другой кейс: карточки с балансом или ценами в узком сайдбаре:

Представим ситуацию: с бэкенда прилетает JSON с ценами. Это может быть голое число, которое мы форматируем на фронте, или уже готовая строка "15 000 ₽" с обычными пробелами. Писать JS-скрипт, который будет парсить каждую цену, искать знак валюты и заменять обычный пробел на неразрывный, — это муторно и попахивает костылём. Проще и надёжнее заставить CSS разобраться с этим глобально.

Сравним стили двух карточек:

/* Плохо */
.bad .amount {
  /* По умолчанию */
  white-space: normal; 
  color: #d63031;
}
/* Хорошо (с защитой) */
.good .amount {
  /* Запрещаем разрыв строки */
  white-space: nowrap; 
  color: #00b894;
  /* Если цена в миллиардах и не влезает вообще никак */
  overflow: hidden; 
  text-overflow: ellipsis; /* …поставим многоточие */
}

Выглядеть это будет так:

В первом варианте цифры на маленьком экране разрываются. Во втором варианте ответ бэкенда мы обернули в CSS-защиту: всё выглядит монолитно и данные отлично читаются. Если же карточка совсем перестанет влезать — она обрежется многоточием и не развалится на куски.

Примеры с pre и pre-wrap

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

Блок кода white-space: pre и проблема скролла

Когда вы верстаете блок с кодом, как на GitHub, то обязаны использовать pre, чтобы сохранить отступы. Но есть нюанс: код часто бывает длиннее экрана.

Просто задать white-space: pre будет ошибкой: на мобильном телефоне сайт разъедется в ширину. Поэтому всегда используйте это свойство в связке с прокруткой.

.code-block {
 /* Сохраняем структуру */
  white-space: pre;      
  /* Добавляем скролл, если текст длинный */
  overflow-x: auto;     
 /* Не даём блоку вылезти за экран */
  max-width: 100%;       
}

Сравним:

Без свойства overflow код внутри блока вылезает за границу. Добавляем нужное свойство — и код ровно вписывается в экран, а внизу появляется ползунок прокрутки.

Комментарии пользователей (white-space: pre-wrap) против <br>

Частая ошибка начинающих: получать текст от пользователя, где есть переносы строк \n, и пытаться заменить их на теги <br> через JavaScript или на бэкенде, чтобы сохранить абзацы. Это лишняя работа, нагрузка на процессор и риск XSS-уязвимостей.

Правильным решением будет просто положить текст в div и задать ему white-space: pre-wrap. Браузер сам превратит невидимые символы Enter в новые строки, сохранив при этом адаптивность. Это стандарт для чатов, отзывов и постов в соцсетях.

Допустим, мы делаем карточки с отзывами на товары. В одной карточке слева мы сделали всё как положено и добавили white-space: pre-wrap. Текст форматируется с отступами.

Карточка справа со стилем white-space: normal. Исходный текст с отступами Enter, но в вёрстке он схлопнулся:

С pre-wrap браузер сам превратит невидимые символы, которые добавил автор текста, в новые строки. А вот прописывать всё вручную через <br>, как мы уже сказали выше, плохая альтернатива.

Бонус: зачем нужен break-spaces?

В начале статьи мы упоминали экзотическое значение break-spaces. Оно работает почти как pre-wrap — сохраняет всё и переносит, но с одним хитрым различием: поведением пробелов в конце строки.

Посмотрите на гифку ниже. Мы имитируем веб-терминал, где пользователь ввёл текст Console > и зажал пробел — они обозначены синими прямоугольниками. А теперь начинаем сжимать контейнер:

Видите разницу?

  1. Слева (pre-wrap) синие пробелы остались на первой строке, висят и даже заходят за границу. Курсор перенёсся на вторую строку, но встал в самое начало, потому что на второй строке перед ним пусто.
  2. Справа (break-spaces) синие пробелы переносятся на вторую строку. Они занимают там место и толкают курсор вправо.

Для обычной вёрстки статей это не нужно. Но если вы делаете онлайн-редактор кода или эмулятор терминала, это критично.

В обычном pre-wrap вы можете нажать пробел десять раз, но курсор на новой строке будет стоять в начале, и пользователь не поймёт: «Я же жму пробел, где отступ?» Свойство break-spaces чинит это поведение для онлайн-редакторов кода: пробелы реально занимают место и переносят каретку так, как вы ожидаете.

Бонус для читателей

Если вам интересно погрузиться в мир ИТ и при этом немного сэкономить, держите наш промокод на курсы Практикума. Он даст вам скидку при оплате, поможет с льготной ипотекой и даст безлимит на маркетплейсах. Ладно, окей, это просто скидка, без остального, но хорошая.

Перенос текста и слов в CSS

Свойство white-space управляет пробелами и переносами Enter. Но что делать, если пробелов нет?

Представьте, что пользователь прислал ссылку длиной в 200 символов или решил написать в отзыве «Аааааа...» на три страницы. Браузер по умолчанию считает это одним словом. И поскольку переносить его негде — пробелов-то нет, — это «слово» пробивает контейнер и улетает вправо, ломая всю вёрстку.

word-wrap и overflow-wrap

Это одно и то же свойство. Изначально Microsoft придумала word-wrap для IE, а остальным браузерам оно понравилось, и они его скопировали. Позже стандарты W3C переименовали его в более логичное overflow-wrap (перенос при переполнении). Но word-wrap работает до сих пор как псевдоним.

Это «вежливый» перенос. Значение overflow-wrap: break-word говорит браузеру:

  1. Попробуй перенести текст по пробелам, как обычно.
  2. Если слово настолько длинное, что не влезает в строку целиком, только тогда сломай его в любом месте и перенеси остаток вниз.

Например, длинные ссылки из Google Maps — главный враг мобильной вёрстки. В ссылке нет пробелов, поэтому браузер считает её одним гигантским словом и растягивает контейнер.

Если мы оставим значение по умолчанию:

.message {
    /* По умолчанию */
     overflow-wrap: normal;
 }

то длинная ссылка пробьёт границу сообщения и уйдёт за пределы контейнера. В реальной жизни это создаст горизонтальный скролл.

Чтобы этого избежать, зададим свойство break-word, чтобы ссылка аккуратно разломилась на несколько строк:

Поэтому ставьте overflow-wrap: break-word для всех текстовых блоков с пользовательским контентом.

word-break для контроля переноса слов

Это агрессивный перенос. Свойство word-break решает, можно ли разрывать слово, даже если для него ещё есть место на строке, но не хватает для всего слова целиком.

Самое распространённое значение — word-break: break-all. Оно превращает текст в поток символов, и браузеру становится всё равно, где границы слов. Если слово «Энциклопедия» не влезает в конец строки, браузер может написать «Энцикл» на первой строке, а «опедия» — на второй.

К обычному тексту это свойство применять не нужно:

break-all в основном используется в технических данных, где нет понятий «слог» или «слово»: хеши транзакций, ключи шифрования, логи, генерируемые ссылки. Там, где важно заполнить пространство максимально плотно, не оставляя дыр справа:

hyphens для автоматической расстановки переносов

Если вы хотите, чтобы текст выглядел как в книжке — с красивыми дефисами при переносе, — то понадобится hyphens: auto. В отличие от предыдущих методов, которые просто рубят слова, hyphens ищет правильные слоги по словарю. В браузеры встроены специальные алгоритмы переносов, и они знают грамматические правила языка: где гласная, где согласная, как разбивать слоги.

Свойство hyphens идеально сочетается с выключкой по ширине text-align: justify, спасая текст от огромных дыр между словами, так называемых коридоров.

Важнейший момент: чтобы это работало, браузер должен знать, на каком языке написан текст. Вы обязаны указать атрибут lang в HTML:

  • <html lang="ru"> — тогда браузер подключит словарь русских переносов.
  • Если атрибута нет, hyphens: auto не сработает.

Русский язык отлично поддерживается во всех браузерах. Алгоритмы справляются даже со сложными словами вроде «высокопревосходительство».

Но учтите, что Chrome, Safari и Firefox могут перенести одно и то же слово в разных местах, например «ма-ятник» или «маят-ник». Это нормально, так как по правилам оба варианта допустимы, а словари у браузеров разные.

Ищете работу в IT?

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

Решение частых проблем с переносом текста

Знать свойства — это хорошо, но уметь собрать из них рабочий компонент — ещё лучше. Рассмотрим пару рецептов на те случаи, когда контент пытается сломать ваш дизайн.

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

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

Для этого используется троица CSS-свойств, которые работают только вместе:

.truncate {
  /* Запрещаем перенос на вторую строку */
  white-space: nowrap;      
  /* Всё, что вылезло — скрываем */
  overflow: hidden;        
  /* В конце ставим многоточие */
  text-overflow: ellipsis;  
}

А если нужно две или три строки?Раньше для этого использовали страшные хаки. Сейчас же есть стандартное свойство, которое всё ещё требует префикса -webkit, но работает везде:

.multiline-truncate {
  display: -webkit-box;
  /* Сколько строк оставить */
  -webkit-line-clamp: 3;    
  -webkit-box-orient: vertical;
  overflow: hidden;
}

Это идеальное решение для анонсов статей и описаний товаров.

Управление переносом в таблицах

Таблицы <table> — это государство в государстве, которые живут по своим законам физики. По умолчанию они резиновые (table-layout: auto) и стараются растянуться так, чтобы любой ценой уместить контент целиком.

Даже если вы жёстко зададите ячейке width: 100px, таблица проигнорирует это, если внутри лежит длинное слово без пробелов — она просто расширит колонку.

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

Длинный имейл Марии растянул колонку и вытолкнул таблицу вправо. Это типичный горизонтальный скролл на сайте.

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

table {
  /* Таблица перестаёт быть резиновой и слушается ширины колонок */
 table-layout: fixed; 
  width: 100%;
}
td {
  /* Теперь тут сработает обрезка с многоточием */
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

Короче говоря, без table-layout: fixed ваши попытки обрезать текст в ячейках таблицы браузер проигнорирует. Он всегда отдаст приоритет полному отображению контента, даже ценой сломанной вёрстки.

Вам слово

Приходите к нам в соцсети поделиться своим мнением о статье и почитать, что пишут другие. А ещё там выходит дополнительный контент, которого нет на сайте — шпаргалки, опросы и разная дурка. В общем, вот тележка, вот ВК — велком!

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Вам может быть интересно
easy
[anycomment]
Exit mobile version