🔲

border-image と border-radius (擬似的な)一緒に使い方

2023/12/26に公開

この文はグラデーション枠線を要素に付けることを例にとると、border-imageborder-radius の一緒に使い方をご紹介します。(border-image と border-radius の対立を解決することではなく、擬似的なことです。)

問題点

要素にグラデーション枠線を付ける方法は:

div {
  border-image: linear-gradient(red, yellow) 5;
  border-width: 5px;
  border-style: solid;
}


これは簡単ですが、角丸が作れませんでした。

div {
  border-image: linear-gradient(red, yellow) 5;
  border-radius: 5px; // 無効
  border-width: 5px;
  border-style: solid;
}

TL;DR

mask を一緒に使ったらできます。

div {
  border-image: linear-gradient(red, yellow) 5;
  border-radius: 5px;
  border-width: 5px;
  border-style: solid;
  
  mask: linear-gradient(black, black);
}

擬似要素・ラッピング要素を使う解決策

一般的な解決策は擬似要素やラッピング要素を使うのでしょう。

div {
  position: relative;
  border: 5px solid transparent;
  background: white;
  background-clip: padding-box;
}
div::before {
  content: '';
  border-radius: 5px;
  background-image: linear-gradient(red, yellow);
  position: absolute;
  margin: -5px;
  inset: 0;
  z-index: -1;
}

その原理は擬似要素(div::before)はグラデーション背景で、元の要素(div)は白背景なので、透明のように見えます。

擬似要素・ラッピング要素を使わない解決策

使いたくないなら、二つ背景画像を使ってもできます。

div {
  border-radius: 5px;
  background-image: linear-gradient(white, white), linear-gradient(red, yellow);
  background-origin: border-box;
  background-clip: padding-box, border-box;
  border: 5px solid transparent;
}

同じコンセプトです。

しかし、これらの二つ解決策は背景を確定しなければいけません。

mask を使う解決策

コードを元に戻して、mask プロパティを加えます。

div {
  border-image: linear-gradient(red, yellow) 5;
  border-radius: 5px;
  border-width: 5px;
  border-style: solid;
  
  mask: linear-gradient(black, black);
}

mask というプロパティは、提供した画像を基にして、一部要素を隠します。border-imageborder-radius に影響を受けない一方、mask は影響を受けるため、角丸の外側が消えました。

オーバーフロー部が見えるようにしたい場合、擬似要素を使ってもできます。

div {
  position: relative;
  padding: 5px;
}
div::before {
  content: '';
  position: absolute;
  margin: -5px;
  width: calc(100% - 10px);
  height: calc(100% - 10px);
  
  border-image: linear-gradient(red, yellow) 5;
  border-radius: 5px;
  border-width: 5px;
  border-style: solid;
  
  mask: linear-gradient(black, black);
}

終わりに

mask は 2010 年頃から導入されていますが、この解決策はほとんど紹介されていません。この方法が他と異なる点は、背景が透けて見えると思います。デメリットについてが知っている方がいれば、是非教えていただけますか。

Discussion