Square grid that fills the svg, based on specified number of rows and columns.
Adapted from Chuck Grimmett's block, Let's Make a Grid with D3.js.
| license: mit |
Square grid that fills the svg, based on specified number of rows and columns.
Adapted from Chuck Grimmett's block, Let's Make a Grid with D3.js.
| <!DOCTYPE html> | |
| <head> | |
| <meta charset="utf-8"> | |
| <script src="https://d3js.org/d3.v4.min.js"></script> | |
| <style> | |
| body { | |
| font-family:"avenir next", Arial, sans-serif; | |
| font-size: 12px; | |
| color: #696969; | |
| margin: 0; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div id="grid"></div> | |
| <script> | |
| var margin = {top:10, right:10, bottom:10, left:10}, | |
| width = 960 - margin.left - margin.right, | |
| height = 500 - margin.top - margin.bottom; | |
| var gridData = gridData(width, height, 13, 8); | |
| // console.log(gridData); | |
| var svg = d3.select("#grid") | |
| .append("svg") | |
| .attr("width", width + margin.left + margin.right) | |
| .attr("height", height + margin.top + margin.bottom); | |
| var grid = svg.append("g") | |
| .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); | |
| var row = grid.selectAll(".row") | |
| .data(gridData) | |
| .enter() | |
| .append("g") | |
| .attr("class", "row"); | |
| var column = row.selectAll(".cell") | |
| .data(function(d) { return d; }) | |
| .enter() | |
| .append("rect") | |
| .attr("class", "cell") | |
| .attr("x", function(d) { return d.x; }) | |
| .attr("y", function(d) { return d.y; }) | |
| .attr("width", function(d) { return d.width; }) | |
| .attr("height", function(d) { return d.height; }) | |
| .style("fill", "white") | |
| .style("stroke", "grey"); | |
| // function that generates a nested array for square grid | |
| function gridData(w, h, ncol, nrow) { | |
| var data = []; | |
| var xpos = 1; // starting xpos and ypos at 1 so the stroke will show | |
| var ypos = 1; | |
| // calculate width and height of the cell based on width and height of the canvas | |
| var cellSize = calcCellSize(w, h, ncol, nrow); | |
| // iterate for rows | |
| for (var row = 0; row < nrow; row++) { | |
| data.push([]); | |
| // iterate for cells/columns inside each row | |
| for (var col = 0; col < ncol; col++) { | |
| data[row].push({ | |
| x: xpos, | |
| y: ypos, | |
| width: cellSize, | |
| height: cellSize | |
| }); | |
| // increment x position (moving over by 50) | |
| xpos += cellSize; | |
| } | |
| // reset x position after a row is complete | |
| xpos = 1; | |
| // increment y position (moving down by 50) | |
| ypos += cellSize; | |
| } | |
| return data; | |
| function calcCellSize() { | |
| // leave tiny space in margins | |
| var gridWidth = w - 2; | |
| var gridHeight = h - 2; | |
| var cellSize; | |
| // calculate size of cells in columns across | |
| var colWidth = Math.floor(gridWidth / ncol); | |
| // calculate size of cells in rows down | |
| var rowWidth = Math.floor(gridHeight / nrow); | |
| // take the smaller of the calculated cell sizes | |
| if (colWidth <= rowWidth) { | |
| cellSize = colWidth; | |
| } else { | |
| cellSize = rowWidth; | |
| } | |
| return cellSize; | |
| } | |
| } | |
| </script> | |
| </body> |