ボーダー

border-image

border-image は、画像やグラデーションを 9 つに切り分けて、border の線の代わりに描くショートハンドです。角は四隅に置き、辺は伸ばしたりくり返したりして枠を作ります。

構文<'border-image-source'> …
<'border-image-source'>
  || <'border-image-slice'> [ / <'border-image-width'> | / <'border-image-width'>? / <'border-image-outset'> ]?
  || <'border-image-repeat'>

<'border-image-source'> = none | <image>
<'border-image-slice'> = [ <number [0,∞]> | <percentage [0,∞]> ]{1,4} && fill?
<'border-image-width'> = [ <length-percentage [0,∞]> | <number [0,∞]> | auto ]{1,4}
<'border-image-outset'> = [ <length [0,∞]> | <number [0,∞]> ]{1,4}
<'border-image-repeat'> = [ stretch | repeat | round | space ]{1,2}

プレビュー

プリセット
右下の角をドラッグするとサイズを変えられます

ショートハンドの内訳

border-image
url(/border-frame.svg)border-image-source
30border-image-slice
1border-image-width省略 → 初期値
0border-image-outset省略 → 初期値
roundborder-image-repeat

コード

.box {
  border: 28px solid #cbd5e1;
  border-image: url(/border-frame.svg) 30 round;
}

コントロール

border-image-source
border-image-source
border-image-slice
fill
/ border-image-width
/ border-image-outset
border-image-repeat
横と縦を同じ値にする
border-image-repeat

解説

9 つに切り分ける (slice)

border-image-slice は、画像の上・右・下・左の端からどれだけ内側で切るかを指定します。切ると画像は 4 つの角、4 つの辺、中央の 9 つに分かれ、角は border の角に、辺は border の辺に描かれます。

  • 数値は画像の中の座標です(ビットマップならピクセル、SVG ならその座標)。このページの見本の画像は 90×90 なので、30 で 30 ずつ均等に切れます。% は画像の幅・高さに対する割合です。初期値は 100% です。
  • 中央の部分はふだん捨てられます。fill を付けると、中央も要素の内側(背景の上)に描かれます。
  • 2〜4 つ書くと、margin などと同じ順で辺ごとに切り方を変えられます(このページのコントロールは 1 つだけです)。

描く太さと外へのはみ出し (width / outset)

切り方のあとに / で区切って border-image-width、さらに / で border-image-outset を書けます。

  • border-image-width は画像を描く帯の太さです。初期値の 1 のように単位のない数値は border の太さの倍数、auto は切り出した部分の元の大きさです。border 自体の太さ(レイアウト)は変わりません。
  • border-image-outset は、画像を描く範囲を border の外側へどれだけ広げるかです。はみ出した部分はスクロールの対象にならず、クリックも受けません。
  • width を省いて outset だけ書くときは 30 / / 12px のように / を 2 つ続けます。

辺の並べ方 (repeat)

  • stretch:辺の画像を 1 枚だけ、辺の長さいっぱいに引き伸ばします。初期値です。
  • repeat:辺の中央から左右(上下)へくり返し、両端の画像は途中で切れます。
  • round:ちょうどの枚数で並ぶように画像を伸び縮みさせます。
  • space:切れずに収まる枚数だけ並べ、余りを画像の前後と間に均等に配ります。

2 つ書くと、1 つ目が上下の辺(横方向)、2 つ目が左右の辺(縦方向)の並べ方になります。

気をつけること

  • border-image は border の線の代わりに描かれるだけで、border の太さは border-width で決まります。border-style が none だと太さが 0 になり、border-image-width の初期値(太さの 1 倍)では何も描かれません。このページでは border で 28px の枠を付けています。
  • border ショートハンドは border-image も初期値に戻します。両方書くときは border を先に書きます。
  • border-radius を付けても、border-image の角は丸くなりません。
  • グラデーションには元の大きさがないので、画像を描く範囲(outset が無ければ border の外側の縁まで)の大きさで描いてから切ります。linear-gradient(…) 1 と書くと、グラデーションの縁の 1px を border の太さまで引き伸ばした、グラデーションの枠になります。

コメント