解 説

画像が使えないボーダーなんてジャムを入れない紅茶のようなものだ。
dog_tee
ボーダーに画像を適用するには border-image-sourceプロパティで画像を読み込んで、border-image-sliceで幅を指定すればよい。
まずはとっておきのジャムでTea Timeにしようよ。。

CSS3のborder-imageではボーダーに画像を読み込むことができます。ボーダーに画像を適用すると簡単に表現力が向上します。
少し使い方がわかりにくいですが、理解すれば簡単に使用することができます。
例えば次のような表現です。画像の周りに額のような模様を付けています。

border-image1

ボーダーに画像を使用したサンプル

額の部分はイラストレーターのブラシに標準でセットされているゴールドリーフを使用して四角形を適当な大きさで描いたものを使用しています。

border-imageプロパティの使い方

矩形に画像ボーダーを適用する方法の説明です。

ボーダーに使いたい画像の準備

まずイラストレーターなどで使いたい画像のボーダーを矩形の形にして準備します。
作例ではイラストレーターで幅480px高さ335pxの長方形を作成して、線に対してブラシのゴールドリーフを適用しました。
border-image2

ここで大事な作業は、今回のように各辺のデザインが均一に繰り替えさえれているものでは、長方形の幅と高さは適当でかまいません。
ただし、画像化しているボーダーの幅の値をイラストレーターのものさしツールなどで上下左右それぞれ記録しておきます。
今回の例では赤矢印部分の幅です。それぞれ均一な幅で45pxとなっています。
border-image3

できあがった長方形はpng形式かgifにして保存しておきます。

border-imageプロパティを使ったコーディング

イラストレーターで作成したボーダーの画像をHTMLに適用してみます。
サンプルのHTMLは以下のとおりです。ダミーテキストをdivでグループ化して「.b-image」というクラス名を付けました。

通常のボーダーを付ける

まず、この div.b-image に通常のボーダーをつけます。

通常のボーダーを付けた例

ボーダーは実線で5pxの黒色です。

border-image-sourceで画像を読み込む

HTMLは先のものと同じです。CSSのみ追加していきます。
ここで、注意する点として先に設定した「border: 5px solid #000;」はそのまま残しておくことです。これを消去するとボーダーは引けません。
ボーダーに画像を読み込むためには border-image-source プロパティを使用します。
値にはurl(画像のパス)を使います。

border-image-sliceプロパティの使い方

続いて、border-image-sliceプロパティを使います。これが非常にわかりにくいものなのですが、ここではとりあえず画像を準備したときにボーダーの幅を記録したと思いますがその値を使用します。上下左右同一の幅ならそのときの値をいれます。
注意点として、単位を付けないで数値のみ記述します。
border-image5
ボーダーに画像を表示させたサンプル

上のサンプルで確認するとわかるように、線が5pxで引かれるため画像が縮小された状態になります。
そこで border の線幅の値を5pxから45pxに変更します。
border-image6
これで思い通りの表現になりました。
ここでの注意点はborderプロパティのsolidの指定と色の指定はそのままにしておきます。
ボーダーの幅を調整したサンプル

fillを指定してボーダーで囲まれた背景も同時に表示

border-image-sliceにfillのキーワードを使うと画像で作成したボーダーに囲まれた内側(背景)も表示することができます。
border-image4
次のコードではfillを指定しています。
fillを使ったサンプル(絵の下の説明文がカーボンで描かれたボーダーでその内側の背景にはパターンが表示されています)

border-image-sourceにはcarbon.pngを指定
ボーダー幅は5pxでborder-image-sliceにfillを指定

border-image-sliceは作成した画像を下図のように4つの角の領域とそれぞれの辺(上辺、下辺、左辺、右辺)に分解して保存されます。そして各辺の幅を指定することでそれらがつながった状態で復元されるものです。
gold2
値が4つの場合は上辺の幅 右辺の幅 下辺の幅 左辺の幅となります。
値が1つの場合は全て同じ幅です。
値が2つの場合は1つ目が上下辺、2つ目が左右辺の幅です。
値が3つの場合は1つ目が上辺、2つ目が左右辺、3つ目が下辺の幅です。
また、border-image-sliceの値には単位をつけません。
長さをラスター画像の場合はピクセル数で、ベクター画像の場合は座標で表されます。
さらに、値にfillというキーワードを加えると上記サンプルの枠に囲まれた部分(fillと記述された部分)を表示することもできます。
つまりボーダー部分だけではなくそのボーダーに囲まれた中身の画像まで表示することができます。

border-image-widthの指定

border-image-widthの値にpx単位を付けて指定をするとボーダーの幅を指定することができます。
この指定を行う事でborder: 45px solid #000の指定を消去してもボーダーは表示されることになります。
この場合は仮想的なボーダーを作成しているためボックスモデルの計算に影響しません。
ただし、見た目がおかしくなります。つまりボーダーとコンテンツが重なってしまう場合があります。
border-image-widthを使用したサンプル
border-image7

一方で先のサンプルのように border: 5px solid #000 のようにしてボーダーの指定をすることも可能です。この場合はボックスモデルの計算に影響がでますが、見た目の不具合はでません。どちらを選ぶかは状況に応じて検討してください。
また、一旦border: 5px solid #000で指定をしておいてから、別途border-image-widthプロパティで幅を指定する場合の特徴は値に単位を付けずにborderで指定した幅の何倍という形で指定することもできます。
border-image-width:2とするとborderで指定した幅の2倍になります。
border-image-widthを使ってボーダーとコンテンツが重なった場合、これを防ぐにはborder-image-outsetで必要な数値をpxで指定します。
ちょうどパディングを入れた状態になりボーダーと文字が重なることを防ぐことができます。

border-image-outsetを使ったサンプル

border-image-repeatの指定

border-image-repeatには3つの値があります。
1つ目はデフォルト値で stretch でボーダーの長さに合わせて伸び縮みします。
2つ目は repeat でボーダーの長さに合わせてリピートしながら表示されます。
3つ目は round で伸び縮みしながらリピートするものです。

stretchのサンプル
repeatのサンプル
roundのサンプル