2013-01-08 41 views
59

グリッドをイメージに表示したいと思っていますが、どこから始めたらよいか分かりません。 SVGを使用するか、キャンバスHTML5を使用する必要があります。
これにご案内ください。私はこのグリッドに矩形、円、または他の図を描きたいので、その図の面積を四角形のように計算します。html5と(キャンバスまたはsvg)を使用してグリッドを描画する方法

enter image description here

+0

グリッドを描画したいだけですか?私は他の方向に進んでいきたいとは思っていませんが、大きなグリッドを表示するために小さなグリッドイメージをバックグラウンドで繰り返すことができますか?もちろん、計算に基づいて描画したい場合は、 'canvas'を使う方がよいでしょう。 –

答えて

106

を素敵なパターンを使用して:

<svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg"> 
    <defs> 
    <pattern id="smallGrid" width="8" height="8" patternUnits="userSpaceOnUse"> 
     <path d="M 8 0 L 0 0 0 8" fill="none" stroke="gray" stroke-width="0.5"/> 
    </pattern> 
    <pattern id="grid" width="80" height="80" patternUnits="userSpaceOnUse"> 
     <rect width="80" height="80" fill="url(#smallGrid)"/> 
     <path d="M 80 0 L 0 0 0 80" fill="none" stroke="gray" stroke-width="1"/> 
    </pattern> 
    </defs> 

    <rect width="100%" height="100%" fill="url(#grid)" /> 
</svg> 

私は100%からwidthheightを設定するので、あなたは、どちらかのインラインSVGのために、使用上の実際の幅と高さを定義することができます。

<div style="width:400px;height:300px"> 
    <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg"> 
    <defs> 
     <pattern id="smallGrid" width="8" height="8" patternUnits="userSpaceOnUse"> 
     <path d="M 8 0 L 0 0 0 8" fill="none" stroke="gray" stroke-width="0.5"/> 
     </pattern> 
     <pattern id="grid" width="80" height="80" patternUnits="userSpaceOnUse"> 
     <rect width="80" height="80" fill="url(#smallGrid)"/> 
     <path d="M 80 0 L 0 0 0 80" fill="none" stroke="gray" stroke-width="1"/> 
     </pattern> 
    </defs> 

    <rect width="100%" height="100%" fill="url(#grid)" /> 
    </svg> 
</div> 

又は<img>要素:で

<img src="https://imgh.us/grid.svg" width="700" height="200"/> 

結果:

<img src="https://imgh.us/grid.svg" width="241" height="401"/> 

結果10

グリッドを太い線で始点と終点にしたい場合は、この特定のグリッドでは、n x 80 + 1nは任意の整数)の幅と高さを使用する必要があります。

+0

グリッド線の間隔がどのくらい広いか、どの色、ストローク幅、背景色でより柔軟なグリッドが必要な場合はこれを簡単に行うこともできます。これ以上の助けが必要な場合はお気軽にお問い合わせください。 –

+0

私はこのソリューションが本当に好きです。しかし、FirefoxとSafariでは、svg getが本当に大きく(100%で設定し、実際に小さなビューポートを使用する)、小さなグリッドと大きなグリッドが完全に整列しない丸め誤差があるようです。http:// imgur.com/qitOro2にはこれを修正する方法がありますか? –

+2

これは素晴らしいです – xxstevenxo

10

私はSOにここcanvasを使用して私のコードを投稿していますが、私はまたJSFiddle here上の作業のサンプルを作成しています。

<!DOCTYPE html> 
<html> 
<head> 
    <title>StackOverflow test bed</title> 
    <script type="text/javascript"> 
     function drawGrid() { 
      var cnv = document.getElementById("cnv"); 

      var gridOptions = { 
       minorLines: { 
        separation: 5, 
        color: '#00FF00' 
       }, 
       majorLines: { 
        separation: 30, 
        color: '#FF0000' 
       } 
      }; 

      drawGridLines(cnv, gridOptions.minorLines); 
      drawGridLines(cnv, gridOptions.majorLines); 

      return; 
     } 

     function drawGridLines(cnv, lineOptions) { 


      var iWidth = cnv.width; 
      var iHeight = cnv.height; 

      var ctx = cnv.getContext('2d'); 

      ctx.strokeStyle = lineOptions.color; 
      ctx.strokeWidth = 1; 

      ctx.beginPath(); 

      var iCount = null; 
      var i = null; 
      var x = null; 
      var y = null; 

      iCount = Math.floor(iWidth/lineOptions.separation); 

      for (i = 1; i <= iCount; i++) { 
       x = (i * lineOptions.separation); 
       ctx.moveTo(x, 0); 
       ctx.lineTo(x, iHeight); 
       ctx.stroke(); 
      } 


      iCount = Math.floor(iHeight/lineOptions.separation); 

      for (i = 1; i <= iCount; i++) { 
       y = (i * lineOptions.separation); 
       ctx.moveTo(0, y); 
       ctx.lineTo(iWidth, y); 
       ctx.stroke(); 
      } 

      ctx.closePath(); 

      return; 
     } 

    </script> 
</head> 
<body onload="drawGrid()"> 
    <canvas id="cnv" width="500" height="500"></canvas> 
</body> 
</html> 

あなたがseparationパラメータを変更することで、グリッドのサイズを動的にすることができますcanvasアプローチを使用します。あなたのグリッドサイズが静的をあることを行っている場合

しかし、私はは多分あなたはする必要はありませんグリッドを描くことを感じています。ユーザにグリッドを表示するために、フィギュアhereで示されているように、CSSを使用して背景イメージを繰り返すことができます。それはまた、ページのパフォーマンスにも良いでしょう。

+0

これらの行のストローク幅を減らすことはできますか?私は1より小さい数字を使用しようとしました。上記のSVGの例ではうまくいきますが、このCanvasソリューションでは、SVGの鮮明さを再現できません。 – JohnDevelops

+1

キャンバスが線をレンダリングする方法が原因です。この記事http://www.mobtowers.com/html5-canvas-crisp-lines-every-time/を参照してください。 また、更新されたjsFiddleをお持ちですかhttp://jsfiddle.net/B2EBw/137/ –

4

キャンバスを使用するのはとても簡単ですが、それは私が推奨するものです。私はここで携帯に迅速に対応していますが、あなたは以下の擬似コードは正確に右でない場合であってもアイデアを得る必要があります。

あなたのようなループに何かがあります:SVGはこれを行うことができます

// "Ctx" is your canvas context 
// "Width," "Height," and other vars that start with a capital letter are set according 
// to your canvas size or preference 

var i; 
for (i=0; i < Height; i += GridSize) { 
    ctx.lineWidth(1.0+((i%10)==0)); 
    ctx.moveTo(0,i); 
    ctx.lineTo(Width,i); 
    ctx.stroke(); 
} 
for (i=0; i < Width; i += GridSize) { 
    ctx.lineWidth(1.0+((i%10)==0)); 
    ctx.moveTo(i,0); 
    ctx.lineTo(i,Height); 
    ctx.stroke(); 
} 
4

カバレッジの観点から、CSSベースのアプローチはどうですか?

<!DOCTYPE html> 
<html> 
    <head> 
     <style> 
     html { 
     height: 100%; 
     } 

     body { 
     margin: 0; 
     padding: 0; 
     height: 100%; 
     background-color: #434343;  
     background-size: 75px 75px; 
     background-image: linear-gradient(0deg, transparent 24%, rgba(255, 255, 255, .05) 25%, rgba(255, 255, 255, .05) 26%, transparent 27%, transparent 74%, rgba(255, 255, 255, .05) 75%, rgba(255, 255, 255, .05) 76%, transparent 77%, transparent), linear-gradient(90deg, transparent 24%, rgba(255, 255, 255, .05) 25%, rgba(255, 255, 255, .05) 26%, transparent 27%, transparent 74%, rgba(255, 255, 255, .05) 75%, rgba(255, 255, 255, .05) 76%, transparent 77%, transparent); 
     } 

     canvas { 
      width:100%; 
      height:100%; 
      position:absolute; 

      background-color: transparent; 
      background-size: 15px 15px; 
      background-image: linear-gradient(0deg, transparent 24%, rgba(255, 255, 255, .05) 25%, rgba(255, 255, 255, .05) 26%, transparent 27%, transparent 74%, rgba(255, 255, 255, .05) 75%, rgba(255, 255, 255, .05) 76%, transparent 77%, transparent), linear-gradient(90deg, transparent 24%, rgba(255, 255, 255, .05) 25%, rgba(255, 255, 255, .05) 26%, transparent 27%, transparent 74%, rgba(255, 255, 255, .05) 75%, rgba(255, 255, 255, .05) 76%, transparent 77%, transparent); 
     } 

     </style> 
    </head> 
    <body> 
     <canvas></canvas> 
    </body> 
</html> 
+1

上記の回答にjsfiddleを追加 - https://jsfiddle.net/3pfc4avp/ – Murukesh

関連する問題