使用javascript计算字母大小
我需要计算javascript中字母的确切大小。该字母可以具有不同的字体大小或字体家族属性等。使用javascript计算字母大小
我试图使用div元素为此,但此方法只给出div的大小,而不是字母。
<div style="display: inline; background-color: yellow; font-size: 53px; line-height:32px">A</div>
有没有人知道如何解决这个问题?
这对于一般情况基本上是不可能的。字体字距会根据操作系统,浏览器等等导致字母变化的“宽度”,并根据哪些字母彼此相邻。如果os +浏览器没有您指定的字体,则可能会发生字体替换。
也许重新提出这个问题时,您所拍摄的更高级别的目标可能会导致您的问题提出其他方法,可能会更富有成效?
这就是为什么我需要在应用所有样式后进行计算。取决于系统如何“绘制”,我想知道尺寸。 – Max 2012-03-12 14:10:43
@ Irongaze.com是正确的,你的字体,根据条件,将有不同的实际大小。
如果你想校准一个特定的字母,我相信element.getBoundingClientRect()会给你有用的坐标。确保完全重置您用作控制箱的容器。注意在不同的系统上你可能会得到不同的结果。
请注意,这不会给你的信的实际可见部分的大小,但它决定了容器的大小。例如,line-height
不会更改实际的字母大小,但会影响其他字母的位置。请注意这一点。
如果您描述您正在尝试解决的问题,它将有助于我们。可能有更好的解决方案。
我不能使用行高,因为我不知道它的价值。字体大小可以随时更改,并取决于系统。 – Max 2012-02-21 12:26:30
@Max,建议使用element.getBoundingClientRect()。行高是一个反例,它将无法给出准确的结果。 – 2012-02-21 15:42:44
正如其他人所说,这是不可能直接衡量的。但是你可以以更迂回的方式得到它:将字母绘制到画布上,并确定填充哪些像素。
这是demo that does this。肉是这样的功能:
/**
* Draws a letter in the given font to an off-screen canvas and returns its
* size as a {w, h, descenderH} object.
* Results are cached.
*/
function measureLetter(letter, fontStyle) {
var cacheKey = letter + ' ' + fontStyle;
var cache = measureLetter.cache;
if (!cache) {
measureLetter.cache = cache = {};
}
var v = cache[cacheKey];
if (v) return v;
// Create a reasonably large off-screen <canvas>
var cnv = document.createElement('canvas');
cnv.width = '200';
cnv.height = '200';
// Draw the letter
var ctx = cnv.getContext('2d');
ctx.fillStyle = 'black';
ctx.font = fontStyle;
ctx.fillText(letter, 0.5, 100.5);
// See which pixels have been filled
var px = ctx.getImageData(0, 0, 200, 200).data;
var minX = 200, minY = 200, maxX = 0, maxY = 0;
var nonZero = 0;
for (var x = 0; x < 200; x++) {
for (var y = 0; y < 200; y++) {
var i = 4 * (x + 200 * y);
var c = px[i] + px[i + 1] + px[i + 2] + px[i + 3];
if (c === 0) continue;
nonZero++;
minX = Math.min(x, minX);
minY = Math.min(y, minY);
maxX = Math.max(x, maxX);
maxY = Math.max(y, maxY);
}
}
var o = {w: maxX - minX, h: maxY - minY, descenderH: maxY - 100};
cache[cacheKey] = o;
return o;
}
请注意,这对抗锯齿敏感 - 结果可能会被像素关闭。
它也非常慢。不要使用这种技术,除非你缓存结果,并且只在页面上做几次......但非常酷。 :-) – 2015-01-22 23:49:01
该解决方案已经包含一个缓存,所以缓存结果自己将是毫无意义的。 – danvk 2015-01-23 16:30:03
在您的示例中,您将字体大小设置为53pts。为什么它会在屏幕上不同? – 2012-02-10 13:22:07
@Larry K,并非所有字体都是等宽字体。字母“i”将决定与字母“w”不同的边界矩形,这取决于字体系列,类型,字距等因素。 – 2012-02-10 13:54:48
你想解决什么问题? – egrunin 2012-02-10 17:23:16