21

我正在使用 Raphael js 绘制带圆圈的数字。问题是每个数字都有不同的宽度/高度,因此使用一组坐标来使文本居中是行不通的。IE、FF 和 safari 之间的文本显示不同。有没有一种动态的方法来找到数字的高度/宽度并相应地居中?

这是我的测试页面:

http://jesserosenfield.com/fluid/test.html

和我的代码:

function drawcircle(div, text) { 
    var paper = Raphael(div, 26, 26); //<<
    var circle = paper.circle(13, 13, 10.5);
    circle.attr("stroke", "#f1f1f1");
    circle.attr("stroke-width", 2);
    var text = paper.text(12, 13, text); //<<
    text.attr({'font-size': 15, 'font-family': 'FranklinGothicFSCondensed-1, FranklinGothicFSCondensed-2'});
    text.attr("fill", "#f1f1f1");
}

window.onload = function () {
    drawcircle("c1", "1");
    drawcircle("c2", "2");
    drawcircle("c3", "3");
};

非常感谢!

4

4 回答 4

32

(答案重写):Raphael.js 默认水平和垂直居中文本节点。

这里的“居中”意味着 paper.text() 方法的 x、y 参数需要文本边界框的中心。

因此,只需指定与圆相同的 x、y 值即可产生所需的结果:

var circle = paper.circle(13, 13, 10.5);
var text = paper.text(13, 13, "10");

示例输出

( jsFiddle )

相关源代码:

于 2011-03-17T14:51:42.943 回答
9

也许是这样:

var paper = Raphael(div, 26, 26); //<<
var circle = paper.circle(13, 13, 10.5);
circle.attr("stroke", "#f1f1f1");
circle.attr("stroke-width", 2);
var text = paper.text(0, 0, text); //<<
text.attr({'font-size': 15, 'font-family': 'FranklinGothicFSCondensed-1, FranklinGothicFSCondensed-2'});
text.attr("fill", "#f1f1f1");
text.translate((35 - text.getBBox().width)/2, (45 - text.getBBox().height)/2);
于 2010-04-03T21:42:49.523 回答
3

Use this attribute: 'text-anchor':'start':

paper.text( x, y, text ).attr( {'text-anchor':'start'} );
于 2011-06-14T23:49:40.097 回答
0

Rotating Text Exactly示例(在页面的右侧列中列出,或在 github 中列出)讨论了将文本放置在精确位置,以及像往常一样在 IE 中进行操作所需的额外步骤。

它确实找到了文本的边界框;我想按照 Jan 的建议将文本移动一半边界框是很简单的。

于 2010-12-09T23:11:18.657 回答