Это может быть немного поздно в игре, но я искал, чтобы найти решение этой проблемы, и коллега предложил очень элегантный один, который я поделюсь. Это требует некоторых JS, но не много.
Представьте, что вы едите div
, размер которого вам нужно поставить метку в:
<div style="width: 200px; overflow: hidden"></div>
Теперь у вас есть функция, которая будет принимать два Params: строка с меткой, и элемент DOM (это div
), чтобы вписать его в:
function setEllipsisLabel(div, label)
Первое, что вы делаете, это создать span
с этим лейблом, и поместить его в div
:
var span = document.createElement('span');
span.appendChild(document.createTextNode(label));
span.style.textOverflow = 'ellipsis';
span.style.display = 'inline-block';
div.appendChild(span);
Мы установили для свойства «text-overflow
» значение «эллипсис», так что, когда текст отрубается, хороший «...»добавлено в конце, чтобы проиллюстрировать это. Мы также установили display
как« встроенный блок », чтобы эти элементы имели реальные размеры пикселей, которые мы можем манипулировать позже. До сих пор мы ничего не могли сделать с чистым CSS.
Но мы хотим, чтобы многоточие в середине во-первых, мы должны выяснить, если это нужно вообще ... Это может быть сделано путем сравнения div.clientWidth
к span.clientWidth
. - многоточие только необходимо, если span
шире div
.
Если нам нужен эллипсис, давайте начнем с того, что хотим, чтобы в конце слова было указано фиксированное число символов - скажем 10. Итак, давайте создадим пролет, содержащий только последние 10 символов метки, и приклейте его в div:
var endSpan = document.createElement('span');
endSpan.style.display = 'inline-block';
endspan.appendChild(document.createTextNode(label.substring(label.length - 10)));
div.appendChild(endSpan);
Теперь давайте переопределить ширину исходного span
для размещения новых один:
span.style.width = (div.clientWidth - endSpan.clientWidth) + 'px';
В результате этого мы получим структуру DOM, которая выглядит примерно так:
<div style="width: 200px; overflow: hidden">
<span style="display: inline-block; text-overflow: ellipsis; width: 100px">
A really long label is shown in this span
</span>
<span style="display: inline-block"> this span</span>
</div>
Поскольку первый span
имеет значение text-overflow
, установленное значение «эллипсис», в конце будет отображаться «...», а затем 10 символов второй диапазон, в результате чего эллипсис показывает примерно в середине div
.
Вам не нужно жестко длиной 10 символов для endSpan либо: это может быть аппроксимировано путем расчета соотношения первоначальной ширины span
«ы к тому, что из div
, вычитая соответствующую долю от длины метки и разделение на два.
мне было бы интересно увидеть окончательные реализации, если у вас есть. :) –