今回はCSSで要素の枠線(border)に、グラデーションをかける方法を考えてみます

グラデーションボーダー その1

まずは標準的な方法からです。
完成形はコチラ↓

See the Pen gradient-block-01 by subaru (@subaru_works) on CodePen.

ココで重要なのは border-image を使って linear-gradient でグラデーションを設定しています。

border-image-slice (画像の使用範囲)は 1 としておきます。

通常の要素であればこの設定で十分ですが…
この方法では実現できないものがあります。

それは「角丸」

先ほどのコードに border-radius を追加しても要素は角丸になりません…

See the Pen gradient-block-01 by subaru (@subaru_works) on CodePen.

次に角丸ができる方法を考えてみます

角丸対応のグラデーションボーダー

角丸対応をするためにはCSSの mask を使って実現していきます。

まずは作成途中のコードです

See the Pen gradient-block-03 by subaru (@subaru_works) on CodePen.

先ほどのサンプルとは異なり、 疑似要素の before を使って作成していきます。

この疑似要素に border-radius: 30px; をかけて、角丸をします。


しかし、この状態では線ではなく
グラデーションで背景が塗りつぶされている状態になってしまっています。

ここに mask を追加していきます

See the Pen gradient-block-04 by subaru (@subaru_works) on CodePen.

まずは、 mask-image を使って、要素全体に適応するマスクを2つ用意します。

mask-image: linear-gradient(#000), linear-gradient(#000);

このマスクの色、形などは特に指定の必要が無いので
要素全体を塗りつぶすような形でセットします。

次に、このマスクの適応範囲を指定します。

mask-clip: padding-box, border-box;
mask-composite: exclude;

mask-clip では、先ほど用意した2つのマスクイメージに対して
1つは padding-box を、もうひとつには border-box を指定します。

要素にはこのように、border の領域と、padding の領域があります。

padding-box では、表示領域 + padding のエリアをマスクの範囲とします。

範囲は、borderのエリアを覗いたこちらの範囲です。

border-box では、borderまでのエリアをマスクの範囲とします。

この2つの範囲が異なるマスクを mask-composite で合成処理します。

mask-composite: exclude;

exclude でマスク画像の塗りが重なる部分以外をマスク領域とします

このマスク処理を設定すると、先ほど紹介したように
borderのエリアだけがグラデーションするようになります。

See the Pen gradient-block-04 by subaru (@subaru_works) on CodePen.

この方法はCSSの記述が複雑になりますが
borderに角丸にが付けられるようになりました。

おまけ

おまけでhover時の設定を加えてみました。

See the Pen gradient-block-04 by subaru (@subaru_works) on CodePen.

ボタンなどの装飾などでも使えそうです。