Просто швидка основна ідея.
Я тестував із такою розміткою:
<div id="fos">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin nisi ligula, dapibus a volutpat sit amet, mattis et dui. Nunc porttitor accumsan orci id luctus. Phasellus ipsum metus, tincidunt non rhoncus id, dictum a lectus. Nam sed ipsum a lacus sodales eleifend. Vestibulum lorem felis, rhoncus elementum vestibulum eget, dictum ut velit. Nullam venenatis, elit in suscipit imperdiet, orci purus posuere mauris, quis adipiscing ipsum urna ac quam.</p>
</div>
І CSS:
#fos { width: 300px; height: 190px; overflow: hidden; }
#fos p { padding: 10px; margin: 0; }
Застосовуючи цей jQuery, ви отримаєте бажаний результат:
var $p = $('#fos p');
var divh = $('#fos').height();
while ($p.outerHeight() > divh) {
$p.text(function (index, text) {
return text.replace(/\W*\s(\S)*$/, '...');
});
}
Він кілька разів намагається видалити останнє слово з тексту, поки воно не досягне потрібного розміру. Через переповнення: приховано; процес залишається невидимим, і навіть при вимкненому JS результат залишається "візуально правильним" (без "..." звичайно).
Якщо ви поєднаєте це з розумним укороченням на стороні сервера (що залишає лише невеликі накладні витрати), воно запуститься швидше :).
Знову ж таки, це не повне рішення, а лише ідея.
ОНОВЛЕННЯ: Додано демонстрацію jsFiddle .