Как узнать высоту текста на холсте HTML? - PullRequest
137 голосов
/ 16 июля 2009

В спецификации есть функция context.measureText (text), которая сообщит вам, сколько ширины потребуется для печати этого текста, но я не могу найти способ выяснить, насколько он высокий. Я знаю, что он основан на шрифте, но я не знаю, как преобразовать строку шрифта в высоту текста.

Ответы [ 21 ]

2 голосов
/ 09 декабря 2017

однострочный ответ

var height = parseInt(ctx.font) * 1.2; 

CSS "line-height: normal" находится в диапазоне от 1 до 1,2

читать здесь для получения дополнительной информации

2 голосов
/ 23 сентября 2011

Я пишу эмулятор терминала, поэтому мне нужно было рисовать прямоугольники вокруг символов.

var size = 10
var lineHeight = 1.2 // CSS "line-height: normal" is between 1 and 1.2
context.font = size+'px/'+lineHeight+'em monospace'
width = context.measureText('m').width
height = size * lineHeight

Очевидно, что если вам нужно точное количество места, которое занимает персонаж, это не поможет. Но это даст вам хорошее приближение для определенных целей.

2 голосов
/ 19 января 2016

Я реализовал хорошую библиотеку для измерения точной высоты и ширины текста с помощью HTML canvas. Это должно делать то, что вы хотите.

https://github.com/ChrisBellew/text-measurer.js

1 голос
/ 16 марта 2018

Я обнаружил, что JUST FOR ARIAL Самый простой, быстрый и точный способ определить высоту ограничительной рамки - использовать ширину определенных букв. Если вы планируете использовать определенный шрифт, не позволяя пользователю выбирать другой, вы можете провести небольшое исследование, чтобы найти правильную букву, которая выполняет работу для этого шрифта.

<!DOCTYPE html>
<html>
<body>

<canvas id="myCanvas" width="700" height="200" style="border:1px solid #d3d3d3;">
Your browser does not support the HTML5 canvas tag.</canvas>

<script>
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.font = "100px Arial";
var txt = "Hello guys!"
var Hsup=ctx.measureText("H").width;
var Hbox=ctx.measureText("W").width;
var W=ctx.measureText(txt).width;
var W2=ctx.measureText(txt.substr(0, 9)).width;

ctx.fillText(txt, 10, 100);
ctx.rect(10,100, W, -Hsup);
ctx.rect(10,100+Hbox-Hsup, W2, -Hbox);
ctx.stroke();
</script>

<p><strong>Note:</strong> The canvas tag is not supported in Internet 
Explorer 8 and earlier versions.</p>

</body>
</html>
1 голос
/ 11 августа 2017

Прежде всего, вам необходимо установить высоту размера шрифта, а затем в соответствии со значением высоты шрифта определить текущую высоту вашего текста, сколько кросс-текстовых строк, конечно, одинаково Высоту шрифта нужно накапливать, если текст не превышает наибольшее текстовое поле Высота, все показывать, в противном случае показывать только текст внутри блока текста. Высокие значения требуют вашего собственного определения. Чем больше заданная высота, тем больше высота текста, который необходимо отобразить и перехватить.

После обработки эффекта (решить)

До обработки эффекта ( нераскрытый)

  AutoWrappedText.auto_wrap = function(ctx, text, maxWidth, maxHeight) {
var words = text.split("");
var lines = [];
var currentLine = words[0];

var total_height = 0;
for (var i = 1; i < words.length; i++) {
    var word = words[i];
    var width = ctx.measureText(currentLine + word).width;
    if (width < maxWidth) {
        currentLine += word;
    } else {
        lines.push(currentLine);
        currentLine = word;
        // TODO dynamically get font size
        total_height += 25;

        if (total_height >= maxHeight) {
          break
        }
    }
}
if (total_height + 25 < maxHeight) {
  lines.push(currentLine);
} else {
  lines[lines.length - 1] += "…";
}
return lines;};
1 голос
/ 04 марта 2012

Забавно, что 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

0 голосов
/ 17 сентября 2014

В обычных ситуациях должно работать следующее:

var can = CanvasElement.getContext('2d');          //get context
var lineHeight = /[0-9]+(?=pt|px)/.exec(can.font); //get height from font variable
0 голосов
/ 13 августа 2009

установка размера шрифта может быть непрактичной, так как установка

ctx.font = ''

будет использовать тот, который определен CSS, а также любые встроенные теги шрифта. Если вы используете шрифт CSS, вы не представляете, какая высота программным способом, используя метод measureText, который очень близорук. С другой стороны, IE8 возвращает ширину и высоту.

0 голосов
/ 22 января 2019

Приблизительное решение:

var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.font = "100px Arial";
var txt = "Hello guys!"
var wt = ctx.measureText(txt).width;
var height = wt / txt.length;

Это будет точный результат в моноширинном шрифте.

0 голосов
/ 10 июня 2019

Это то, что я сделал, основываясь на некоторых других ответах здесь:

function measureText(text, font) {
	const span = document.createElement('span');
	span.appendChild(document.createTextNode(text));
	Object.assign(span.style, {
		font: font,
		margin: '0',
		padding: '0',
		border: '0',
		whiteSpace: 'nowrap'
	});
	document.body.appendChild(span);
	const {width, height} = span.getBoundingClientRect();
	span.remove();
	return {width, height};
}

var font = "italic 100px Georgia";
var text = "abc this is a test";
console.log(measureText(text, font));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...