最终要实现的效果:
我们先用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>