2011-08-24 18 views
10

HTML5 <canvas>要素は、widthおよびheightプロパティの相対サイズ(パーセント)を受け入れません。HTMLキャンバスの相対的なサイズ変更

私が達成しようとしているのは、キャンバスのサイズをウィンドウに合わせて設定することです。これは私がこれまでに作ってみたものですが、あるより良い方法があれば、私は思ったんだけど:<div><canvas>をラップする必要はありません

    1. よりシンプルに。
    2. のjQueryに依存しないが(私は親のdivの幅/高さを得るためにそれを使用)
    3. 理想的には、ブラウザのサイズ変更には再描画されません(ただし、私はそれが必要条件かもしれないと思う)

    スクリーンの中央に円を描くコードについては、下の図を参照してください。幅は40%、最大で400ピクセルです。

    ライブデモ:http://jsbin.com/elosil/2

    コード:

    <!DOCTYPE html> 
    <html> 
    <head> 
        <title>Canvas of relative width</title> 
        <style> 
         body { margin: 0; padding: 0; background-color: #ccc; } 
         #relative { width: 40%; margin: 100px auto; height: 400px; border: solid 4px #999; background-color: White; } 
        </style> 
        <script language="javascript" type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> 
        <script> 
         function draw() { 
          // draw a circle in the center of the canvas 
          var canvas = document.getElementById('canvas'); 
          var relative = document.getElementById('relative'); 
          canvas.width = $(relative).width(); 
          canvas.height = $(relative).height(); 
          var w = canvas.width; 
          var h = canvas.height; 
          var size = (w > h) ? h : w; // set the radius of the circle to be the lesser of the width or height; 
          var ctx = canvas.getContext('2d'); 
          ctx.beginPath(); 
          ctx.arc(w/2, h/2, size/2, 0, Math.PI * 2, false); 
          ctx.closePath(); 
          ctx.fill(); 
         } 
    
         $(function() { 
          $(window).resize(draw); 
         }); 
        </script> 
    </head> 
    <body onload="draw()"> 
        <div id="relative"> 
         <canvas id="canvas"></canvas> 
        </div> 
    </body> 
    </html> 
    
  • 答えて

    14

    キャンバスwidthheight属性同じキャンバスのwidthheightスタイルとは別のものです。 widthheightの属性は、キャンバスのレンダリングサーフェスのサイズ(ピクセル単位)です。一方、スタイルはドキュメント内でブラウザがレンダリングサーフェスからコンテンツを描画する場所を選択します。 widthheightスタイルのデフォルト値であるが指定されていない場合は、のデフォルト値がレンダリングサーフェスの幅と高さになります。だから、あなたは#1について正しいです:divにそれをラップする理由はありません。他の要素と同様に、キャンバス要素のすべてのスタイルのパーセンテージ値を設定できます。

    #3の場合、キャンバス要素でパディングを使用していない限り、clientWidthとclientHeightでサイズを取得するのはかなり簡単です(クロスブラウザ)。

    少し簡略化したバージョンhereをコーディングしました。

    #4の場合は、運が悪いといえます。幅と高さを設定する前に確認し、サイズ変更が不要な場合はキャンバスだけを残しておくと、再描画の一部が削除されますが、すべてを取り除くことはできません。

    編集:ポートマンは、私はセンタリングスタイルを台無しにしました。バージョンhereを更新しました。

    +0

    ありがとうございました。興味深いことに、それを中心にしたい場合は 'div'に' canvas'をラップする必要があるようです。 'margin:0 auto'はdivのようにキャンバスを中心にしていないようです。 – Portman

    +1

    @Portmanいいえ、それでもできます。キャンバススタイルでdisplay:blockを配置するのを忘れてしまいました(デフォルトはインラインブロックですが、そのようにセンタリングしません)。この修正プログラムで更新された解答。 – sethobrien

    1

    いいえ。ここでは、私はそれを実装するために使用した技術です。初期化されません。

    は、ウィンドウの高さは、PS 640

    canvas = document.getElementById("canvas"); 
    canvas.height=window.innerHeight*400/480; 
    

    に変わり比較的場合は、キャンバスの高さ= 400、ウィンドウの高さ= 480を持っており、あなたはそれの高さを変更したいとしましょうhtmlタグ内のキャンバスの高さ

    'window.innerHeight'(ブラウザのウィンドウの高さを返します)を使用します。同様に 'window.innerWidth')、ウィンドウ上の相対位置を計算したい場所。

    あなたはあなたが必要としていることを願っています。

    5

    sethobrienによって言われているように、canvas要素はTWOの属性の幅/高さのペアを持っています。

    1. canvas.width/canvas.height意志が描画コマンドの結果が含まれているバッファのピクセルにサイズです。

    2. /canvas.style.heightは、ブラウザウィンドウにキャンバスオブジェクトを表示するのに使われるサイズとほぼ同じで、cssでサポートされているいずれの単位でもかまいません。

    あなたは確かに、一度だけcanvas.widthcanvas.heightを設定割合でスタイルのサイズパラメータを設定する、キャンバスに描画を行い、その後、キャンバスの内容を再描画を忘れることができます。もちろん、これは、ネットワークからロードされた通常の画像のように、ブラウザがスケーリング自体を行うだけで、可視の結果がピクセルスケーリングのアーチファクトを示すことを意味します。

    キャンバス要素のサイズ変更後にキャンバスコンテンツを再描画する必要があるのは、ピクセル完全な結果が必要な場合のみです。

    関連する問題