我认为没有好的解决方案。
不过,我为你想出了一个不稳定的解决方案:
.test:first-letter {
font-size: 2em;
letter-spacing: -0.225em;
}
将 letter-spacing 样式添加到 Fiddle 中的 :first-letter 选择器中,您会发现块返回到大致正确的大小。
说明:
基本上,这个错误是由整个块的大小取自first-letter中指定的字体引起的。
我在这里对letter-spacing 所做的是尝试调整此字体的大小,而不影响其外观。在普通文本中以这种方式调整字母间距会导致字母在任一侧重叠 0.225 个字符宽度。
我最初希望 -0.25 的值就足够了——即每边四分之一个字符会将每个字符的宽度减少一半,这正是我们想要的,因为第一个字母是 @987654326 @,所以它是原来的两倍。
但是,计算并不像那样干净,因为字符串中的第一个和最后一个字符只会在一侧重叠,并且因为第一个字母实际上确实希望是双倍宽度,即使其他角色没有。
所有这一切意味着消除错误所需的确切 letter-spacing 值将根据文本的长度以及原始文本和第一个字母的字体大小而有所不同。这就是为什么我必须对字母间距的值进行一些试验以使其正常工作,同时也解释了为什么我无法完全适应 Fiddle 中的所有文本行。我需要为每个块设置一个稍微不同的值。
-0.225 的值似乎是我能得到的最接近的值,适用于您的所有示例,但实际上您需要对其进行调整以适合您的网站。
别忘了这是一个 Firefox 错误,因此您需要将其编写为某种特定于浏览器的 hack。并注意密切关注您链接的 Firefox 错误报告;当它确实得到修复时,您需要找到一种方法来为旧版本的用户保留您的 hack,但为已修复的用户删除它。
[编辑]
我想出的唯一其他可行的解决方案就是不使用触发错误的功能。即删除:first-letter 选择器,如果您想设置不同的样式,请使用单独的<span> 作为文本的第一个字母。
这确实是显而易见的答案,当然可以解决问题(也意味着您的样式首字母适用于旧版浏览器),但从语义角度来看并不理想,更重要的是不实际上回答了这个问题,这就是为什么我没有在我的原始答案中提供它作为解决方案。
我也一直在尝试寻找解决该错误的替代方法,但选项有限,而且我尝试过的任何方法都没有我最初的建议那样好的结果。
我尝试了使:first-letter 不可见的技巧,并使用:before 显示大写字母。但是,这对我不起作用。我没有在它上面逗留太久,所以你也许可以让它工作,但它有一个问题,你必须在 CSS 中定义前导字母,这并不理想。
另一种可能的解决方案是在:first-letter 上使用CSS font-stretch: condensed; 属性。这会将第一个字母的宽度减小回1em,从而解决其余文本的宽度问题。然而,这样做的不利方面是,首先它会使前导字母看起来被压扁,这可能不是您想要的,其次这种样式仅适用于支持 condensed 属性的字体。事实证明,标准字体不能很好地支持这一点,因此可能不适合您。
最后,原来的letter-spacing 解决方案仍然是我发现真正解决该错误的唯一方法。