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 tmAscent
dan tmDescent
dikembalikan 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-block
sehingga saya dapat mengatur vertical-align
gayanya, dan kemudian mencari tahu di mana browser telah meletakkannya.
Jadi, Anda mendapatkan kembali objek dengan ascent
, descent
dan height
(yang hanya ascent
+ descent
untuk 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');