用d3.js画出带米字格的汉字
最终要实现的效果:
我们先用d3.js画出一个带米字格的汉字:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>汉字米字格</title> <link rel="stylesheet" type="text/css" href="styles.css"/> <script type="text/javascript" src="d3.v4.min.js"></script> </head> <body> <script type="text/javascript"> var body = d3.select("body"); function createChar(){ var width = 500, height = 500, color = #c41b14, left = 200, top = 200, size = 200; var svg = d3.select("body").append("svg"); svg.attr(width, width).attr(height, height); //内横线 svg.append(line) .attr(x1,left) .attr(y1,top + size/2) .attr(x2,left + size) .attr(y2,top + size/2) .attr(stroke,color) .attr(stroke-width, 1); //内竖线 svg.append(line) .attr(x1,left + size/2) .attr(y1,top) .attr(x2,left + size/2) .attr(y2,top + size) .attr(stroke,color) .attr(stroke-width, 1); //内斜线1 svg.append(line) .attr(x1,left) .attr(y1,top) .attr(x2,left + size) .attr(y2,top + size) .attr(stroke,color) .attr(stroke-dasharray, 5,5) .attr(stroke-width, 1); //内斜线2 svg.append(line) .attr(x1,left) .attr(y1,top + size) .attr(x2,left + size) .attr(y2,top) .attr(stroke,color) .attr(stroke-dasharray, 5,5) .attr(stroke-width, 1); //外框线 svg.append(rect) .attr(fill,transparent) .attr(stroke,color) .attr(stroke-width, 5) .attr(x,left) .attr(y,top) .attr(width,size) .attr(height,size); //汉字 svg.append(text) .attr(x,left) .attr(y,top+size-20) .style(font-size, 200px) .style(font-family, Kaiti) .attr(fill,black) .text(国); } createChar(); </script> </body> </html>
再带上数据实现批量生产:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>汉字米字格</title> <link rel="stylesheet" type="text/css" href="styles.css"/> <script type="text/javascript" src="d3.v4.min.js"></script> </head> <body> <script type="text/javascript"> var body = d3.select("body"); var chars = ["水","波","不","兴"]; function createChar(data){ var width = 1200, height = 500, color = #c41b14, left = 200, top = 200, size = 200; var svg = d3.select("body").append("svg"); svg.attr(width, width).attr(height, height); //内横线 svg.selectAll(line.inner-horizontal) .data(data) .enter() .append(line) .classed(inner-horizontal,true) .attr(x1,(d,i)=>{return left + i*size;}) .attr(y1,top + size/2) .attr(x2,(d,i)=>{return left + size + i*size;}) .attr(y2,top + size/2) .attr(stroke,color) .attr(stroke-width, 1); //内竖线 svg.selectAll(line.inner-vertical) .data(data) .enter() .append(line) .classed(inner-vertical,true) .attr(x1,(d,i)=>{return left + size/2 + i*size;}) .attr(y1,top) .attr(x2,(d,i)=>{return left + size/2 + i*size;}) .attr(y2,top + size) .attr(stroke,color) .attr(stroke-width, 1); //内斜线1 svg.selectAll(line.inner-dashed1) .data(data) .enter() .append(line) .classed(inner-dashed1,true) .attr(x1,(d,i)=>{return left+i*size;}) .attr(y1,top) .attr(x2,(d,i)=>{return left + size + i*size;}) .attr(y2,top + size) .attr(stroke,color) .attr(stroke-dasharray, 5,5) .attr(stroke-width, 1); //内斜线2 svg.selectAll(line.inner-dashed2) .data(data) .enter() .append(line) .classed(inner-dashed2,true) .attr(x1,(d,i)=>{return left+i*size;}) .attr(y1,top + size) .attr(x2,(d,i)=>{return left + size + i*size;}) .attr(y2,top) .attr(stroke,color) .attr(stroke-dasharray, 5,5) .attr(stroke-width, 1); //外框线 svg.selectAll(rect.frame) .data(data) .enter() .append(rect) .classed(frame,true) .attr(fill,transparent) .attr(stroke,color) .attr(stroke-width, 5) .attr(x,(d,i)=>{return left+i*size;}) .attr(y,top) .attr(width,size) .attr(height,size); //汉字 svg.selectAll(text.chars) .data(data) .enter() .append(text) .classed(chars,true) .attr(x,(d,i)=>{return left+i*size;}) .attr(y,top+size-20) .style(font-size, 200px) .style(font-family, Kaiti) .attr(fill,black) .text(d=>{return d;}); } createChar(chars); </script> </body> </html>