CSS Gradient Text with Stroke / CSS 渐变文字和描边的若干实现方式

基础实现

渐变文本在日常的页面里是比较常见的,尤其是一些活动页面。使用 css 实现渐变文字我们是这么写的:

Gradient text
.gradient {
  background-image: linear-gradient(90deg, #fe8739, #fe4912, #fd9649, #fd9649);
  color: transparent;
  -webkit-background-clip: text;
}

添加纯色描边则是这么写的:

Gradient text
.stroke {
  -webkit-text-stroke: 1px white;
}

但是当你的页面文字使用了不同的字体,或是出现了文本换行时,表现可能就会出问题了,比如使用了 font-family: system-ui; 的字体进行描边时,文字渲染是这样的:

Gradient text

不同实现方式

现在我们来探索下给纯色或渐变文本添加纯色描边的不同实现方式,通过看查看他们之间的渲染差异来帮助我们结合具体业务情况选择最为合适的实现方式。

下面以 font-family: system-ui; 字体为例,看看这三种场景下不同的实现方式有什么区别:

使用 -webkit-text-stroke

abcdefghigklmnopqrstuvwxyz0123456789
abcdefghigklmnopqrstuvwxyz0123456789
abcdefghigklmnopqrstuvwxyz0123456789

使用 text-shadow

abcdefghigklmnopqrstuvwxyz0123456789
abcdefghigklmnopqrstuvwxyz0123456789
abcdefghigklmnopqrstuvwxyz0123456789

一个 text-shadow 的描边无法完整包裹文字,尝试使用多个 text-shadow :

abcdefghigklmnopqrstuvwxyz0123456789
abcdefghigklmnopqrstuvwxyz0123456789
abcdefghigklmnopqrstuvwxyz0123456789

使用伪类

abcdefghigklmnopqrstuvwxyz0123456789
abcdefghigklmnopqrstuvwxyz0123456789
abcdefghigklmnopqrstuvwxyz0123456789

使用 filter: drop-shadow()

abcdefghigklmnopqrstuvwxyz0123456789
abcdefghigklmnopqrstuvwxyz0123456789
abcdefghigklmnopqrstuvwxyz0123456789

使用 svg filter

abcdefghigklmnopqrstuvwxyz0123456789
abcdefghigklmnopqrstuvwxyz0123456789
abcdefghigklmnopqrstuvwxyz0123456789

为何不适用图片代替

既然代码处理起来看着这么”不靠谱“,我直接用图片不就行了? 使用图片自然是比较简单粗暴的解法,但是碰到下述场景可能就不太适合选用图片了:

总结

上述可以看到不同实现方式都能实现最终需求,但是之间的效果却不尽相同。若读者们有其他奇妙的实现方式,也欢迎交流哦。

Live Demo

该 Demo 内可以切换字体、是否渐变文字,当你切换到渐变文字后,会发现上述有些实现方式就不能用了