キレイな縁取り文字をtext-shadowプロパティとCSS変数で作る

CSSで縁取り文字を作る方法はいくつかありますが、今回は、text-shadowプロパティとCSS変数 (カスタムプロパティ) を使用したものを紹介します。

text-shadowプロパティを使用したよくある方法

text-shadowプロパティは、offset-x (X軸方向のオフセット)、offset-y (Y軸方向のオフセット)、blur-radius (ぼかし)、color (色) の4つの値を1セットとして、カンマ区切りで複数設定できます。

よくある方法は、offset-x と offset-y を使用して、文字の周りに影を作り縁取ります。

.text-outline {
  color: #fff;
  text-shadow:
    -1px -1px #000 /* 左上方向の影 */,
     0px -1px #000 /* 上方向の影   */,
     1px -1px #000 /* 右上方向の影 */,
     1px  0px #000 /* 右方向の影   */,
     1px  1px #000 /* 右下方向の影 */,
     0px  1px #000 /* 下方向の影   */,
    -1px  1px #000 /* 左下方向の影 */,
    -1px  0px #000 /* 左方向の影   */;
}

この方法の欠点は、文字を拡大してみるとよく分かるのですが、縁取りの厚みが均一ではなく、角の部分がギザギザになってしまうことです。

縁取りの厚みに関しては、左上方向、右上方向、右下方向、左下方向の値を 1px ではなく 1px / √2 (1.41421356237) ≒ 0.7071px にするといい感じで表示されますが、ギザギザはどうにもなりません。

.text-outline {
  color: #fff;
  text-shadow:
    -0.7071px -0.7071px #000 /* 左上方向の影 */,
          0px      -1px #000 /* 上方向の影   */,
     0.7071px -0.7071px #000 /* 右上方向の影 */,
          1px       0px #000 /* 右方向の影   */,
     0.7071px  0.7071px #000 /* 右下方向の影 */,
          0px       1px #000 /* 下方向の影   */,
    -0.7071px  0.7071px #000 /* 左下方向の影 */,
         -1px       0px #000 /* 左方向の影   */;
}

text-shadowプロパティでキレイに縁取る方法

結論から言うと、blur-radius (ぼかし) を重ねて縁取ります。

.text-outline {
  color: #fff;
  text-shadow:
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000,
    0 0 1px #000;
}

ここでは、36回も重ねているため、くっきり表示されます。もちろん、縁取りの厚みは均一で、角のギザギザもありません。

ただ、CSSコードがダメすぎます。これでは他のバリエーションへの応用もできません。そこで、CSS変数 (カスタムプロパティ) を使用します。

[class*="__text-outline__"] {
  --x: 0 0 var(--text-outline--width, 1px) var(--text-outline--color, #000);
  --y: var(--x), var(--x), var(--x), var(--x), var(--x), var(--x) /* 6 */;
  text-shadow: var(--y), var(--y), var(--y), var(--y), var(--y), var(--y) /* 6 * 6 = 36 */;

  color: #fff;
}
.__text-outline__thick {
  --text-outline--width: 2px;
}
.__text-outline__red {
  --text-outline--color: #800000;
}

かなりスッキリしましたね。更に、縁取りの太さと色のバリエーションも追加できました。

CodePen による表示

See the Pen CSS outline text by nov (@numerofive) on CodePen.

CSS変数の界王拳っぽい使い方の紹介でした。

関連記事