tutorials examples ejemplos create html5 svg html5-canvas

examples - cómo dibujar la grilla usando html5 y(lienzo o svg)



svg tutorials (4)

Quiero dibujar una grilla como se muestra en la imagen, pero no tengo idea de por dónde debería comenzar. ¿Debo usar SVG o debería usar Canvas con HTML5 y cómo dibujarlo?
Por favor guía sobre esto. Quiero que esta cuadrícula dibuje rectángulos, círculos u otros diagramas y calcularé el área de ese diagrama como el área del cuadrado.


En interés de la cobertura, ¿qué tal un enfoque basado en 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>


Estoy publicando mi código usando canvas aquí en SO, pero también estoy creando una muestra de trabajo en JSFiddle here .

<!DOCTYPE html> <html> <head> <title> 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>

Usando el enfoque del canvas , puede hacer que el tamaño de la cuadrícula sea dinámico cambiando el parámetro de separation .

Sin embargo, si el tamaño de su cuadrícula va a ser estático, creo que tal vez no necesite dibujar la cuadrícula. Solo por el hecho de mostrar una cuadrícula al usuario, puede usar CSS para repetir una imagen de fondo como se muestra en el violín here . Eso también será bueno en el rendimiento de la página.


SVG puede hacer esto muy bien usando patrones:

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

Establecí el width y height al 100% , por lo que puedes definir el ancho y la altura real en uso, ya sea para SVG en línea:

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

o un elemento <img> :

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

resultados en:

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

resultados en

Tenga en cuenta que para esta grilla en particular, debe usar anchuras y alturas de la forma nx 80 + 1 (siendo n cualquier número entero) si desea que la grilla comience y termine con un trazo grueso.


es muy fácil de usar con lienzo, eso es lo que recomiendo. Estoy respondiendo rápidamente en el móvil aquí, pero debe obtener la idea, incluso si el psuedocode a continuación no es EXACTAMENTE correcto:

Tendrás un ciclo algo así como:

// "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(); }