Коротко: элементу нужно дать не блочный 100%-ширины, а «подстраивающееся» поведение: display:inline-block / inline-flex / table или CSS‑свойство width: fit-content. Ниже — варианты и примеры.
1) Самый простой — inline-block (будет ширина равна ширине содержимого, при необходимости строки будут переноситься):
HTML:
<div class="box">Очень длинный текст, который может переноситься на несколько строк…</div>
CSS:
.box {
display: inline-block; /* важно — не block */
white-space: normal; /* разрешить перенос строк */
padding: 6px;
border: 1px solid #ccc;
max-width: 300px; /* опционально: ограничить, чтобы обязательно переносился */
}
2) width: fit-content (современные браузеры):
.box {
width: fit-content;
white-space: normal;
max-width: 100%; /* ограждает от выхода за пределы контейнера */
}
(При старых браузерах можно добавить префиксы: width: -moz-fit-content / -webkit-fit-content.)
3) display: table — поведение похоже на «подгонку под содержимое», тоже работает с переносами:
.box { display: table; white-space: normal; }
4) Если элемент — дочерний в flex-контейнере, flex может заставлять его растягиваться. В этом случае используйте:
.flex-item { flex: 0 0 auto; align-self: flex-start; width: auto; }
Дополнительно:
- Для переноса длинных слов используйте overflow-wrap: break-word; или word-break: break-word; / break-all по необходимости.
- inline-block создаёт пробелы между элементами в разметке — учитывайте это (или используйте font-size:0 на контейнере, комментарии между inline-block и т. п.).
Если хотите, пришлите ваш конкретный HTML/CSS — помогу подобрать точное решение.