Это может быть немного поздно в игре, но я искал решение для этого, и коллега предложил очень элегантный вариант, которым я поделюсь. Требуется немного JS, но не много.
Представьте, что у вас есть div
размера, в который нужно поместить свою этикетку:
<div style="width: 200px; overflow: hidden"></div>
Теперь у вас есть функция, которая будет принимать два параметра: строку с меткой и элемент 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
, вычитая соответствующую пропорцию из длины этикетки и деления на два.