WebKit系とFirefox限定です(IEでは利用できない)。
CSSのbackgroundプロパティにおいて、WebKit系のブラウザにはcanvas()関数、Firefoxではelement()関数という値が指定できます。canvas()関数は、canvasに描画したものを背景に設定できる関数で、element()関数は指定の要素を画像として扱い背景にすることができます(残念ながら、背景にしかできない)。
で、これに関連してWebKit系のブラウザのJavaScriptにはgetCSSCanvasContextメソッド、FirefoxにはmozSetImageElementメソッドというものが用意されています。これは、どちらもブラウザ上でcanvasを作成し、ブラウザ上にcanvasを描画せずにcanvas画像を背景に設定できる機能です(参考:[CSS3] (Webkit専用) CSSを用いて要素の背景にCanvasを指定する – YoheiM .NET、CSSのelement()関数 – Weblog – Hail2u.net)。
関数が違うので、どちらも共通の指定でcanvasの背景画像を作成できるように関数を作ってみました。
function getBgCanvas(id, width, height){ var ctx = false; if(document.getCSSCanvasContext){ // webkit用の指定 ctx = document.getCSSCanvasContext('2d', id, width, height); }else if(document.mozSetImageElement){ // Firefox用の指定 var canvas = document.createElement('canvas'); canvas.setAttribute("width", width); canvas.setAttribute("height", height); ctx = canvas.getContext('2d'); document.mozSetImageElement(id, canvas); } return ctx; }
この関数からえたコンテキストを利用すると、WebKit系でもFirefoxでも同じ処理で背景用canvasを取得できます。
利用例は以下のような感じ。
var ctx = getBgCanvas('background', 100, 400); // ピンクの丸 ctx.beginPath(); ctx.strokeStyle = '#F8C1C6'; ctx.fillStyle = '#F8C1C6'; ctx.arc(50,50,50,0,Math.PI*2,true); ctx.fill(); ctx.stroke(); // 白の丸 ctx.beginPath(); ctx.strokeStyle = '#E3D8C4'; ctx.fillStyle = '#E3D8C4'; ctx.arc(50,150,50,0,Math.PI*2,true); ctx.fill(); ctx.stroke(); // 緑の丸 ctx.beginPath(); ctx.strokeStyle = '#849865'; ctx.fillStyle = '#849865'; ctx.arc(50,250,50,0,Math.PI*2,true); ctx.fill(); ctx.stroke(); //茶色い長方形 ctx.fillStyle = '#D8CFAF'; ctx.fillRect(45,300,10,100);
CSSは下記のように書きます。
#bg-canvas{ background-image: -moz-element(#background); background: -webkit-canvas(background); height:400px; }
というわけで、以下実行サンプルです。
正直、そこまで実用性があるわけではなさそうですが、こういうことができるという紹介。IEにも対応したい場合は、canvasのtoDataURLでBase64の画像データを取得して、それをJavaScriptを用いて要素の背景に設定するという方法でできそうです(というより、それでcanvasに対応している全てのブラウザに対応できる)。
コメント
ajax送信に変えるのとsslか暗号組み込んだほうがいいぜよ。
ん? このブログのことでしょうか?
確かに、SSLじゃないからパスワード漏れやすいよなと前から思ってはいましたが・・・