【问题标题】:css first letter glitch in FirefoxFirefox中的css首字母故障
【发布时间】:2017-05-16 10:58:51
【问题描述】:

我在 Firefox 中遇到了一个 CSS 故障,该故障在 IE 和 Chrome 中运行良好。 下面的示例显示了多个a 标签,它们都应该是尽可能小的尺寸,并且带有.first-capitalizeda 标签的第一个字母应该大写。但是使用伪选择器::first-letter 进行更改会破坏这种行为。是否有一个 css hack,所以它的行为就像在 Chrome 和 IE 中一样?

(如果您停用并响应.first-capitalized 选择器集中的font-size 规则,您可以在Firefox 中显示正确的表示。)

a{
  font-size: 14pt;
  display: inline-block;
}
.first-capitalized{
  font-size: 9pt;
}
.first-capitalized::first-letter{
  font-size: 14pt;
}
<a href="">LOREM</a>
<a href="" class="first-capitalized">IPSUM</a>
<a href="">DOLOR</a>
<a href="" class="first-capitalized">SIT</a>
<a href="">AMET</a>
<a href="" class="first-capitalized">CONSETETUR</a>
<a href="">SADIPSCING</a>
<a href="" class="first-capitalized">ELITR</a>

这些修复不可靠,大约 20 次刷新后,它们似乎失去了功能!

编辑:

我刚刚在 js 中写了一个“修复”,它的工作原理与 @LukyVi 中的修复一样

var continueFlag = true;
for (var i = 0; continueFlag && i < document.styleSheets.length; i++) {
    var sheet = document.styleSheets[i];
    for (var n = 0; continueFlag && n < sheet.cssRules.length; n++) {
        var rule = sheet.cssRules[n];
        if (rule.selectorText == '.first-capitalized') {
            var orig = rule.style['font-size'];
            rule.style['font-size'] = '0px';
            continueFlag = false
            window.requestAnimationFrame(function (rule) {
                //font size = 0px gets rendered
                window.requestAnimationFrame(function (rule) {
                    //font size = orig gets rendered
                    rule.style['font-size'] = orig;
                }.bind(this, rule))
            }.bind(this, rule)
            )
        }
    }
}

【问题讨论】:

  • 似乎带有第一个字母伪元素的元素占用的空间与整个单词的字体大小一样多。然后,当在开发人员工具中切换时,firefox 修复了这个(正如 OP 所提到的)在我看来就像一个 firefox 错误
  • @Danield 正是我所想的 :( 你对如何解决这个问题有任何想法吗?

标签: css firefox pseudo-element


【解决方案1】:

所以我为您的问题找到了一个小解决方案。 由于该问题已在页面重绘上得到解决,您只需添加一个小关键帧即可强制重绘。

这真的很hacky,但它确实有效。直到 Firefox 解决这个问题。 您还可以决定不使用 ::first-letter 伪元素,并使用更“硬编码”的东西,例如用 &lt;span&gt; 包裹标签的第一个字母。

话虽如此,我已经为您的问题寻找解决方案一段时间了,类似的 StackOverflow 帖子帮助我找到了这个解决方案(这个https://stackoverflow.com/a/7553176/1331432

a{
  font-size: 14pt;
  display: inline-block;
  animation: fix 0.00000001s;
}
.first-capitalized{
  font-size: 9pt;
  -moz-padding-end: 0;
  font-stretch: condensed;
}
.first-capitalized::first-letter{
  font-size: 14pt;
  color: red
}

@-moz-keyframes fix {
   from { padding-right: 1px; } 
   to { padding-right: 0; } 
}
<a href="">LOREM</a>
<a href="" class="first-capitalized">IPSUM</a>
<a href="">DOLOR</a>
<a href="" class="first-capitalized">SIT</a>
<a href="">AMET</a>
<a href="" class="first-capitalized">CONSETETUR</a>
<a href="">SADIPSCING</a>
<a href="" class="first-capitalized">ELITR</a>

问候,

卢卡斯。

【讨论】:

  • :D 很完美,我也有类似的想法,正在用 js 构建解决方案。但是你的好多了!非常感谢您的努力。
  • 很高兴这有帮助:) 但是所有的功劳都归于stackoverflow.com/users/885556/kizu
  • 顺便说一句。我刚刚添加了一个与您的(或 kizus)非常相似的 js 解决方案。
  • 4 年后,这仍然是个问题。
猜你喜欢
  • 1970-01-01
  • 2021-08-24
  • 2013-03-05
  • 1970-01-01
  • 1970-01-01
  • 2013-09-26
  • 1970-01-01
  • 2020-06-29
  • 1970-01-01
相关资源
最近更新 更多