【问题标题】:Making Firefox render canvas text the same as CSS text使 Firefox 渲染画布文本与 CSS 文本相同
【发布时间】:2011-02-15 08:11:28
【问题描述】:

我一直在尝试使用画布标签和 Javascript。我制作了一个页面,该页面从 Twitter 公共时间线获取推文并将它们动画化。它通过在动画背景中使用画布元素来工作。动画完成后,它会创建一个顶部带有相同文本的 div 元素。我这样做是为了让推文文本是可选择的并且链接是可点击的。

现在,在 Safari、Chrome 甚至 Opera 中,画布文本和 div 文本看起来几乎完全相同。然而在 Firefox 中,文本的大小不同,足以使其在变为 div 的位置“跳跃”。

有谁知道如何让 Firefox 使用 CSS 在画布元素和 div 上呈现相同的文本?或者这是与引擎的渲染不一致。

如果你想知道我的意思,我已经把页面on my website

现在是代码:

我用于呈现 div 的 CSS 包含:

line-height: 21px; font-weight: 100; font-family: Georgia, "New Century Schoolbook", "Nimbus Roman No9 L", serif; font-size: 20px;

在我正在使用的画布上渲染:

this.context.font = this.scale + 'px Georgia';
this.context.fillStyle = "white";
this.context.strokeStyle = 'white';
this.context.fillText(this.text, 0, 0);
this.context.strokeText(this.text, 0, 0);

其中 this.scale 是一个动画比例因子,精确到 20 像素。因此,回顾一下,我使用相同的字体并以相同的 px 大小结束,但 Firefox 在 Canvas 和 CSS 之间呈现不同的文本。

(编辑)这是一个截图示例: alt text http://danforys.com/temp/firefox-behaviour.png

第一行是使用画布动画的文本,第二行是生成的 div。

【问题讨论】:

  • 嗯,仔细看截图,可能是空格。字母看起来大小相似,但 CSS div 上的空格看起来稍宽。

标签: javascript css canvas


【解决方案1】:

我看不出 Firefox 和 Chrome 之间有那么大的区别(除了速度...)。

你试过不使用strokeText吗?我认为文本通常只使用 fill-操作呈现。

很酷的应用程序,顺便说一句!

【讨论】:

  • 谢谢马丁!是的,我尝试过使用和不使用strokeText。没有,文本看起来更薄,看起来与所有三个浏览器中的 div 非常不同。似乎 CSS 文本既是描边又是填充的,或者具有与之相当的权重。还要注意 CSS 中的字体粗细,将其更改为小于“粗体”的值似乎也没有任何区别。它只是在那里,因为我正在试验。
  • 如果您仔细观察文本开始向上动画的点,字符大小会跳跃。如果您查看行右侧带有字符的长推文,则在 Firefox 中尤其明显。累积起来,行长有相当大的跳跃。至少在 OSX 上的 FF 3.6.3 上有。
  • 有趣的是,Chrome 版本之间的渲染似乎也有所不同。在家里(在 OSX 雪豹上的 Chrome [我稍后会检查版本],描边的 填充的文本看起来与 div 相同。在工作中,在 Leopard Chrome 5.0.342.9 beta 上,描边和填充文本比 div 胖得多。我想我需要对此进行更多调查......
  • 我在家使用的是 5.0.375.29 beta Chrome。我认为我需要对浏览器/版本与屏幕截图进行 PPK 样式比较。
  • 在 Windows 中禁用 FF3.6.3 中的 strokeText 会导致画布文本看起来与 CSS 文本相同。我想知道这是否是操作系统字体支持而不是 Firefox 的问题?
【解决方案2】:

对,我有一个test case

我用相同的文本并排创建了一个 div 和 canvas 元素。原来,字体渲染是一个红鲱鱼。与 Firefox 不同的是字符宽度的报告。我的 Twitter 可视化工具使用 measureText().width 计算每个字符的宽度并相应地放置它们。由于某种原因,Firefox 上的字符宽度变小了。

奇怪的是,在测试用例中我测量了两件事:

  1. 整个文本的总宽度
  2. 文本中每个字符的宽度之和

在 Chrome 中,它们都以 399 像素出现。在 Firefox 中,第一个为 393px,第二个为 367px。

编辑: 该错误已被关闭。 Mozilla 说it's invalid,我还是说和其他浏览器不一致。我必须找到另一种方法来做到这一点,或者找到足够的信息来说服 Mozilla 这毕竟是一个错误。无论如何感谢您的收听!

【讨论】:

  • 好吧,我只能猜测这是一个 Firefox Javascript 错误。已举报:bugzilla.mozilla.org/show_bug.cgi?id=563758
  • 我不能在FF3.6中复制这个,所以这是最近的改动?你有没有玩过字母间距,看看你能不能让这些排列起来?这对我来说似乎有所不同。
  • 另外,如果操作系统功能尊重例如紧缩参数,文本的总宽度可能不同于单个字符宽度的总和。如果您使用支持它的字体,您甚至可能会为某些无法使用您的方法模拟的字符组合获得连字(即特殊字符)。
  • 是的,我认为我的方法是错误的,但恰好在 Webkit 和 Opera 中工作。我不应该计算每个单独字符的宽度,而是应该计算整个字符串的宽度,直到当前字符,这允许进行字距调整等。我现在已经更新了我的网页,以便它使用这种方法;现在它似乎在 Firefox 上运行良好。 (我昨天做了更新,这可能是 ndp 无法重现它的原因)感谢您的输入 :)
猜你喜欢
  • 2020-07-30
  • 2023-03-20
  • 1970-01-01
  • 2012-11-16
  • 2016-02-03
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多