Подтвердить что ты не робот

Как привязать таблицу к максимальной ширине в таблице ширины

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

С коротким контентом это работает:

<table border="1">
    <tr>
        <th>Short Header</th>
        <td>value</td>
    </tr>
    <tr>
        <th>Quite Long Header</th>
        <td>value</td>
    </tr>
</table>

CSS

table {
    width: 100%;
}

th {
    text-align: right;
    width: 10px;
    white-space: nowrap;
}

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

table {
    width: 100%;
}

th {
    text-align: right;
    width: 10px;
    white-space: nowrap;
    max-width: 300px;
    word-break: break-all;
}

Демо: https://jsfiddle.net/2avm4a6n/

Кажется, стиль white-space: nowrap; переопределяет word-break: break-all;, поэтому max-width: 300px; вызывает выпадение текста. Я использую комбинацию white-space: nowrap; и width: 10px;, чтобы сделать столбец заголовка как можно более узким, без обертывания заголовков с пробелами ниже минимальной ширины, но наличие только width: 10px; и word-break: break-all; приводит к тому, что заголовки оберните в отдельные символы, чтобы они соответствовали узким 10px.

Любая идея, как это сделать с помощью css?

4b9b3361

Ответ 1

Удалите table width, от th удалите width, white-space и word-break. Добавьте к th word-wrap: word-break

Я также предлагаю вам установить min-width: 150px или любое значение, которое вы хотите. Также добавьте это td { width: 100%;}.

Вот jsFiddle

th {
    text-align: right;
    max-width: 300px;
    min-width: 150px;
    word-wrap: break-word;
}
td {
    width: 100%;
}
<table border="1">
    <tr>
        <th>Short Header</th>
        <td>value</td>
    </tr>
</table>
<br />
<table border="1">
    <tr>
        <th>Short Header</th>
        <td>value</td>
    </tr>
    <tr>
        <th>Quite Long Header</th>
        <td>value</td>
    </tr>
</table>
<br />
<table border="1">
    <tr>
        <th>Short Header</th>
        <td>value</td>
    </tr>
    <tr>
        <th>Quite Long Header</th>
        <td>value</td>
    </tr>
    <tr>
        <th>MMMMMMMMMMMMMMMMMMMMMMMMMMMassiveHeader</th>
        <td>value</td>
    </tr>
</table>

Ответ 2

Сообщите мне, если это то, что вы ищете:

удалите white-space:nowrap и word-break:break-all и добавьте word-wrap:break-word

см. фрагмент ниже:

table {
    width: 100%;
}

th {
    text-align: right;
    width: 10px;
    max-width: 300px;
    word-wrap:break-word    
}
<table border="1">
    <tr>
        <th>Short Header</th>
        <td>value</td>
    </tr>
</table>
<br />
<table border="1">
    <tr>
        <th>Short Header</th>
        <td>value</td>
    </tr>
    <tr>
        <th>Quite Long Header</th>
        <td>value</td>
    </tr>
</table>
<br />
<table border="1">
    <tr>
        <th>Short Header</th>
        <td>value</td>
    </tr>
    <tr>
        <th>Quite Long Header</th>
        <td>value</td>
    </tr>
    <tr>
        <th>MMMMMMMMMMMMMMMMMMMMMMMMMMMassiveHeader</th>
        <td>value</td>
    </tr>
</table>

Ответ 3

Как насчет некоторого раскладки сетки CSS3:

.grid {
    display: grid;    
    grid-template-columns: minmax(1fr, auto) auto;
}

.label {
    grid-column: 1;
    word-break: break-all;
    max-width: 300px;
}

.value {
    grid-column: 2;
}
<div class="grid">
    <div class="label">Short Header</div>
    <div class="value">value</div>
</div>
<br/>
<div class="grid">
    <div class="label">Short Header</div>
    <div class="value">value</div>
    <div class="label">Quite Long Header</div>
    <div class="value">value</div>
    <div class="label">Short Header</div>
    <div class="value">value</div>
</div>
<br/>
<div class="grid">
    <div class="label">Short Header</div>
    <div class="value">value</div>
    <div class="label">Quite Long Header</div>
    <div class="value">value</div>
    <div class="label">MMMMMMMMMMMMMMMMMMMMMMMMMMMassiveHeader</div>
    <div class="value">value</div>
    <div class="label">Quite Long Header</div>
    <div class="value">value</div>
</div>

Ответ 4

Если вы уже знаете, что данные находятся в <th>, вы можете затем обернуть текст длинной длины в тег <span> или так, и немного настройте CSS для этого.

ОБНОВЛЕНО JSFIDDLE

table {
    width: 100%;
}
th {
    text-align: right;
    white-space: nowrap;
}
th span {
    white-space: normal;
    word-break: break-all;
    display: block;
}
td {
    width: 100%;
}
<table border="1">
    <tr>
        <th>Short Header</th>
        <td>value</td>
    </tr>
</table>
<br />
<table border="1">
    <tr>
        <th>Short Header</th>
        <td>value</td>
    </tr>
    <tr>
        <th>Quite Long Header</th>
        <td>value</td>
    </tr>
</table>
<br />
<table border="1">
    <tr>
        <th>Short Header</th>
        <td>value</td>
    </tr>
    <tr>
        <th>Quite Long Header</th>
        <td>value</td>
    </tr>
    <tr>
        <th><span>MMMMMMMMMMMMMMMMMMMMMMMMMMMassiveHeader</span></th>
        <td>value</td>
    </tr>
</table>

Ответ 5

@Douglas: Я думаю, что вы все сделали правильно. но, как и в вашем примере, и вы спросили, что вам нужен узкий заголовок, вы указали ширину 10 пикселей на th. но если вы хотите достичь ширины 10px в вашем примере, то удалите только белое пространство: nowrap;

Затем он будет выглядеть как Пример 1.

Пример 1: https://jsfiddle.net/2avm4a6n/20/

Пример 2: Как и все предоставленные пользователем ответы, вы также можете сделать это

Пример 3: для вас есть другой вариант, если вы хотите использовать белое пространство: nowrap;, затем примените еще одну вещь, т.е. text-overflow: многоточие; переполнение: скрыто; https://jsfiddle.net/2avm4a6n/21/

<я >

 text-overflow: ellipsis;
 overflow: hidden;

ИЗМЕНИТЬ

И используйте text-align: left; если вы хотите, чтобы текст начинался с левой стороны

Ответ 6

Вы можете добиться этого, указав ширину на "th" и сделайте выравнивание по тексту: left

HTML

 <table border="1">
        <tr>
            <th>Short Header</th>
            <td>value</td>
        </tr>
    </table>
    <br />
    <table border="1">
        <tr>
            <th>Short Header</th>
            <td>value</td>
        </tr>
        <tr>
            <th>Quite Long Header</th>
            <td>value</td>
        </tr>
    </table>
    <br />
    <table border="1">
        <tr>
            <th>Short Header</th>
            <td>value</td>
        </tr>
        <tr>
            <th>Quite Long Header</th>
            <td>value</td>
        </tr>
        <tr>
            <th>MMMMMMMMMMMMMMMMMMMMMMMMMMMassiveHeader</th>
            <td>value</td>
        </tr>
    </table>

CSS

table {
    width: 100%;
}

th {
    text-align: left;
    width: 500px;
}

Рабочая скрипка: https://jsfiddle.net/2avm4a6n/16/