这个HTML/CSS在Firefox和Chrome中的呈现方式不同-text-decoration
和text-shadow
的分层交换了。
.foo {
font-size:2em;
text-decoration:underline LightBlue 1ex;
text-decoration-skip-ink:none;
text-underline-offset:-1ex;
text-shadow: 1px 1px 3px HotPink;
}
个字符
以下是截图:
Firefox
x1c 0d1x的数据
Chrome
的
这是怎么回事?一个浏览器是否正确地实现了标准?CSS是否可以在不检测浏览器和样式的情况下编写以确保一致性?
3条答案
按热度按时间zdwk9cvp1#
从文本装饰级别3规范:
阴影必须绘制在元素的边框和/或背景(如果存在)与元素文本和文本装饰之间的堆栈级别。
也就是说,文本阴影必须在下划线之前绘制,因此下划线将覆盖文本阴影。所以Firefox的渲染是正确的。
这被记录为Chromium Bug Issue 713376: Text shadow should paint behind all text decorations and text.
fv2wmkja2#
问题的核心在于每个浏览器如何分层
text-decoration
(比如下划线)和text-shadow
。在你的例子中,Firefox将文本装饰放在阴影的顶部,而Chrome则相反。这并不一定是一个浏览器“错”而另一个“对”的情况。(一般来说,但在这个特定的情况下,这似乎是一个实际的bug in Chrome),而是反映了这样一个事实,即CSS规范可能会留下解释的空间,或者某些方面可能没有明确定义,导致执行上的差异。为了确保跨浏览器的一致性,而不求助于浏览器检测和条件样式(由于维护问题和浏览器更新的不断变化的性质,通常不建议使用),您可以尝试其他方法:
1.叠加技术:使用额外的元素或伪元素(
::before
或::after
)手动创建下划线效果,这样可以更好地控制分层。1.基于JavaScript的解决方案:使用JavaScript检测渲染并相应地应用样式。但这可能会很复杂,可能不值得为纯粹的外观问题付出努力。
1.简化:重新设计以避免这种差异。这可能涉及删除
text-shadow
或text-decoration
以在浏览器中保持一致的外观。下面是第一种方法的示例实现,它在两种浏览器上都是一致的:
个字符
aiazj4mn3#
使用背景而不是文本装饰
个字符