Вот мое решение (с использованием jQuery).
Markup:
<div class="text">This is shown. This is hidden</div>
CSS:
.text{
outline:1px solid orange;
width:200px;
height:20px;
overflow:hidden;
}
(На самом деле имеет значение только переполнение: скрытый, код все равно будет работать с разными значениями высоты и ширины.)
JS:
$('.text').wrapInner('<div/>');
var originaltext = $('.text div').text();
var t = $('.text div').text();
while(true)
{
if ($('.text div').height() <= $('.text').height()) { break; }
$('.text div').text(t.substring(0, t.lastIndexOf(" ")));
t = $('.text div').text();
}
$('.text div').text(originaltext);
alert("shown: " + originaltext.substring(0, t.length));
alert("hidden: " + originaltext.substring(t.length));
Вот что он делает:
Мы сохраняем исходный текст в переменной, чтобы мы могли восстановить его позже.
Затем мы удаляем одно слово за раз, пока внутренний div не уменьшится до той же высоты, что и контейнер (со скрытым переполнением). Все, что осталось в div, было видно, а все, что нам нужно было удалить, было скрыто.
Ограничения
Мое решение предполагает, что div содержит только текст. Он будет в основном работать со встроенными элементами, такими как span, но в настоящее время удаляет их во время процесса. Его можно легко исправить, чтобы сохранить промежутки, но гораздо сложнее справиться с изображениями или другими сложностями, такими как расположенные элементы.