Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用html5和(画布或svg)绘制网格_Html_Svg_Html5 Canvas - Fatal编程技术网

如何使用html5和(画布或svg)绘制网格

如何使用html5和(画布或svg)绘制网格,html,svg,html5-canvas,Html,Svg,Html5 Canvas,我想画一个如图所示的网格,但我完全不知道从哪里开始。我应该使用SVG还是使用Canvas和HTML5以及如何绘制它。 请对此进行指导。我希望这个网格在上面画矩形、圆形或其他图表,我会像计算正方形的面积一样计算图表的面积 我在这里使用canvas发布我的代码,但我也在JSFIDLE上创建了一个工作示例 堆垛溢流试验台 函数drawGrid(){ var cnv=document.getElementById(“cnv”); 变量gridOptions={ 米诺林:{ 分离:5, 颜色:“#00F

我想画一个如图所示的网格,但我完全不知道从哪里开始。我应该使用SVG还是使用CanvasHTML5以及如何绘制它。
请对此进行指导。我希望这个网格在上面画矩形、圆形或其他图表,我会像计算正方形的面积一样计算图表的面积


我在这里使用
canvas
发布我的代码,但我也在JSFIDLE上创建了一个工作示例


堆垛溢流试验台
函数drawGrid(){
var cnv=document.getElementById(“cnv”);
变量gridOptions={
米诺林:{
分离:5,
颜色:“#00FF00”
},
主要路线:{
离职人数:30人,
颜色:“#FF0000”
}
};
drawGridLines(cnv、gridOptions.minorLines);
drawGridLines(cnv、gridOptions.Majorline);
返回;
}
函数drawGridLines(cnv、lineOptions){
var iWidth=cnv.宽度;
var iHeight=cnv高度;
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);

对于(i=1;i,使用canvas非常容易,这是我的建议。我在手机上的响应速度很快,但即使下面的psuedocode不完全正确,您也应该明白这一点:

您将有一个类似以下内容的循环:

// "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();
}
/“Ctx”是您的画布上下文
//“宽度”、“高度”和其他以大写字母开头的变量是根据
//根据您的画布大小或偏好
var i;
对于(i=0;i
SVG可以使用模式很好地实现这一点:

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

结果:

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


导致


请注意,对于这个特定的网格,如果希望网格以粗笔划开始和结束,则必须使用格式
nx80+1
(其中
n
为任意整数)的宽度和高度。

为了覆盖范围,基于CSS的方法如何

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

html{
身高:100%;
}
身体{
保证金:0;
填充:0;
身高:100%;
背景色:#434343;
背景尺寸:75px 75px;
背景图像:线性渐变(0度,透明24%,rgba(255,255,255,.05)25%,rgba(255,255,255,255,.05)26%,透明27%,透明74%,rgba(255,255,255,.05)75%,rgba(255,255,255,.05)76%,透明77%,透明,线性渐变(90度,透明24%,rgba(255,255,255,.05)25%,rgba(255,255,255,.05)26%,透明27%,透明74%,rgba(255,255,255,.05)75%,rgba(255,255,255,.05)76%,透明77%,透明;
}
帆布{
宽度:100%;
身高:100%;
位置:绝对位置;
背景色:透明;
背景尺寸:15px 15px;
背景图像:线性渐变(0度,透明24%,rgba(255,255,255,.05)25%,rgba(255,255,255,255,.05)26%,透明27%,透明74%,rgba(255,255,255,.05)75%,rgba(255,255,255,.05)76%,透明77%,透明,线性渐变(90度,透明24%,rgba(255,255,255,.05)25%,rgba(255,255,255,.05)26%,透明27%,透明74%,rgba(255,255,255,.05)75%,rgba(255,255,255,.05)76%,透明77%,透明;
}

你只想画一个网格?我不想沿着其他方向走,但我想知道你可以
背景重复
一个小的网格图像来显示更大的网格。当然,如果你想根据计算绘制它,那么最好使用
画布
。如果你需要一个更灵活的网格网格线之间的距离很宽,或者使用了什么颜色、笔划宽度和背景颜色,这也很容易做到。请随时询问您是否需要进一步的帮助。我非常喜欢这个解决方案。但是在firefox和safari中,如果svg拉伸得非常大(通过设置为:100%并使用非常小的视口)似乎存在舍入错误,导致小网格和大网格无法完美对齐:有没有办法解决此问题?增加笔划宽度时,它适用于细线(例如,尝试使用4.0),上显示了一些不对称问题。@ThomasW如何更改网格线的宽度?是否可以减少这些线上的笔划宽度?我尝试使用小于1的数字。在上面的SVG示例中效果很好,但我无法用此画布解决方案复制它的清晰性。您所指的清晰性是因为画布的宽度ders行。请参阅本文。还有一个更新的JSFIDLE供您使用
<img src="https://svgshare.com/i/9Eo.svg" width="700" height="200"/>
<img src="https://svgshare.com/i/9Eo.svg" width="241" height="401"/>
<!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>