context2d.strokeText()描述FF3.6 / 4下的路径

时间:2011-01-14 10:16:23

标签: firefox html5 canvas

我在FF(3.6和4beta4)下使用strokeText面临一个奇怪的效果,我在Chrome或Safari下无法重现。 如果我绘制一个填充的路径形状(但不是描边),然后是描边文本,则在调用strokeText()时会触发路径。

这是我的代码:

            var el = document.getElementById('canvas'),
            ctx = el.getContext('2d');

        ctx.save();
        // draw Rect
        ctx.beginPath();
        ctx.moveTo(100, 100);
        ctx.lineTo(200, 100);
        ctx.lineTo(200, 200);
        ctx.lineTo(100, 200);
        ctx.lineTo(100, 100);
        ctx.closePath();
        ctx.fillStyle = 'red';
        ctx.fill();

                    // draw Text
        ctx.save();         
        ctx.textAlign = 'start';
        ctx.fillStyle = "rgba(0,0,0,0.0)";
        ctx.strokeStyle = "blue";
        ctx.lineWidth = 2;
        ctx.font = "bold 35pt sans-serif";
        ctx.strokeText("Hello World !", 100, 280);  

        ctx.restore();

如果你运行它,那么矩形是蓝色的,而不是。

你看到这段代码有问题,还是FF中的错误?

谢谢!

2 个答案:

答案 0 :(得分:1)

它已在Firefox 4 beta 8中修复。(刚刚测试过......)。 我认为相关的错误是:https://bugzilla.mozilla.org/show_bug.cgi?id=499628

答案 1 :(得分:0)

以这种方式绘制矩形怎么样?

var el = document.getElementById('canvas'),
ctx = el.getContext('2d');

ctx.save();
// draw Rect
ctx.fillStyle = 'red';
ctx.fillRect  (100, 100, 100, 100); // <===
// draw Text
ctx.save();         
ctx.textAlign = 'start';
ctx.fillStyle = "rgba(0,0,0,0.0)";
ctx.strokeStyle = "blue";
ctx.lineWidth = 2;
ctx.font = "bold 35pt sans-serif";
ctx.strokeText("Hello World !", 100, 280);  

ctx.restore();
关于strokeText问题的

编辑,似乎如果你在绘制之前绘制文本并填充路径修复它

var el = document.getElementById('canvas'),
ctx = el.getContext('2d');

// draw Text -> at first
ctx.save();         
ctx.textAlign = 'start';
ctx.fillStyle = "rgba(0,0,0,0.0)";
ctx.strokeStyle = "blue";
ctx.lineWidth = 2;
ctx.font = "bold 35pt sans-serif";
ctx.strokeText("Hello World !", 100, 280);

ctx.save();
// draw Rect
ctx.beginPath();
ctx.moveTo(100, 100);
ctx.lineTo(200, 100);
ctx.lineTo(200, 200);
ctx.lineTo(100, 200);
ctx.lineTo(100, 100);
ctx.closePath();
ctx.fillStyle = 'red';
ctx.fill();

ctx.restore();