GÜNCELLEME - bu çalışmanın bir örneği olarak, bu tekniği Carota editöründe kullandım .
Ellisbben'in cevabını takiben, işte temelden yükseliş ve inişi elde etmek için geliştirilmiş bir sürüm, yani Win32'nin GetTextMetric API'si ile aynı tmAscent
ve tmDescent
geri dönen . Bu, farklı yazı tiplerinde / boyutlarda yayılma alanlarına sahip sözcük kaydırmalı bir metin dizisi yapmak istiyorsanız gereklidir.
Yukarıdaki görüntü Safari'de bir tuval üzerinde oluşturuldu; kırmızı, tuvalin metni çizmesinin söylendiği en üst satır, yeşil taban çizgisi ve mavi alt çizgi (yani kırmızıdan maviye tam yüksekliktir).
Kısa ve özlük için jQuery kullanma:
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;
};
Bir metin öğesine ek olarak display: inline-block
, vertical-align
stilini ayarlayabilmek için bir div ekliyorum ve ardından tarayıcının onu nereye koyduğunu buluyorum.
Böylece ascent
, descent
ve ile bir nesneyi geri alırsınız height
(bu, kolaylık sağlamak için sadece ascent
+ 'dır descent
). Test etmek için, yatay bir çizgi çizen bir işleve sahip olmaya değer:
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();
};
Ardından, metnin tuval üzerinde üst, taban çizgisi ve alta göre nasıl konumlandırıldığını görebilirsiniz:
var font = '36pt Times';
var message = 'Big Text';
ctx.fillStyle = 'black';
ctx.textAlign = 'left';
ctx.textBaseline = 'top';
ctx.font = font;
ctx.fillText(message, x, y);
var w = ctx.measureText(message).width;
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');