Я придумал эту идею. Сценарий будет измерять содержимое div и, если его ширина будет больше ширины div, он немного уменьшит содержимое, чтобы мог поместиться многоточечный символ, и поместил многоточечный символ:
<style>
div {
width: 100px;
height: 1em;
overflow: hidden;
white-space: nowrap;
}
</style>
<div>Short text.</div>
<div>Extremely long text.</div>
<script>
(function () {
var list = document.getElementsByTagName('div');
for (var i = 0; i < list.length; i++) {
var spanElement = document.createElement('span');
while (list[i].childNodes.length)
spanElement.appendChild(list[i].firstChild);
list[i].appendChild(spanElement);
if (list[i].firstChild.offsetWidth > list[i].offsetWidth) {
var ellipsisSpanElement = document.createElement('span');
ellipsisSpanElement.appendChild(document.createTextNode('…'));
list[i].appendChild(ellipsisSpanElement);
var newWidth = list[i].offsetWidth - ellipsisSpanElement.offsetWidth;
list[i].firstChild.setAttribute('style',
'overflow: hidden; white-space: nowrap; display: block; float: left; width: ' + newWidth + 'px');
}
}
})();
</script>
Я не использовал YUI в этом примере, я почти не знаю эту библиотеку. Я уверен, что этот код можно было бы написать намного проще, избегая всех этих методов DOM и используя заменители YUI.
Недостаток: в конце сценарий грубо режет букву, которая выглядит не очень красиво. Но измерение ширины содержимого по буквам или даже в логарифмической форме требует слишком много времени. Пока это моя лучшая идея.
Решение: используйте text-overflow: ellipsis
в браузерах, которые поддерживают это, и скрипт в других.
Список всех вариантов text-overflow: ellipsis
, многие из них еще не работают. Успешно протестировано в IE 8.0, Opera, Chrome.
text-overflow: ellipsis;
-o-text-overflow: ellipsis;
-icab-text-overflow: ellipsis;
-khtml-text-overflow: ellipsis;
-moz-text-overflow: ellipsis;
-webkit-text-overflow: ellipsis;