Search code examples
htmlsvghtml5-canvas

How to draw grid using HTML5 and canvas or SVG


I want to draw a grid as shown in the image but I totally don't have any idea where to begin.

Should I use SVG or should I use Canvas with HTML5 and how do I draw on it?

I want this grid to draw rectangle, circle or other diagrams on it and I will calculate the area of that diagram like area of a square.

grid


Solution

  • SVG can do this nicely using patterns:

    <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>

    I set width and height to 100%, so you can define the actual width and height on use, either for inline 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>

    or an <img> element:

    <img src="https://svgshare.com/i/eGa.svg" width="700" height="200"/>
    

    results in:

    (Sorry if the image does not show up – there does not seem to be something like Imgur for reliably hosting SVGs.)

    <img src="https://svgshare.com/i/eGa.svg" width="241" height="401"/>
    

    results in

    Note that for this particular grid you have to use widths and heights of the form n x 80 + 1 (with n being any integer) if you want the grid to start and end with a thick stroke.