【HTML・CSS】 「SVG」要素に「グラデーション」をかける方法

この記事は約4分で読めます。
記事内に広告が含まれています

コーディングのイメージ

こんにちは、さち です。

先日、「HTML」の <svg> 要素に「グラデーション」をかけたいことがありました。

<div> 要素などと違って意外と面倒だったので、実装する方法を備忘録として記事に残しておきます。

スポンサーリンク

「HTML」で実装する

実行結果

結果

HTML

<svg width="180" height="180">
  <!-- グラデーションの指定 -->
  <defs>
    <lineargradient id="sample">
      <stop offset="0%" stop-color="crimson"></stop>
      <stop offset="100%" stop-color="royalblue"></stop>
    </lineargradient>
  </defs>

  <!-- ダイヤの形状 -->
  <polygon points="0,90 90,0 180,90 90,180" fill="url(#sample)"></polygon>
</svg>

<svg> タグ内に <defs> タグを追加。さらに、その中に <lineargradient> タグ内を追加して <stop> でグラデーションの指定をします。

また、<lineargradient> に記述した id="sample" を使って、<polygon> に適用するグラデーションを fill="url(#sample)" で指定しています。

「CSS」で実装する

実行結果

結果

HTML

<div id="mask"></div>

CSS

#mask {
  width: 180px;
  height: 180px;

  /* グラデーションの指定 */
  background: linear-gradient(to right, crimson 0%, royalblue 100%);

  /* ダイヤの形状 */
  -webkit-mask-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"><polygon points="0,90 90,0 180,90 90,180"></polygon></svg>'); 
  -webkit-mask-size: contain; 
  mask-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"><polygon points="0,90 90,0 180,90 90,180"></polygon></svg>');
  mask-size: contain;
}

動作としては、<div> に通常のグラデーションをかけ、<svg> の形で切り抜くということをしています。

mask-image の効果

<div> を切り抜きます。

値の url() 内に書く <svg> タグには xmlns="http://www.w3.org/2000/svg" を付けないと正常に動作しない場合があります。気をつけて下さい。

mask-size の効果

mask-image で使用する <svg> を、<div> 要素の中に収まるサイズにします。

「ベンダープレフィックス」の使用

これらの CSS プロパティは、正式対応が2023年以降というブラウザーもあります。ベンダープレフィックス -webkit- を付けたものも記述しておいた方が安全です。

各ブラウザーの対応は下記リンク先で確認できます。

→ CSS property: mask-image - Can I use...
→ CSS property: mask-size - Can I use...

コメント

タイトルとURLをコピーしました