PEMBARUAN - untuk contoh kerja ini, saya menggunakan teknik ini di editor Carota .
Sebagai lanjutan dari jawaban ellisbben, berikut adalah versi yang disempurnakan untuk mendapatkan kenaikan dan penurunan dari garis dasar, yaitu sama dengan tmAscentdan tmDescentdikembalikan oleh API GetTextMetric Win32 . Ini diperlukan jika Anda ingin menjalankan teks yang dibungkus kata dengan bentang dalam berbagai font / ukuran.

Gambar di atas dihasilkan pada kanvas di Safari, merah menjadi garis atas di mana kanvas disuruh menggambar teks, hijau sebagai garis dasar dan biru menjadi bagian bawah (jadi merah ke biru adalah ketinggian penuh).
Menggunakan jQuery untuk ringkas:
var getTextHeight = function(font) {
var text = $('<span>Hg</span>').css({ fontFamily: font });
var block = $('<div style="display: inline-block; width: 1px; height: 0px;"></div>');
var div = $('<div></div>');
div.append(text, block);
var body = $('body');
body.append(div);
try {
var result = {};
block.css({ verticalAlign: 'baseline' });
result.ascent = block.offset().top - text.offset().top;
block.css({ verticalAlign: 'bottom' });
result.height = block.offset().top - text.offset().top;
result.descent = result.height - result.ascent;
} finally {
div.remove();
}
return result;
};
Selain elemen teks, saya menambahkan div dengan display: inline-blocksehingga saya dapat mengatur vertical-aligngayanya, dan kemudian mencari tahu di mana browser telah meletakkannya.
Jadi, Anda mendapatkan kembali objek dengan ascent, descentdan height(yang hanya ascent+ descentuntuk kenyamanan). Untuk mengujinya, ada baiknya memiliki fungsi yang menarik garis horizontal:
var testLine = function(ctx, x, y, len, style) {
ctx.strokeStyle = style;
ctx.beginPath();
ctx.moveTo(x, y);
ctx.lineTo(x + len, y);
ctx.closePath();
ctx.stroke();
};
Kemudian Anda dapat melihat bagaimana teks diposisikan di kanvas relatif ke atas, garis dasar dan bawah:
var font = '36pt Times';
var message = 'Big Text';
ctx.fillStyle = 'black';
ctx.textAlign = 'left';
ctx.textBaseline = 'top'; // important!
ctx.font = font;
ctx.fillText(message, x, y);
// Canvas can tell us the width
var w = ctx.measureText(message).width;
// New function gets the other info we need
var h = getTextHeight(font);
testLine(ctx, x, y, w, 'red');
testLine(ctx, x, y + h.ascent, w, 'green');
testLine(ctx, x, y + h.height, w, 'blue');