Как я могу использовать многоточие в таблице ширины жидкости, не делая каждый столбец одинакового размера?

Допустим, мои столбцы в таблице: id, name, description и phone. Столбец description содержит от 1 до 255 символов, а идентификатор — не более 3 символов.

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

table-layout:fixed; — это стандартный способ заставить text-overflow: ellipsis; работать, но он изменяет размеры всех столбцов до одинакового размера. Я бы предпочел оставить ширину auto, а не фиксированную.

Вы можете помочь?

Вот мой jsFiddle: http://jsfiddle.net/RQhkk/1/

Вот скриншот того, с чем я имею дело:

столбцы таблицы

Обратите внимание, как Table 1 делает все столбцы одинакового размера? Это ужасно.

Обратите внимание, как Table 2 определяет размеры столбцов в зависимости от содержимого? Это хорошо. За исключением случаев, когда содержимое слишком длинное: Table 3. Тогда не подходит. В этом случае я бы хотел, чтобы он переполнялся многоточием.

А вот моя таблица html и код css:

<div id="t1">
<table>
    <thead>
        <tr>
            <th>id</th>
            <th>name</th>
            <th class="ellipsis">description</th>
            <th>phone</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>1</td>
            <td>alpha</td>
            <td class="ellipsis">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</td>
            <td>555-555-5555</td>
        </tr>
        <tr>
            <td>2</td>
            <td>beta</td>
            <td class="ellipsis">Sed et nulla neque.</td>
            <td>555-555-5555</td>
        </tr>
        <tr>
            <td>3</td>
            <td>gamma</td>
            <td class="ellipsis">Morbi imperdiet neque ut lorem rhoncus fermentum.</td>
            <td>555-555-5555</td>
        </tr>
    </tbody>
</table>
</div>

<style>
#t1 table {
    table-layout:fixed;
    width:100%;
}
#t1 td {
    white-space: nowrap;
}
#t1 td.ellipsis {
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
    word-break: break-all;
    word-wrap: break-word;
}
</style>

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


person Ryan    schedule 09.04.2013    source источник


Ответы (3)


Это должно работать, если вы укажете max-width для td.ellipsis.

person pzin    schedule 09.04.2013
comment
Ницца! Это помогает. Однако другие меньшие столбцы занимают гораздо больше свободного места, чем необходимо. Ознакомьтесь с обновленной скриптой: jsfiddle.net/RQhkk/3 ширина в классе многоточия. Но другие столбцы намного больше, чем они должны быть. Какие-либо предложения? Я бы хотел, чтобы столбцы больше походили на таблицу 2, но с многоточием по мере необходимости. - person Ryan; 09.04.2013

Решение, которое я нашел, состоит в том, чтобы стилизовать ваши ячейки следующим образом:

td{
    white-space: nowrap;
}

td.description{
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 1px;    
    width: 100%;
}

Первая часть заставит каждый столбец сжаться настолько, насколько это возможно, и выровнять любой обрезанный текст в любой ячейке. Однако они не будут сокращаться до 1 пикселя, потому что вы можете использовать заголовки таблиц для указания минимальной ширины. Это также предотвращает перенос строк в таблице.

Вторая часть гарантирует, что все свободное пространство будет занято столбцом описания, а не распределено равномерно между всеми столбцами.

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

См. http://jsfiddle.net/BCZTB/ для реализации.

person rmehlinger    schedule 05.12.2013
comment
ваше решение не соответствует вашей скрипке. (решение кажется правильным.) - person Jayen; 21.05.2014
comment
это не работает для меня в IE8. с table-layout: fixed я получаю равные столбцы. без table-layout: fixed таблица шире 100%. - person Jayen; 24.05.2014
comment
Fiddle не работает с IE9 - таблица шире 100%, отображается полное содержимое вместо многоточия. - person marapet; 27.08.2015

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

Мой пример jsfiddle можно найти здесь http://jsfiddle.net/qt7eQ/1/

<script type="text/javascript">
$(function() {
    //add a innerParagraph block element to all columns except for the one that has the class ellipsis
    $( "#t3 tr td:not(.ellipsis)" ).wrapInner(function() {
          return "<p class='innerParagraph'></p>";
    });

    //get the first column and assign it the width of the elements in the first column
    $( "#t3 tr th:nth-child(1)" ).width( getMaxWidthOf( "#t3 tr>td:nth-child(1) p" ) );
    $( "#t3 tr td:nth-child(1)" ).width( getMaxWidthOf( "#t3 tr>td:nth-child(1) p" ) );

    //get the second column and assign it the width of the elements in the second column
    $( "#t3 tr th:nth-child(2)" ).width( getMaxWidthOf( "#t3 tr>td:nth-child(2) p" ) );
    $( "#t3 tr td:nth-child(2)" ).width( getMaxWidthOf( "#t3 tr>td:nth-child(2) p" ) );

    //get the fourth column and assign it the width of the elements in the forth column
    $( "#t3 tr th:nth-child(4)" ).width( getMaxWidthOf( "#t3 tr>td:nth-child(4) p" ) );
    $( "#t3 tr td:nth-child(4)" ).width( getMaxWidthOf( "#t3 tr>td:nth-child(4) p" ) );
});


function getMaxWidthOf(selector){
    var maxWidth = 0;
    //go through each paragraph in the right column and find the widest value.
    $(selector).each(function() {
        if(maxWidth < $(this).width()){
            maxWidth = $(this).width();
        }
    });
    // assign max width to column
    return maxWidth;
}
</script>

<!-- add this style -->
<style type="text/css">
#t3 table {
    table-layout:fixed;
{
.innerParagraph {
    margin:0;
    display:inline-block;
}
</style>
person deefactorial    schedule 06.10.2013