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

Как ограничить <td> только тремя строками?

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

enter image description here

Я надеялся ограничить все <td> на 3 строки.

Если будет показано больше трех строк, тогда он должен вырезать содержимое с помощью ... [click for more] и помещать содержимое внутри collapseable element, так что при нажатии на него будет отображаться весь контент.

Последнее не должно быть проблемой, но как ограничить контент только тремя строками? Должен ли я считать персонажей, чтобы принять решение? Есть ли лучшая стратегия? Я использую Django, кстати, но я счастлив использовать javascript, jquery или любую магию css, чтобы решить эту проблему.

Update:

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

enter image description here

while($(this).innerHeight() / $(this).css('line-height').slice(0,-2) >= 3){ .. }

Так как $(this).innerHeight() не может уменьшиться из-за соседней ячейки, удерживающей высоту выше. Я думаю, что если бы можно было получить css текущего td и скопировать его по содержимому полностью в отдельном поле, где соседние tds не могут вмешиваться, мы получим оптимальное решение.

Обновление 2:

Как упоминал Асад, решение состоит в том, чтобы поместить обертку div вокруг содержимого td и установить класс на div внутри td, а не на td. Он работает безупречно.

4b9b3361

Ответ 1

Предполагая, что вы используете jQuery, вы можете найти все элементы td, которые превышают определенное количество строк, используя:

$('td').filter(function(){
    return $(this).innerHeight() / $(this).css('line-height').slice(0,-2) > 3; //more than 3 lines
});

Затем вы можете применить складывающиеся элементы к этим элементам td.

Вот демонстрация (используя абзацы вместо td s): http://jsfiddle.net/jM4ZY/1/

Вот пример отсечения содержимого, чтобы он соответствовал 3 строкам, затем добавив еще одну кнопку: http://jsfiddle.net/jM4ZY/2/

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

Ответ 2

Другое решение jQuery описано здесь

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

$.fn.textWidth = function(){
  var html_org = $(this).html();
  var html_calc = '<span>' + html_org + '</span>';
  $(this).html(html_calc);
  var width = $(this).find('span:first').width();
  $(this).html(html_org);
  return width;
};

который я взял из Вычисление ширины текста