Skip to content
0

字体描边

默认的描边效果非常丑,不符合预期。与设计软件中的字体描边效果并不一致,本章节介绍几种实现字体描边的方法

text-stroke 的实现

text-stroke 有一个不错的效果,例如下面这个简单的例子

<div class="demo-1-1">字体 Font</div>
<style scoped>
.demo-1-1 {
  -webkit-text-stroke: 2px red;
  text-stroke: 2px red;
}
</style>
字体 Font

但是在一些特殊字体上还会出现穿模的情况,例如我这里设置了 MonaspaceNeon 字体:

<div class="demo-1-2">字体 Font</div>
<style scoped>
.demo-1-2 {
  -webkit-text-stroke: 2px red;
  text-stroke: 2px red;
  font-family: 'MonaspaceNeon';
}
</style>
字体 Font

除此之外,最关键的问题是这个描边的效果是内描边,这意味着如果我们设置了较大的描边值,效果会很奇怪,挤占了文字的空间

<div class="demo-1-3">字体 Font</div>
<style scoped>
.demo-1-3 {
  -webkit-text-stroke: 8px red;
  text-stroke: 8px red;
}
</style>
字体 Font

叠加实现 ✅

最好的方法是:我们可以通过叠加元素的方式实现描边效果,在上面效果的基础上,用伪元素在上面盖一层原有的不描边字体:

<div class="demo-1-4" data-title="字体 Font">字体 Font</div>
<style scoped>
.demo-1-4 {
  position: relative;
  -webkit-text-stroke: 8px red;
  text-stroke: 8px red;
  font-size: 50px;
}
.demo-1-4::before {
  content: attr(data-title);
  position: absolute;
  -webkit-text-stroke: 0;
  text-stroke: 0;
}
</style>
字体 Font

text-shadow 的实现

通过 text-shadow 属性实现的描边效果,虽然不会出现上面阴影交叉的情况,但会出现锯齿效果(越大的描边值越明显),也不美观

<div class="demo-2">字体 Font</div>
<style scoped>
.demo-2 {
  color: skyblue;
  text-shadow: 0 2px red, 2px 0 red, -2px 0 red, 0 -2px red;
}
</style>
字体 Font

仅作为了解,在多数情况下都不推荐使用此方案 ❌

SVG 实现

接下来请出我们神奇的 SVG 选手了,直接可以实现描边效果 ✅

<svg class="demo-3-1">
  <text class="text" x="50%" y="50%" fill="skyblue">字体 Font</text>
</svg>
<style scoped>
.demo-3-1 .text {
  font-size: 50px;
  text-anchor: middle;
  dominant-baseline: middle;
  stroke-width: 4px;
  stroke: red;
  paint-order: stroke; /*先描边*/
}
</style>
字体 Font

其中 paint-order 属性让默认的内描边变为外描边。text-anchordominant-baseline 属性让文字居中

通过 stroke-width 属性设置描边宽度,stroke 属性设置描边颜色

但是兼容性相较于之前的方案来说都差一些

  • paint-order:
  • text-anchor:
  • dominant-baseline:
  • stroke-width:
  • stroke:

Released under the MIT License.