有一种非标准的方式可以描边 HTML 文本(SVG 有一种标准的方式)。 它并不是特别新。 它有 -webkit-
和 -moz-
前缀。 Jen Simmons 最近 发布了关于它,并提供了一个示例。
span {
-moz-text-fill-color: #fde;
-webkit-text-fill-color: #fde;
-moz-text-stroke-color: #666;
-webkit-text-stroke-color: #666;
-moz-text-stroke-width: 2px;
-webkit-text-stroke-width: 2px;
}
她说得对。
此 CSS 尚未完全完善或完全受支持。 但它足够好,可以用于今天,尤其是因为它只是提供了一种视觉增强效果。 对于使网站可用性至关重要。
我可能只会补充一点,如果您要执行类似在白色文本周围添加描边的操作,则可以将其包装在 @supports
中以确保它没问题(以防存在支持 text-fill-color 但不支持 text-stroke-color 的浏览器)
@supports
((-webkit-text-stroke-color: #666)
and
(-webkit-text-fill-color: white))
or
((-moz-text-stroke-color: #666)
and
(-moz-text-fill-color: white)) {
span {
-moz-text-fill-color: white;
-webkit-text-fill-color: white;
-moz-text-stroke-color: #666;
-webkit-text-stroke-color: #666;
-moz-text-stroke-width: 2px;
-webkit-text-stroke-width: 2px;
}
}
查看 Chris Coyier 在 CodePen 上的笔 文本描边实际效果。 (@chriscoyier)
它破坏了大多数字体
这就是让我感到困扰的事情。 当您设置一个跨越字符设计边缘的描边时,您会失去形状的完整性。

这就是 CSS 中 text-stroke 的问题所在:您别无选择。 它只能进行居中对齐的描边。 从理论上讲,其他任何一个选项都更有用。 这不是什么大问题。 文本越大,字符越粗壮,越容易摆脱困境。
设置在后面技巧
如果您想模拟外部对齐的描边,James Nowland 展示了如何将伪元素文本设置在原始文本后面,并仍然使用 text-stroke。
查看 James Nowland 在 CodePen 上的笔 CSS3 描边和渐变文本。 (@jnowland)
更新!`paint-order` 有帮助
在我撰写此更新(2018 年 2 月)时,Tobi Reif 告诉我 Firefox Nightly 现在有一个名为 paint-order
的 CSS 属性,它可以帮助控制绘制在什么之上的顺序,描边或填充(或“标记”,我承认我不知道是什么)。
.stroke-behind {
-webkit-text-stroke: 5px red;
paint-order: stroke fill;
}

这并不能帮助我们真正设置外部描边,但它可以很好地伪造它。 没有关于内部设置描边的消息。
也许这有点天真,但为什么在有 color 的情况下使用 text-fill-color 呢?
结合使用 color 和 text-stroke-color 不更实用吗?
我认为 text-fill-color 的意义在于它是 color 的覆盖,用于与其他属性结合使用。 例如,您可以像这样使用它
不过,我认为它有点过时了。 现在 @supports 存在,我无法想象浏览器会再次创建这样的覆盖属性。
感谢 Chris Coyer 的反馈。
这超级棒,但我认为我很难让客户在一个项目中支持这一点。 您对如何向客户介绍这种级别的浏览器支持以及他们为什么要尝试它有什么想法?
很高兴知道他们正在寻找添加
text-stroke
。现在我在少数情况下使用多个
text-shadow
(很多)来获得类似的效果(而且效果显然不太好)。我将使用
@supports
删除text-shadow
的错误描边,并用带前缀的text-stroke
属性替换它。我还希望
text-shadow
具有 spread-radius 值,就像box-shadow
一样。这太酷了。 在过去的几天里,我一直都在想,“为什么他们没有“text-outline”功能或类似的东西?” 但现在我想他们显然有了! 这太棒了。
我一直都在等待这个!
我讨厌冗余的硬编码数据。 我知道我们中的许多人已经知道我接下来要说什么,但没有提到,所以我认为我会为那些没有想到这一点的人说些什么。 如果不需要另一个伪元素用于任何其他用途,则可以从“.Winning-text”内部的文本节点中删除“100”,并重新使用 attr() 函数将“100”注入到::before 伪元素中。 将需要重新组织一些样式,但我认为这稍微好一点。 在岔路口向右转:http://codepen.io/trenda/pen/jBMwrL?editors=1100
这是一个非常有效的观点,但它确实取决于您尝试显示的数据在语义上是否重要。
为什么不只是在文本上设置一个非模糊的 box-shadow 呢?
Text shadow 没有 box-shadow 那样用于使其不模糊的第四个 spread 参数。 您可以使用第三个参数使 text-shadow 不模糊,但随后您将看不到它,因为它完全位于文本后面。 为了看到它,您必须将其偏移,但随后它不是描边,而是悬挂在一侧(就像阴影一样)。
我的愿望已发送给 CSS 工作组
https://github.com/w3c/fxtf-drafts/issues/117