Я работаю над ECMAScript / JavaScript для файла SVG и нужно получить width
и height
из text
элемента , так что я могу изменить размер прямоугольника , который его окружает. В HTML я мог бы использовать атрибуты offsetWidth
и offsetHeight
в элементе, но похоже, что эти свойства недоступны.
Вот фрагмент, с которым мне нужно работать. Мне нужно изменять ширину прямоугольника всякий раз, когда я меняю текст, но я не знаю, как получить фактический width
(в пикселях) text
элемент.
<rect x="100" y="100" width="100" height="100" />
<text>Some Text</text>
Любые идеи?
javascript
dom
text
svg
Стивен Соренсен
источник
источник
Что касается длины текста, ссылка, похоже, указывает на то, что BBox и getComputedTextLength () могут возвращать немного разные значения, но довольно близкие друг к другу.
http://bl.ocks.org/MSCAU/58bba77cdcae42fc2f44
источник
работал у меня в
источник
Как насчет чего-то вроде этого для совместимости:
Это возвращает среднее значение любых действительных результатов трех методов. Вы можете улучшить его, чтобы исключить выбросы или указать, является
getComputedTextLength
ли элемент текстовым.Предупреждение: как говорится в комментарии,
getBoundingClientRect
это сложно. Либо удалите его из методов, либо используйте только для элементов,getBoundingClientRect
которые вернут хорошие результаты, поэтому без вращения и, вероятно, без масштабирования (?)источник
Не знаю почему, но ни один из вышеперечисленных методов мне не подходит. У меня был некоторый успех с методом холста, но мне пришлось применять всевозможные масштабные коэффициенты. Даже с учетом масштабных коэффициентов у меня все еще были противоречивые результаты между Safari, Chrome и Firefox.
Итак, я попробовал следующее:
Работает потрясающе и сверхточно, но только в Firefox. На помощь приходят масштабные коэффициенты для Chrome и Safari, но без радости. Оказывается, ошибки Safari и Chrome не зависят от длины строки или размера шрифта.
Итак, подход номер два. Мне не очень нравится метод грубой силы, но после того, как я много лет боролся с этим, я решил попробовать. Я решил создать постоянные значения для каждого отдельного печатаемого символа. Обычно это было бы утомительно, но, к счастью, Firefox оказался очень точным. Вот мое решение, состоящее из двух частей:
Примечание. Приведенный выше фрагмент должен быть выполнен в Firefox для создания точного массива значений. Кроме того, вам необходимо заменить элемент 32 массива значением ширины пробела в журнале консоли.
Я просто копирую текст Firefox на экране и вставляю его в свой код javascript. Теперь, когда у меня есть массив длин символов для печати, я могу реализовать функцию получения ширины. Вот код:
Ну вот и все. Грубая сила, но она очень точна во всех трех браузерах, и уровень моего разочарования упал до нуля. Не уверен, как долго это продлится по мере развития браузеров, но этого должно хватить, чтобы я мог разработать надежную технику метрик шрифтов для моего текста SVG.
источник
В спецификации SVG есть специальный метод для возврата этой информации:
getComputedTextLength()
источник