Solo una idea básica rápida.
Estaba probando con el siguiente marcado:
<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>
Y CSS:
#fos { width: 300px; height: 190px; overflow: hidden; }
#fos p { padding: 10px; margin: 0; }
Aplicando este jQuery logrará el resultado deseado:
var $p = $('#fos p');
var divh = $('#fos').height();
while ($p.outerHeight() > divh) {
$p.text(function (index, text) {
return text.replace(/\W*\s(\S)*$/, '...');
});
}
Intenta eliminar repetidamente la última palabra del texto hasta que alcanza el tamaño deseado. Debido al desbordamiento: oculto; el proceso permanece invisible e incluso con JS apagado, el resultado sigue siendo 'visualmente correcto' (sin el "...", por supuesto).
Si combina esto con un truncamiento sensible en el lado del servidor (que deja solo una pequeña sobrecarga), se ejecutará más rápido :).
Nuevamente, esta no es una solución completa, solo una idea.
ACTUALIZACIÓN: se agregó una demostración jsFiddle .