网页上的字体本质上是基于矢量的图形。 这就是为什么您可以以 12px 或 120px 显示它们,并且它们仍然清晰且边缘相对锐利。 矢量意味着它们的形状由点和数学来描述形状,而不是实际的像素数据。 由于它们是矢量,因此如果我们能够执行其他矢量程序(例如 Adobe Illustrator)可以对矢量文本执行的操作,例如在各个字符周围绘制描边,那将是有意义的。 没错,我们可以做到! 例子
h1 {
/* Prefix required. Even Firefox only supports the -webkit- prefix */
-webkit-text-stroke-width: 1px;
-webkit-text-stroke-color: black;
}
或简写
h1 {
-webkit-text-stroke: 1px black;
}
您可能在想“酷,但如果只有某些浏览器支持它,如果我将文本颜色设置为white
,而我的背景为white
,则描边在支持的浏览器中看起来很酷,但在不支持的浏览器中完全消失!”
一种可能性是这个
h1 {
color: black;
-webkit-text-fill-color: white; /* Will override color (regardless of order) */
-webkit-text-stroke-width: 1px;
-webkit-text-stroke-color: black;
}
此处显示使用 Nate Piekos 的 @font-face 字体 Anime Ace 2


另一种可能性是仅在支持时应用
@supports (-webkit-text-stroke: 1px black) {
h1 {
-webkit-text-stroke: 1px black;
-webkit-text-fill-color: white;
}
}
支持
此浏览器支持数据来自 Caniuse,其中包含更多详细信息。 数字表示浏览器在该版本及更高版本中支持该功能。
桌面
Chrome | Firefox | IE | Edge | Safari |
---|---|---|---|---|
4* | 49* | 否 | 15* | 3.1* |
手机/平板电脑
Android Chrome | Android Firefox | Android | iOS Safari |
---|---|---|---|
127* | 127* | 2.1* | 4.0-4.1* |
模拟
我们可以更进一步,不再完全依赖 WebKit 专有功能。 我们可以使用 text-shadow
属性(在 Firefox、Opera 和 IE 10 中也受支持)并模拟描边。 我们将使用四个阴影,每个阴影偏移 1px 的黑色,没有扩展,分别位于右上、左上、左下和右下。 我们将删除 WebKit 专有 -webkit-text-fill-color 以支持 color,因为我们现在是跨浏览器兼容的。 唯一例外的是 IE9 及更低版本,当然您可以使用 IE 特定的样式表来解决。
h1 {
color: white;
text-shadow:
-1px -1px 0 #000,
1px -1px 0 #000,
-1px 1px 0 #000,
1px 1px 0 #000;
}

组合
同时使用描边和阴影可以产生很好的效果。 让我们添加一个 WebKit 描边、全方位 text-shadow 描边以及更深的 text-shadow 描边。
h1 {
-webkit-text-stroke: 1px black;
color: white;
text-shadow:
3px 3px 0 #000,
-1px -1px 0 #000,
1px -1px 0 #000,
-1px 1px 0 #000,
1px 1px 0 #000;
}

演示
对齐
如果您熟悉 Adobe Illustrator,您可能知道您可以将描边对齐到形状的内部、外部或居中。 该选项在调色板中看起来像这样

出于我不知情的原因,Illustrator 中的文本也只能设置为居中描边对齐。 但是,一旦您将文本扩展为常规矢量路径,所有三个选项都将可用。 Sam Frysteen 的提醒:在外观面板中添加新的描边,并将其移动到文本下方(基本上模拟外部描边对齐)。

对我来说,只有外部文本描边对齐看起来不错。 不幸的是,对于 CSS 和 Illustrator 来说,不可更改的默认值是居中。 解决方法只是不要对描边边框的粗细过于疯狂,事情应该会好起来。 注意:仅 text-shadow 的解决方案没有这个问题,但也不能描边超过 1px。
如果您使用伪元素,您可以描边原始文本后面的相同文本,并 有点伪造外部描边。
我们有一篇关于此对齐问题的完整文章: 文本描边:与你一起陷入困境。 一个小小的好消息是,paint-order
属性允许您基本上拥有外部设置的描边,一旦更多浏览器支持它。
我们无法做的事情
基于矢量的图形程序可以使用文本执行其他操作。 您可以水平压缩字母/垂直拉伸字母。 这种类型的文本处理几乎普遍不被认可,因此我们无法做到这一点,也没有什么损失。 您还可以将类型设置为不规则线(例如圆形)。 当然,用网页文本执行此操作会很酷。 也许我们可以设置文本以遵循其父元素的边框路径。
p.circular {
width: 200px;
height: 200px;
border-radius: 100px;
/* NOT REAL */
text-align: border-path;
}
在 Illustrator 中,我们还可以告诉描边如何处理尖角:圆角、斜角或斜接。 这些可以产生很好的效果,在网络上是不可能的。 但是,WebKit 处理角的方式在其默认设置(无论是什么)下都非常好,并且可以说比 Illustrator 中的任何选项都更好。
花哨
为记录在案,您可以对描边的颜色使用任何类型的颜色值(十六进制、rgba、hsla、关键字)。 这意味着如果您想要透明描边,它们确实会“堆叠”,因为如果描边相互重叠(常见),它们会更暗。
就关键帧动画而言,描边颜色会发生动画,但描边宽度不会(很奇怪)。
/* Only the color will change, not the width */
@keyframes colorchange {
0% {
-webkit-text-stroke: 10px red;
}
100% {
-webkit-text-stroke: 20px green;
}
}
更多信息
text-stroke
(CSS-Tricks 年鉴)- 文本描边:与你一起陷入困境(Chris Coyier)
- CSS 文本阴影(Chris Coyier)
- 优雅的文本阴影(Chris Coyier)
- 使用 CSS 文本阴影的酷炫悬停效果(Temani Afif)
- 如何使用 CSS 创建霓虹灯文本(Silvia O’Dwyer)
- CSS
text-shadow
属性(Alligator.io)
不错!
谢谢!
实际上,我认为“仅粗文本阴影问题”非常酷。
嗨,Chris,
感谢您的提及以及另一篇鼓舞人心的文章。
干杯,Sam
那个“组合”太棒了,谢谢!
感谢您提供此信息,Chris。 我很想做更多这样的事情。
以下是一个仅使用 text-shadow 技巧结合细微的 em 度量在任何字体上创建非常好的效果的示例
http://blog.pressedweb.com/demos/css_text_stroke/
—— Cory Simmons
非常棒,Cory
太棒了!不过我可能不会经常使用它,我认为网站在所有浏览器中的外观不应完全相同,但这已经是我能接受的极限了。是否使用描边在视觉上差异很大……尽管如此,知道有这种方法也很酷!
它实际上在所有主流浏览器上看起来都一样,完全忽略了IE。所以你可以获得跨浏览器兼容性的渐进增强,同时狠狠地打了IE一个耳光。
感谢 Chris……太棒了!!!
感谢 Chris,我真的很喜欢 Firefox 中的回退效果。
这个想法非常非常棒,并且有很大的潜力用于日常使用。祝贺所有做出贡献的人!
非常感谢。我不知道可以有多个描边。(罗杰斯 1;法弗 0)
超级碗冠军戒指:法弗 1,罗杰斯 0;
最有价值球员:法弗 3,罗杰斯 0;
连续首发:法弗 300;罗杰斯 18;
法弗输给了去年的超级碗冠军;罗杰斯勉强战胜了一支糟糕的队伍。
小心点;)
任何人对法弗可能有的信任度:0%
从法弗那里收回的男子汉卡数量:1
很棒的效果。感谢分享。
如果你通过添加四个阴影进一步使用文本阴影方法,实际上可以更接近一些。边缘仍然有点平,但几乎完美。
文本阴影属性真的不应该不可用;我们可以用一个阴影声明来解决这个问题。
我稍微琢磨了一下,并使用过滤器拼凑出了某种 Internet Explorer 解决方案。我确实对整个事情感到有点不爽,而且我不能说它看起来非常好,但它相当实用。像往常一样,这是一篇很棒的文章,Chris。读完你的文章后,我总是受到启发去突破界限。
http://jsfiddle.net/kovalchik/yJff9/
所以我采用了仅存在于粗文本阴影中的问题,并从图标艺术家的角度进行了观察。所以基本上使用文本阴影描绘半径为 X 的黑白圆圈的轮廓,然后使用 rgba 将阴影混合在一起,以获得类似于通过抗锯齿平滑的圆圈。
这可能会让浏览器承受很大的压力,而且 rgba alpha 并没有多大帮助,但效果更好。
只需调整 alpha 以适合您的字体即可。尖锐字体 = 几乎完全不透明的阴影,而且不太平滑。
http://jsfiddle.net/r4EAG/
感谢 Chris 发布了这篇文章!
我认为你忘记提到,如果页面周围有边框(无论在哪里),如果周围没有文本阴影,Chrome 中的 -webkit-text-stroke 将奇怪地不起作用。不过它仍然可以在 Safari 中工作。
感谢你的精彩文章,但我认为至少在现代浏览器支持它之后我们才能使用它。
出色的效果,谢谢!
但是 Firefox 呢?
我尝试使用 Firefox 4 Beta 5 观看演示,但浏览器失败了……
出色的效果,而且实现起来代码不多,谢谢!
非常棒
看起来像漫画/素描字体
嘿,Chris,很棒的文章。能够像这样在网络上自定义真实的文本真是太棒了——CSS3 的强大功能再次闪耀。能够添加可以缩放至任何尺寸的描边,以及能够自定义描边位置都是额外的优势!感谢分享。
关于 text-stroke 的一些非常好的内容!
当前的 CSS3 文本模块中已经有一个 text-outline 属性,尽管它有被删除的风险。
http://www.w3.org/TR/css3-text/
就我个人而言,我认为“outline”(轮廓)比“stroke”(描边)更合理,除非描边得到了增强,允许你指定内描边或外描边。如果是这种情况,将其应用于块级元素也很酷。
非常有益且有帮助。非常感谢。
大约 5 年前,我经历过一个非常喜欢“描边”文本的阶段。我在汽车行业工作,这种风格非常适合他们的需求(参见赛车队徽标设计)。如果当时有这个功能就好了——即使没有广泛的支持。
感谢你的文章。它们总是让我思考对我自己和其他 CSS 开发人员开放的其他可能性。
我通常使用 text-shadow 和 -moz-text-shadow,但新的 CSS3 潜力令人惊叹,请查看 -webkit-transition-duration: amd-webkit-transition-timing-function,我们将其用于我们网站上的链接淡出效果!
感谢分享,Chris!!!
这对我来说是全新的东西
从未想过 CSS 能够做到这样的事情
感谢分享,Chris!
非常感谢!你救了我!
但在 IE 中不起作用。我该怎么办?
IE ??????
常见的浏览器有:Chrome、Firefox、Safari 和 Opera。
此代码在 Chrome、Firefox、Safari 和 Opera 上运行。
IE 不重要!
我正在上平面设计课,老师说文本描边在平面设计行业是被禁止的。这是真的吗?或者至少是普遍的?他们说这会使文本难以阅读。如果处理不当,我可以看到这一点,但它似乎是使文本在某些背景下易于阅读的好方法。你怎么看?
注意 iPad 上 Safari 的高清渲染。描边的技巧在低分辨率浏览器上有效,但在高分辨率浏览器上会被发现,并产生不舒适的视觉效果。
如果我没记错的话,我 90 年代阅读 Adobe 的 PostScript 时,字体不能只有外描边的原因是 (a) 因为只有 PostScript 字体包含路径方向的信息,你可以使用它来拥有重叠的路径,即使没有在交点处生成孔,以及 (b) 因为操作系统是在应用程序中管理字体的(出于速度考虑),这也是为什么直到最近你才能“查看”描边图案和其他 PostScript 效果的原因。
此外,在 Illustrator 中,如果你添加填充并将其置于“字符”之后,你仍然需要填充颜色来覆盖描边的内部部分。
正确的方法是添加新的描边并对其应用“偏移路径”滤镜。这样你就可以使透明填充文本以你想要的偏移量和宽度进行描边。
过去还有另一种方法,使用“轮廓”滤镜,它允许你添加任意数量的洋葱轮廓,但我找不到它,或者它在 AI CC 中坏了 :(
尝试在使用文本描边时将字体大小增加到超大尺寸(示例中为 258px)。那里发生了什么!