В спецификации есть функция context.measureText (text), которая сообщит вам, сколько ширины потребуется для печати этого текста, но я не могу найти способ узнать, насколько он высокий. Я знаю, что он основан на шрифте, но я не знаю, как преобразовать строку шрифта в высоту текста.
javascript
text
canvas
swampsjohn
источник
источник
M̶̢̹̝͖̦̖̭͕̭̣͆̃̀̅̒̊͌̿ͅ
, так что это действительно сложная задача, поэтому решите ее для общего случая.Ответы:
ОБНОВИТЬ - для примера этой работы я использовал эту технику в редакторе Carota .
Следуя ответу ellisbben, вот улучшенная версия для получения подъема и спуска от базовой линии, то есть такая же, как
tmAscent
иtmDescent
возвращенная Win32 GetTextMetric API. Это необходимо, если вы хотите выполнить обтекание текстом с разным шрифтом / размером.Приведенное выше изображение было сгенерировано на холсте в Safari, красная линия - это верхняя строка, где холсту было приказано нарисовать текст, зеленый - базовая линия, а синий - нижняя (таким образом, красный или синий - полная высота).
Использование jQuery для краткости:
В дополнение к текстовому элементу я добавляю div с помощью,
display: inline-block
чтобы я мог установить егоvertical-align
стиль, а затем выяснить, куда его поместил браузер.Таким образом, вы получаете объект с
ascent
,descent
иheight
(что простоascent
+descent
для удобства). Чтобы проверить это, стоит иметь функцию, которая рисует горизонтальную линию:Затем вы можете увидеть, как текст располагается на холсте относительно верха, базовой линии и низа:
источник
getTextHeight()
наvar text = $('<span>Hg</span>').css({ 'font-family': fontName, 'font-size' : fontSize });
, т.е. добавив размер отдельно.<div></div>
чтобы<div style="white-space : nowrap;"></div>
обрабатывать очень длинную строкуВы можете получить очень близкое приближение вертикальной высоты, проверив длину заглавной буквы М.
источник
Спецификация canvas не дает нам метод измерения высоты строки. Тем не менее, вы можете установить размер вашего текста в пикселях, и вы обычно можете определить, какие вертикальные границы относительно легко.
Если вам нужно что-то более точное, вы можете выбросить текст на холст, а затем получить данные о пикселях и выяснить, сколько пикселей используется по вертикали. Это было бы относительно просто, но не очень эффективно. Вы можете сделать что-то вроде этого (это работает, но рисует на холсте текст, который вы хотели бы удалить):
Для Беспина они подделывают высоту, измеряя ширину строчной буквы «м» ... Я не знаю, как это используется, и я бы не рекомендовал этот метод. Вот соответствующий метод Беспина:
источник
em
является относительным измерением шрифта, где один em равен высоте буквыM
в размере шрифта по умолчанию.Браузеры начинают поддерживать расширенные текстовые метрики , которые сделают эту задачу тривиальной, когда она широко поддерживается:
fontHeight
возвращает вам ограничивающую высоту, которая является постоянной независимо от отображаемой строки.actualHeight
специфично для отображаемой строки.Spec: https://www.w3.org/TR/2012/CR-2dcontext-20121217/#dom-textmetrics-fontboundingboxascent и разделы чуть ниже него.
Статус поддержки (20 августа 2017 года):
источник
РЕДАКТИРОВАТЬ: Вы используете преобразования холста? Если это так, вам придется отслеживать матрицу преобразования. Следующий метод должен измерять высоту текста с начальным преобразованием.
РЕДАКТИРОВАТЬ # 2: странно код ниже не дает правильных ответов, когда я запускаю его на этой странице StackOverflow; Вполне возможно, что наличие некоторых правил стиля может нарушить эту функцию.
Холст использует шрифты, как определено CSS, поэтому теоретически мы можем просто добавить в документ соответствующий стиль текста и измерить его высоту. Я думаю, что это значительно проще, чем визуализация текста, а затем проверка данных пикселей, и это также должно учитывать восходящие и нисходящие. Проверьте следующее:
Вам нужно убедиться, что вы правильно выбрали стиль шрифта для элемента DOM, для которого вы измеряете высоту, но это довольно просто; на самом деле вы должны использовать что-то вроде
источник
Разве высота текста в пикселях не равна размеру шрифта (в пунктах), если вы определяете шрифт с помощью context.font?
источник
Как предлагает JJ Stiff, вы можете добавить свой текст в диапазон, а затем измерить offsetHeight диапазона.
Как показано на HTML5Rocks
источник
Просто добавьте к ответу Даниэля (что здорово! И абсолютно верно!) Версию без JQuery:
Я только что протестировал приведенный выше код и отлично работает на последних Chrome, FF и Safari на Mac.
РЕДАКТИРОВАТЬ: я также добавил размер шрифта и протестировал с веб-шрифтом вместо системного шрифта - работает потрясающе.
источник
Я решил эту проблему с первого взгляда - используя пиксельные манипуляции.
Вот графический ответ:
Вот код:
источник
Я пишу эмулятор терминала, поэтому мне нужно было рисовать прямоугольники вокруг символов.
Очевидно, что если вам нужно точное количество места, которое занимает персонаж, это не поможет. Но это даст вам хорошее приближение для определенных целей.
источник
Я реализовал хорошую библиотеку для измерения точной высоты и ширины текста с помощью HTML canvas. Это должно делать то, что вы хотите.
https://github.com/ChrisBellew/text-measurer.js
источник
Вот простая функция. Библиотека не нужна.
Я написал эту функцию, чтобы получить верхнюю и нижнюю границы относительно базовой линии. Если
textBaseline
установлено наalphabetic
. Что он делает, так это создает другой холст, а затем рисует там, а затем находит самый верхний и самый нижний непустой пиксель. И это верхняя и нижняя границы. Он возвращает его как относительный, поэтому, если высота равна 20px, а под базовой линией ничего нет, тогда верхняя граница-20
.Вы должны предоставить символы для этого. В противном случае это даст вам 0 высоту и 0 ширину, очевидно.
Использование:
Вот функция:
relativeBot
,relativeTop
Иheight
являются полезными вещами в возвратном объекте.Вот пример использования:
relativeBot
ИrelativeTop
то , что вы видите здесь это изображение:https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Drawing_text
источник
однострочный ответ
CSS "line-height: normal" находится между 1 и 1.2
читай здесь для получения дополнительной информации
источник
Забавно, что TextMetrics имеет только ширину и высоту:
http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#textmetrics
Можете ли вы использовать Span, как в этом примере?
http://mudcu.be/journal/2011/01/html5-typographic-metrics/#alignFix
источник
Это то, что я сделал, основываясь на некоторых других ответах здесь:
источник
Прежде всего, вам нужно установить высоту размера шрифта, а затем в соответствии со значением высоты шрифта определить текущую высоту вашего текста, сколько, кросс-текстовых строк, конечно же, такая же высота Шрифт нужно накапливать, если текст не превышает наибольшее текстовое поле Высота, все показывать, в противном случае показывать текст только внутри текста блока. Высокие значения требуют вашего собственного определения. Чем больше заданная высота, тем больше высота текста, который необходимо отобразить и перехватить.
После того, как эффект обработан (решить)
До того, как эффект обработан (не решен)
источник
Я обнаружил, что JUST FOR ARIAL самый простой, быстрый и точный способ определить высоту ограничительной рамки - это использовать ширину определенных букв. Если вы планируете использовать определенный шрифт, не позволяя пользователю выбирать другой, вы можете провести небольшое исследование, чтобы найти правильную букву, которая выполняет работу для этого шрифта.
источник
установка размера шрифта может быть непрактичной, поскольку настройка
ctx.font = ''
будет использовать тот, который определен CSS, а также любые встроенные теги шрифта. Если вы используете шрифт CSS, вы не знаете, какая высота от программного способа, используя метод measureText, который очень недальновиден. С другой стороны, IE8 возвращает ширину и высоту.
источник
Это работает 1) и для многострочного текста 2) и даже в IE9!
источник
Я знаю, что это старый ответ на вопрос, но для дальнейшего использования я хотел бы добавить короткое, минимальное решение только для JS (без jquery), которое, как я полагаю, может принести пользу людям:
источник
В обычных ситуациях должно работать следующее:
источник
Это безумие ... Высота текста - это размер шрифта. Кто-нибудь из вас читал документацию?
это установит высоту 22px.
единственная причина есть ..
это потому, что ширина строки не может быть определена, если она не знает строку, ширину которой вы хотите, но для всех строк, нарисованных шрифтом ... высота будет 22px.
если вы используете другое измерение, чем px, то высота будет такой же, но с этим измерением, поэтому самое большее, что вам нужно будет сделать, - это преобразовать измерение.
источник
Примерное решение:
Это будет точный результат в моноширинном шрифте.
источник