как нарисовать сетку с помощью html5 и (canvas или svg)
Я хочу нарисовать сетку, как показано на рисунке, но я совершенно не знаю, с чего начать. Я должен использовать SVG или я должен использовать холст С HTML5 и как нарисовать его.
пожалуйста, руководство по этому вопросу. Я хочу, чтобы эта сетка рисовала прямоугольник, круг или другие диаграммы на нем, и я вычислю площадь этой диаграммы, как площадь квадрата.

4 ответов:
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>я
widthиheightдо100%, так что вы можете определить фактическую ширину и высоту при использовании, либо для встроенного 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"/>результаты
обратите внимание, что для данной сетки вы должны использовать ширину и высоту формы
n x 80 + 1(Сnбудучи любым целым числом), если вы хотите, чтобы сетка начиналась и заканчивалась толстым штрихом.
Я отправляю свой код с помощью
canvasздесь на SO, но я также создаю рабочий образец на JSFiddle здесь.<!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>С помощью
canvasподход вы можете сделать размер сетки динамически изменяя
в интересах покрытия, как насчет подхода на основе 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>
это очень легко сделать с помощью холста, вот что я рекомендую. Я отвечаю быстро на мобильном телефоне здесь, но вы должны получить представление, даже если 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(); }
Comments