Juste une petite idée de base.
Je testais avec le balisage suivant:
<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>
Et CSS:
#fos { width: 300px; height: 190px; overflow: hidden; }
#fos p { padding: 10px; margin: 0; }
L'application de ce jQuery obtiendra le résultat souhaité:
var $p = $('#fos p');
var divh = $('#fos').height();
while ($p.outerHeight() > divh) {
$p.text(function (index, text) {
return text.replace(/\W*\s(\S)*$/, '...');
});
}
Il essaie à plusieurs reprises de supprimer le dernier mot du texte jusqu'à ce qu'il atteigne la taille souhaitée. En raison du débordement: caché; le processus reste invisible et même avec JS désactivé, le résultat reste «visuellement correct» (sans le «...» bien sûr).
Si vous combinez cela avec une troncature judicieuse côté serveur (qui ne laisse qu'une petite surcharge), cela fonctionnera plus vite :).
Encore une fois, ce n'est pas une solution complète, juste une idée.
MISE À JOUR: Ajout d'une démo jsFiddle .