Solo una rapida idea di base.
Stavo testando con il seguente markup:
<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>
E CSS:
#fos { width: 300px; height: 190px; overflow: hidden; }
#fos p { padding: 10px; margin: 0; }
Applicando questo jQuery otterrai il risultato desiderato:
var $p = $('#fos p');
var divh = $('#fos').height();
while ($p.outerHeight() > divh) {
$p.text(function (index, text) {
return text.replace(/\W*\s(\S)*$/, '...');
});
}
Tenta ripetutamente di rimuovere l'ultima parola del testo fino a raggiungere la dimensione desiderata. A causa dell'overflow: nascosto; il processo rimane invisibile e anche con JS disattivato il risultato rimane 'visivamente corretto' (senza il "..." ovviamente).
Se lo combini con un sensibile troncamento sul lato server (che lascia solo un piccolo sovraccarico), funzionerà più velocemente :).
Ancora una volta, questa non è una soluzione completa, solo un'idea.
AGGIORNAMENTO: aggiunta una demo jsFiddle .