多くの優れたアプローチがあります。別のアプローチで、すべての HTML5 ブラウザーと互換性のあるソリューションを追加したかったのです。
純粋な CSS ソリューションとして単純明快ではありませんが、キャンバスを使用して境界線を生成するため、グラデーションなどを生成する拡張機能も提供します。
オンラインデモはこちら
これにより、次のようになります。
これを JavaScript から使用する簡単な例を次に示します。
この関数は次の 3 つの引数を取ります。
- ボーダーを追加する要素
- 曲線の高さ
- 背景の色
例えば:
curlyBorder(border1, 24, '#073');
curlyBorder(border2, 24, '#037');
HTML:
<div id="border1">Text 1</div>
<div id="border2">Text 2</div>
CSS: (主に寸法と色を定義するためだけに)
#border2 {
position:relative;
top:-25px;
}
#border1, #border2 {
width:300px;
height:150px;
padding:30px 16px;
color:#fff;
font:26px sans-serif;
text-align:center;
}
JavaScript:
グラフィック付きのキャンバスを生成し、要素の背景として設定する関数。コードは最適化されていません。いずれにせよ、グラデーション、より良い境界線などをサポートするように拡張できます。ここでは、例のために最小限に抑えました。
function curlyBorder(el, ch, color) {
var canvas = document.createElement('canvas'),
ctx = canvas.getContext('2d');
render();
function render() {
var w = el.clientWidth,
h = el.clientHeight,
t = w * 0.333;
canvas.width = w;
canvas.height = h;
/// define border
ctx.moveTo(0, 0);
ctx.lineTo(t, 0);
/// create one curve positive direction
renderCurve(t, ch, 1);
ctx.lineTo(w, 0);
ctx.lineTo(w, h - ch);
ctx.lineTo(w - t, h - ch);
/// create one curve negative direction
renderCurve(t, ch, -1);
ctx.lineTo(0, h - ch);
ctx.closePath();
/// color or gradient
ctx.fillStyle = color;
ctx.fill();
/// set this canvas as background to element
el.style.background = 'url(' +
canvas.toDataURL() + ') no-repeat top left';
/// we use trigonometry to make the curved line:
function renderCurve(t, ch, d) {
var x, sx, ex,dg = -90, dgd = 360 / t, y;
if (d > 0) {
x = t;
for(; x < t * 2; x++) {
y = ch * 0.5 * Math.sin(dg * Math.PI / 180);
ctx.lineTo(x, y + ch * 0.5);
dg += dgd;
}
} else {
x = t * 2;
for(; x > t; x--) {
y = ch * 0.5 * Math.sin(dg * Math.PI / 180);
ctx.lineTo(x, h - ch * 0.5 + y);
dg += dgd;
}
}
}
}
}
これの欠点は、CSS ほど効率的ではないことですが、いくつかの要素のみを維持すれば、パフォーマンスは許容範囲を超えています。
要素の位置を調整する必要があります。次の要素を相対的な位置とオフセットでハードコーディングしました。これは、他の CSS ルールを使用して (または関数自体に実装することで) より適切に解決できます。
ただし、良い面としては、スケーリングされた画像を使用する場合と比較して、デザインの可能性がより自由になり、サイズを変更して高品質のレンダリングを得ることができます.
キャンバスをサポートするすべての HTML5 ブラウザーで同じようにレンダリングされます (exCanvas を使用した IE < 9 でもこれをレンダリングできると思いますが、チェックしていません)。