最初我有一些内联svg,它的功能是我想要的。
<svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg">
<defs>
<pattern id="smallGrid" width="10" height="10" patternUnits="userSpaceOnUse">
<path d="M 10 0 L 0 0 0 10" fill="none" stroke="gray" stroke-width="0.5"/>
</pattern>
<pattern id="grid" width="100" height="100" patternUnits="userSpaceOnUse">
<rect width="100" height="100" fill="url(#smallGrid)"/>
<path d="M 100 0 L 0 0 0 100" fill="none" stroke="gray" stroke-width="1"/>
</pattern>
</defs>
<rect width="100%" height="100%" fill="url(#grid)" />
</svg>
这段代码之所以不错,是因为它是内联的,我可以通过jQuery选择器对其进行操作,更新宽高和路径的d属性。
但以这种方式,它只是一个覆盖层div,无法实现我的目标。
接下来,我考虑将其保存为svg文件,然后进行引用:
<div style="background-image:url('images/grid.svg');"></div>
这对我来说非常完美,因为我使用了已经存在的元素,并给它添加了背景,而不是创建一个全新的带有数据的div。
然而,使用背景图片的问题在于我无法动态调整高度/宽度/path.d属性。
是否有一种方法可以兼顾两者之间的优点呢?
background-image + being able to query and update the attributes?
这里是我最初为inline set_gridSize函数编写的代码:
Form.set_gridSize = function (num) {
num = Number(num);
Form.gridSize = num;
var defs = $("div.grid-for-gridlock > svg > defs");
defs.children("#smallGrid").attr({ Height: num, Width: num });
var path = defs.children("#smallGrid").children().attr("d");
var arr = path.split(" ");
arr[1] = num;
arr[arr.length - 1] = num;
path = arr.join(" ");
defs.children("#smallGrid").children("path").attr("d", path)
defs.children("#grid").attr({ Height: num * 10, Width: num * 10 });
defs.children("#grid").children("rect").attr({ eight: num * 10, Width: num * 10 });
var path = defs.children("#grid").children("path").attr("d");
var arr = path.split(" ");
arr[1] = num*10;
arr[arr.length - 1] = num*10;
path = arr.join(" ");
defs.children("#grid").children("path").attr("d",path);
}
谢谢! :)
编辑:我使用如何使用html5和(canvas或svg)绘制网格作为学习SVG和html5绘制网格的参考。