CSS: обрезать ячейки таблицы, но вмещать как можно больше - PullRequest
204 голосов
/ 09 марта 2011

Знакомьтесь, Фред.Он таблица:

One cell has more content and is wider, the other has less content and is narrower

<table border="1" style="width: 100%;">
    <tr>
        <td>This cells has more content</td>
        <td>Less content here</td>
    </tr>
</table>

В квартире Фреда есть странная привычка менять размер, поэтому он научился скрывать часть своего контента, чтобы не отталкивать все остальные юнитыперевернуть и затолкнуть гостиную миссис Уитфорд в забвение:

The cells are now the same size, but only one has its content truncated, and it looks like if the other cell gave if some whitespace, they could both fit.

<table border="1" style="width: 100%; white-space: nowrap; table-layout: fixed;">
    <tr>
        <td style="overflow: hidden; text-overflow: ellipsis">This cells has more content</td>
        <td style="overflow: hidden; text-overflow: ellipsis">Less content here</td>
    </tr>
</table>

Это работает, но у Фреда возникает ноющее чувство, будто его правая клетка (которую он прозвал Celldito)оставив немного места, его левая клетка не будет усечена почти столько же времени.Можете ли вы сохранить его здравомыслие?


В заключение: как клетки таблицы могут переполняться равномерно, и только тогда, когда все они оставили все свои пробелы?

Ответы [ 18 ]

63 голосов
/ 13 октября 2013
<table border="1" style="width: 100%;">
    <colgroup>
        <col width="100%" />
        <col width="0%" />
    </colgroup>
    <tr>
        <td style="white-space: nowrap; text-overflow:ellipsis; overflow: hidden; max-width:1px;">This cell has more content.This cell has more content.This cell has more content.This cell has more content.This cell has more content.This cell has more content.</td>
        <td style="white-space: nowrap;">Less content here.</td>
    </tr>
</table>

http://jsfiddle.net/7CURQ/

36 голосов
/ 03 ноября 2013

Мне кажется, у меня есть не-JavaScript-решение!Лучше поздно чем никогда, правильно?В конце концов, это отличный вопрос, и Google во всем.Я не хотел соглашаться на исправление javascript, потому что я нахожу небольшое дрожание вещей, движущихся после загрузки страницы, неприемлемым.

Особенности :

  • Нет JavaScript
  • Нет фиксированного макета
  • Нет трюков с взвешиванием или процентной шириной
  • Работает с любым количеством столбцов
  • Простой на стороне серверагенерация и обновление на стороне клиента (вычисления не требуются)
  • Кросс-браузер совместим

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

Протестировано и работает в: IE8, IE9, IE10, Chrome, Firefox, Safari, Opera

Результирующие изображения :

Nice proportional widths Nice proportional clipping

JSFiddle : http://jsfiddle.net/zAeA2/

Пример HTML / CSS :

<td>
    <!--Relative-positioned container-->
    <div class="container">
        <!--Visible-->
        <div class="content"><!--Content here--></div>
        <!--Hidden spacer-->
        <div class="spacer"><!--Content here--></div>
        <!--Keeps the container from collapsing without
            having to specify a height-->
        <span>&nbsp;</span>
     </div>
</td>

.container {
    position: relative;
}
.content {
    position: absolute;
    max-width: 100%;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.spacer {
    height: 0;
    overflow: hidden;
}
20 голосов
/ 17 января 2014

Я столкнулся с той же проблемой несколько дней назад.Кажется, Люцифер Сэм нашел лучшее решение.

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

Здесь я предлагаю получить доступ к атрибуту title из псевдоэлемента :after, чтобы сгенерировать прокладку и сохранить HTML в чистоте.на IE8 +, FF, Chrome, Safari, Opera

<table border="1">
  <tr>
    <td class="ellipsis_cell">
      <div title="This cells has more content">
        <span>This cells has more content</span>
      </div>
    </td>
    <td class="nowrap">Less content here</td>
  </tr>
</table>
.ellipsis_cell > div {
    position: relative;
    overflow: hidden;
    height: 1em;
}

/* visible content */
.ellipsis_cell > div > span {
    display: block;
    position: absolute; 
    max-width: 100%;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    line-height: 1em;
}

/* spacer content */
.ellipsis_cell > div:after {
    content: attr(title);
    overflow: hidden;
    height: 0;
    display: block;
}

http://jsfiddle.net/feesler/HQU5J/

18 голосов
/ 12 марта 2011

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

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

Разметка для строки, которую я использовал для тестирования:

<tr class="row">
    <td style="overflow: hidden; text-overflow: ellipsis">
    <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>
    </td>
    <td style="overflow: hidden; text-overflow: ellipsis">
    <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>
    </td>
</tr>

JQuery, который подключает событие изменения размера:

$(window).resize(function() {
    $('.row').each(function() {
        var row_width = $(this).width();
        var cols = $(this).find('td');
        var left = cols[0];
        var lcell_width = $(left).width();
        var lspan_width = $(left).find('span').width();
        var right = cols[1];
        var rcell_width = $(right).width();
        var rspan_width = $(right).find('span').width();

        if (lcell_width < lspan_width) {
            $(left).width(row_width - rcell_width);
        } else if (rcell_width > rspan_width) {
            $(left).width(row_width / 2);
        }
    });
});
15 голосов
/ 09 апреля 2015

Существует гораздо более простое и элегантное решение.

В ячейке таблицы, к которой вы хотите применить усечение, просто включите контейнер div с помощью css table-layout: fixed.Этот контейнер занимает всю ширину ячейки родительской таблицы, поэтому он даже реагирует.

Убедитесь, что применены усечения к элементам в таблице.

Работает с IE8 +

<table>
  <tr>
    <td>
     <div class="truncate">
       <h1 class="truncated">I'm getting truncated because I'm way too long to fit</h1>
     </div>
    </td>
    <td class="some-width">
       I'm just text
    </td>
  </tr>
</table>

и css:

    .truncate {
      display: table;
      table-layout: fixed;
      width: 100%;
    }

    h1.truncated {
      overflow-x: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;
    }

вот рабочая скрипка https://jsfiddle.net/d0xhz8tb/

11 голосов
/ 09 марта 2011

Проблема заключается в 'table-layout: fixed', которая создает столбцы с равномерно распределенной фиксированной шириной. Но отключение этого css-свойства убьет переполнение текста, потому что таблица станет настолько большой, насколько это возможно (и чем там будет замечено переполнение).

Извините, но в этом случае Фред не может взять свой пирог и съесть его ... если хозяин не предоставит Celldito меньше места для работы, во-первых, Фред не сможет использовать свой ..

9 голосов
/ 10 марта 2011

Вы можете попробовать «взвесить» определенные столбцы, например:

<table border="1" style="width: 100%;">
    <colgroup>
        <col width="80%" />
        <col width="20%" />
    </colgroup>
    <tr>
        <td>This cell has more content.</td>
        <td>Less content here.</td>
    </tr>
</table>

Вы также можете попробовать некоторые более интересные твики, такие как использование столбцов с шириной 0% и использование некоторой комбинации white-spaceСвойство CSS.

<table border="1" style="width: 100%;">
    <colgroup>
        <col width="100%" />
        <col width="0%" />
    </colgroup>
    <tr>
        <td>This cell has more content.</td>
        <td style="white-space: nowrap;">Less content here.</td>
    </tr>
</table>

Вы поняли.

3 голосов
/ 12 мая 2013

Как и в случае ответа на самбле, снова, если Javascript является приемлемым ответом, я специально создал для этого плагин jQuery: https://github.com/marcogrcr/jquery-tableoverflow

Чтобы использовать плагин, просто наберите

$('selector').tableoverflow();

Полный пример: http://jsfiddle.net/Cw7TD/3/embedded/result/

Изменения:

  • Исправление в jsfiddle для совместимости с IE.
  • Исправление в jsfiddleдля лучшей совместимости браузера (Chrome, Firefox, IE8 +).
3 голосов
/ 29 ноября 2014

Используйте хак CSS, похоже, display: table-column; может прийти на помощь:

<div class="myTable">
    <div class="flexibleCell">A very long piece of content in first cell, long enough that it would normally wrap into multiple lines.</div>
    <div class="staticCell">Less content</div>
</div>

.myTable {
    display: table;
    width: 100%;
}

.myTable:before {
    display: table-column;
    width: 100%;
    content: '';
}

.flexibleCell {
    display: table-cell;
    max-width:1px;
    white-space: nowrap;
    text-overflow:ellipsis;
    overflow: hidden;
}

.staticCell {
    white-space: nowrap;
}

JSFiddle: http://jsfiddle.net/blai/7u59asyp/

3 голосов
/ 09 марта 2011

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

...