【CSS3】文字にマスクをかける

説明が難しいんですけど、下の画像のとおりのデザインを作ります。f:id:secon:20170925011654p:plain
こういったレイアウトをcssのみで実装出来ないかと思い調べたのでまとめました。

忙しい人向け

html

<div class="text-mask container">
  <div><span>カブトムシ<span></div>
</div>

css

.container {
  width: 100%;
  margin: 24px 0;
  padding: 40px 0;
}

.text-mask {
  /* 文字の設定 */
  font-size: 80px;
  font-weight: bold;
  text-align: center;

  /*** 背景色の設定 ***/
  /* 左半分(0~50%)が黒, 右半分(50%~100%)が白 */
  background: -webkit-linear-gradient(left, #0a0a0a 0%, #0a0a0a 50%, #fafafa 50%, #fafafa 100%);
}

.text-mask div {
  /*** 文字色の設定 ***/
  /* 左半分(0~50%)が黒, 右半分(50~100%)が白 */
  background: -webkit-linear-gradient(left, #fafafa 0%, #fafafa 50%, #0a0a0a 50%, #0a0a0a 100%);
  /* 文字色を透明化 */
  -webkit-text-fill-color: transparent;
  /* 背景を文字でマスク */
  -webkit-background-clip: text;
}

何をしているの

各プロパティを見ていきます。

- background: -webkit-linear-gradient(...);

linear-gradient() は色の線形グラデーションを表現します。
引数にはグラデーションの開始方向と色の変更場所を渡しています。
linear-gradient - CSS | MDN

今回は引数に(left, #0a0a0a 0%, #0a0a0a 50%, #fafafa 50%, #fafafa 100%)を指定しているので、グラデーションを左方向から初め、0~50%は白、50~100%は黒が設定されます。

-webkit-text-fill-color: transparent;

-webkit-text-fill-color - CSS | MDN

文字の塗りつぶし色を指定します。colorと違って、アウトラインは塗りつぶせません。
transparent によって文字色を透明にしています。

-webkit-background-clip: text;

background-clip - CSS | MDN
背景を文字でマスクします。いってしまえば、backgroundプロパティの値を文字に反映さえることができます(背景は消える)。
ですが優先度はcolorなどの文字色プロパティの方が高いので、text-fill-color: transparent によって文字色を透明化する必要があります。

ブラウザ別実装(2017/09/25時点)

IEOpera非対応です(Edgeは14~が対応)。
IEはtext-fill-colorが引っかかるようです。

拡張性

あくまでマスク部分はグラデーションの機能(によって作られる画像)を使用しているので、複雑な形のマスクをとることはできません。

CSS グラデーションの利用 - ウェブデベロッパーガイド | MDNによれば、使用できるグラデーションパターンは大きく分けて線形と放射状のみのため、これらで表現できる範囲になります。もしくは自分で画像を作るかです。

実装サンプル

codepen.io