अद्यतन - इस काम के एक उदाहरण के लिए, मैंने इस तकनीक का उपयोग करोटा संपादक में किया ।
एलिस्बेन के उत्तर के बाद, यहां बेसलाइन से चढ़ाई और वंश प्राप्त करने के लिए एक उन्नत संस्करण है, अर्थात Win32 के गेटटेक्मेट्रिक एपीआई द्वारा उसी के रूप में tmAscentऔर tmDescentवापस लौटाया गया है। यह आवश्यक है यदि आप पाठ के शब्द-लिपटे रन को विभिन्न फोंट / आकारों में स्पैन के साथ करना चाहते हैं।

उपरोक्त छवि सफारी में एक कैनवास पर उत्पन्न हुई थी, शीर्ष रेखा के लाल होने के कारण जहां कैनवास को पाठ को खींचने के लिए कहा गया था, हरे रंग की आधार रेखा और नीली जा रही है (इसलिए लाल से नीला पूरी ऊंचाई है)।
सक्सेसनेस के लिए jQuery का उपयोग करना:
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;
};
एक टेक्स्ट एलिमेंट के अलावा, मैं एक डिव जोड़ता हूं display: inline-blockताकि मैं इसकी vertical-alignशैली सेट कर सकूं और फिर यह पता लगा सकूं कि ब्राउजर ने इसे कहां रखा है।
तो आपको एक वस्तु वापस मिलती है ascent, descentऔर height(जो सुविधा के लिए सिर्फ ascent+ descentहै)। इसका परीक्षण करने के लिए, यह एक फ़ंक्शन है जो एक क्षैतिज रेखा खींचता है:
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();
};
फिर आप देख सकते हैं कि टेक्स्ट को शीर्ष, बेसलाइन और बॉटम के सापेक्ष कैनवास पर कैसे स्थित किया गया है:
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');