Короткий ответ
То, что вы хотите, невозможно. Вы не можете сохранить текущую HTML, добавить максимальную ширину ячейки таблицы, сохранить минимальную ширину ячеек таблицы и разбить слова без использования JavaScript.
Однако есть несколько хороших альтернатив, которые применимы к большинство ваших требований.
Вариант 1 - переполнение внутри ячейки.
Применяя white-space: nowrap
и overflow-y
, вы можете использовать max-width
. Недостатком является то, что вам нужно прокрутить ячейку.
td {
white-space:nowrap;
border: 1px solid black;
max-width: 350px;
overflow-y:hidden;
}
<table>
<tr>
<td>This is a long text</td>
<td>short</td>
<td>LongerWord</td>
<td>Normal</td>
<td>This is a long text</td>
<td>Sometimes very long text could appear that should break so the table does not get way too wide</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>Normal</td>
</tr>
<tr>
<td>short</td>
<td>short</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>This is a long text</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>Normal</td>
</tr>
</table>
Вариант 2 - Незначительное изменение разметки
Если вы можете применить класс к тем, которые, как вы знаете, слишком длинные, это становится тривиальным. Очевидно, это предполагает, что у вас есть данные c (в этот момент вы, вероятно, просто в любом случае точно установите ширину каждого столбца).
td {
white-space:nowrap;
border: 1px solid black;
max-width: 350px;
overflow-y:hidden;
}
.long{
white-space: normal;
min-width: 350px;
}
<table>
<tr>
<td>This is a long text</td>
<td>short</td>
<td>LongerWord</td>
<td>Normal</td>
<td>This is a long text</td>
<td class="long">Sometimes very long text could appear that should break so the table does not get way too wide</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>Normal</td>
</tr>
<tr>
<td>short</td>
<td>short</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>This is a long text</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>Normal</td>
</tr>
</table>
Вариант 3 - немного сверхлегкий вес JavaScript волхвов c
Если вы объедините наш предыдущий пример (добавление класса к ячейка таблицы) с быстрой проверкой, является ли ячейка таблицы слишком большой, мы получаем решение, которое является легким и будет работать с динамическими c данными / без необходимости ломать вещи, если вы изменяете данные.
var maxWidth = 350;
var tableCells = document.querySelectorAll('td');
for(x = 0; x < tableCells.length; x++){
if(tableCells[x].clientWidth > 350){ //please note if you want this to include the border width then you need to use tableCells[x]..offsetWidth to include the border.
tableCells[x].classList.add("long");
}
}
td {
white-space:nowrap;
border: 1px solid black;
max-width: 350px;
overflow-y:hidden;
}
.long{
white-space: normal;
min-width: 350px;
}
<table>
<tr>
<td>This is a long text</td>
<td>short</td>
<td>LongerWord</td>
<td>Normal</td>
<td>This is a long text</td>
<td>Sometimes very long text could appear that should break so the table does not get way too wide</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>Normal</td>
</tr>
<tr>
<td>short</td>
<td>short</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>This is a long text</td>
<td>LongerWord</td>
<td>LongerWord</td>
<td>Normal</td>
</tr>
</table>
Вариант 4 - измените HTML
Если вы можете изменить HTML (то есть это не таблично данные), то группировка элементов по столбцам в div позволяет легко это решить. Я не собираюсь делать пример для этого, так как у меня есть ощущение, что это не вариант.
Вариант 5 - работа на стороне сервера
Вы можете считать символы на сервере и установите серверную сторону класса CSS, если вы ДЕЙСТВИТЕЛЬНО хотите избежать JavaScript (поэтому добавьте class="long"
на сервер на основе количества символов).
Хотя это не будет точно, оно должно быть закройте и получите динамические c данные без JavaScript.
Заключение
Кто-то должен изобрести свойство CSS, чтобы исправить это это настоящая боль!
Я бы go выбрал вариант 3, он чистый, его легко внедрить в существующее решение и легко обслуживать. Это также лучше, чем пытаться добавить встроенные стили через JavaScript, так как это все равно будет соответствовать Политике безопасности контента. В конце дня таблица все равно будет отображаться, если JavaScript не удастся.