আপডেট - এই কাজের উদাহরণের জন্য, আমি ক্যারোটার সম্পাদকটিতে এই কৌশলটি ব্যবহার করেছি ।
Ellisbben এর উত্তর থেকে অনুসরণ করে এখানে বেসলাইন, অর্থাত্ হিসাবে একই থেকে চড়াই এবং বংশদ্ভুত পেতে একটি বর্ধিত সংস্করণ tmAscent
এবং tmDescent
Win32 এর দ্বারা ফিরে GetTextMetric API- টি। আপনি যদি বিভিন্ন ফন্ট / আকারের স্প্যানগুলির সাথে একটি শব্দ-মোড়ানো পাঠ্য করতে চান তবে এটি প্রয়োজন needed
উপরের চিত্রটি সাফারিতে একটি ক্যানভাসে তৈরি হয়েছিল, লালটি শীর্ষ লাইন যেখানে ক্যানভাসটি পাঠ্যটি আঁকতে বলা হয়েছিল, সবুজটি বেসলাইন এবং নীলের নীচে নীল (তাই লাল থেকে নীল পুরো উচ্চতা)।
সংযুক্তি জন্য 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');