Перенос слов в HTML-таблице
У меня возникла проблема с использованием свойства word-wrap: break-word
для переноса текста в div
и span
. Однако это свойство, похоже, не работает внутри ячеек таблицы. У меня есть таблица с установленной шириной width:100%
, состоящая из одной строки и двух колонок. Текст в колонках, хотя и оформлен с использованием вышеупомянутого свойства word-wrap
, не переносится, из-за чего выходит за границы ячейки. Эта проблема наблюдается в браузерах Firefox, Google Chrome и Internet Explorer.
Вот как выглядит исходный код:
<style>
td {
border: 1px solid;
}
</style>
<table style="width: 100%;">
<tr>
<td>
<div style="word-wrap: break-word;">
Looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong word
</div>
</td>
<td><span style="display: inline;">Short word</span></td>
</tr>
</table>
Длинное слово выше превышает границы моей страницы, но не переносится с данным HTML. Я пробовал рекомендации добавить text-wrap: suppress
и text-wrap: normal
, но они не помогли. Как можно решить эту проблему?
5 ответ(ов)
Следующий код работает для меня в Internet Explorer. Обратите внимание на добавление CSS-свойства table-layout: fixed
.
td {
border: 1px solid;
}
<table style="table-layout: fixed; width: 100%">
<tr>
<td style="word-wrap: break-word">
Looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong word
</td>
<td>Short word</td>
</tr>
</table>
Это свойство заставляет таблицу учитывать ширину ячеек при вычислении их размеров, что позволяет более эффективно управлять длинными словами и предотвращать выход за пределы контейнера.
Чтобы предотвратить переполнение элемента из-за длинного текста без пробелов в HTML, вы можете использовать CSS-свойство word-break: break-all;
. Это свойство можно применить как к тегу <td>
, так и к тегу <span>
.
Пример для <td>
:
<td style="word-break: break-all;">longtextwithoutspace</td>
И пример для <span>
:
<span style="word-break: break-all;">longtextwithoutspace</span>
Оба варианта позволят тексту корректно переноситься на новую строку при необходимости, избегая переполнения контейнера. Выбор между этими тегами зависит от контекста использования: <td>
предназначен для таблиц, а <span>
— для строчных элементов.
Чтобы изменить поведение разрыва текста в вашем коде, замените свойство CSS word-wrap: break-word;
на word-break: break-all;
.
Вот пример, который демонстрирует это изменение:
<table style="width: 100%;">
<tr>
<td>
<div style="word-break: break-all;">longtextwithoutspacelongtextwithoutspace Long Content, Long Content, Long Content, Long Content, Long Content, Long Content, Long Content, Long Content, Long Content, Long Content</div>
</td>
<td><span style="display: inline;">Short Content</span>
</td>
</tr>
</table>
В этом примере текст в первом столбце будет разрываться на слова, даже если они не содержат пробелов, благодаря word-break: break-all;
. Это поможет избежать переполнения содержимого, особенно если вы работаете с длинными строками текста.
В итоге, похоже, что хорошего способа сделать это нет. Ближе всего к решению, которое я нашёл, было добавление overflow:hidden;
к div, оборачивающему таблицу, но это привело к потере текста. Настоящее решение, похоже, заключается в том, чтобы вообще отказаться от таблицы. Используя div и относительное позиционирование, я смог достичь такого же эффекта, избавившись от устаревшего тега <table>
.
Обновление 2015 года: Это для тех, кто, как и я, ищет этот ответ. Прошло 6 лет, и это работает, спасибо всем участникам.
* { /* это работает для всего, кроме td */
word-wrap: break-word;
}
table { /* это почему-то делает так, чтобы работало для td */
table-layout: fixed;
width: 100%;
}
Как уже упоминалось, обернуть текст в div
почти решает проблему. Вам лишь необходимо указать width
для div
, что, к счастью, подходит для статических макетов.
Это работает в FF 3.6, IE 8, Chrome.
<td>
<div style="width: 442px; word-wrap: break-word">
<!-- Длинный контент здесь -->
</div>
</td>
Как задать cellpadding и cellspacing с помощью CSS?
Как сделать, чтобы div заполнял оставшееся пространство экрана по высоте?
Как расположить div внизу своего контейнера?
Перенос строки в HTML с использованием '\n'
Установить фиксированную ширину столбца таблицы независимо от количества текста в ячейках?