html使用canvas,svg绘制方格,并在方格上放圆点

一、绘制canvas图

1、html文件

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		
		<link href="css/index-canvas.css" rel="stylesheet" type="text/css"/>
	</head>
	<body>
		<div id="container">
			<div id="title-container">canvas(非矢量图)</div>
			<canvas id="myCanvas"/>
		</div>
	</body>
	
	<script type="text/javascript">
		//获取上下文
		var canvas=document.getElementById("myCanvas");
		var cxt=canvas.getContext("2d");
		
		//获取canvas宽高(style内设置, clientWidth 含padding)
		var bodyWidth = canvas.clientWidth;
		var bodyHeight = canvas.clientHeight;
		//设置canvas宽高
		canvas.width = bodyWidth;
		canvas.height = bodyHeight;
		
		//设置列
		var cellNum = 10;
		//设置行
		var rowNum = 4;
		//偏移量
		var offiset = 20;
		//线条长度
		var xLineLength = (bodyWidth - offiset * 2);
		var yLineLength = (bodyHeight - offiset * 2);
		
		//单元格宽高
		var cellWidth = xLineLength / cellNum;
		var cellHeight = yLineLength / rowNum;
		
		//绘制方格
		for(var row=0; row<=rowNum; row++) {
			//绘制行线
			var y = row * cellHeight + offiset;
			cxt.moveTo(offiset, y);
			cxt.lineTo(xLineLength+offiset, y);
		}
		var xData = [];
		for(var cell=0; cell<=cellNum; cell++) {
			//绘制列线
			var x = cell * cellWidth + offiset;
			xData[cell] = x;
			cxt.moveTo(x, offiset);
			//lineLength + offiset: 获取终点位置
			cxt.lineTo(x, yLineLength+offiset);
		}
		//线条
		cxt.lineWidth=1;
		cxt.strokeStyle="#c3c3c3";
		cxt.stroke();
		
		//绘制圆点
		var redData = [1, 2,, 4, 1];//红点
		var greenData = [3,0,,,,,2,,,4];//绿点
		for(var xIndex in xData) {
			var redNum = redData[xIndex];
			if(redNum >= 0) {
				createPointer(redNum, xIndex, 1);
			}
			var greenNum = greenData[xIndex];
			if(greenNum >= 0) {
				createPointer(greenNum, xIndex, 2);
			}
		}
		
		function createPointer(data, index, colorNum) {
			//绘制圆点
			cxt.beginPath();
			var pointerX = xData[index];
			var pointerY = data * cellHeight + offiset;
			
			// 创建渐变色:渐变开始圆x,渐变开始圆y,渐变开始圆r,渐变结束圆x,渐变结束圆y,渐变结束圆r
			var grd=cxt.createRadialGradient(pointerX,pointerY,5,pointerX,pointerY,21);
			var color = "black";
			if(colorNum == 1) {
				color = "red";
			} else if(colorNum == 2) {
				color = "green";
			}
			grd.addColorStop(0,color);
			grd.addColorStop(1,"white");
			cxt.fillStyle=grd;
			
			//线条
			cxt.strokeStyle="#fff";
			
			cxt.arc(pointerX,pointerY, 20, 0, 2*Math.PI);
			cxt.fill();//绘制,含颜色
			cxt.stroke();
		}
	</script>
</html>

2、css文件

* {
	margin: 0;
	padding: 0;
	width: 100%;
	height: 100%;
}

body{
	background-color: #333;
}
#container{
	position: relative;
	border: 3px solid #333;
	border-radius: 30px;
	width: calc(100% - 6px);
	height: calc(100% - 6px);
	background-color: #fff;
}

#title-container{
	width: 100%;
	height: 80px;
	line-height: 80px;
	font-size: 3rem;
	text-align: center;
}
#myCanvas{
	width: calc(100% - 60px);
	height: calc(100% - 100px);
	margin-left: 30px;
}

3、效果

二、绘制svg图

1、html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<link href="css/index-svg.css" rel="stylesheet" type="text/css"/>
	</head>
	<body>
		<div id="container">
			<div id="title-container">svg(矢量图)</div>
			<svg  id="mySvg"></svg>
		</div>
	</body>
	
	<script type="text/javascript">
		var svg = document.getElementById("mySvg");
		//获取canvas宽高(style内设置, clientWidth 含padding)
		var bodyWidth = svg.clientWidth;
		var bodyHeight = svg.clientHeight;
		//设置列
		var cellNum = 10;
		//设置行
		var rowNum = 4;
		//偏移量
		var offiset = 20;
		
		//线条长度
		var xLineLength = (bodyWidth - offiset * 2);
		var yLineLength = (bodyHeight - offiset * 2);
		
		//单元格宽高
		var cellWidth = xLineLength / cellNum;
		var cellHeight = yLineLength / rowNum;
		
		var htmlText = ``;
		//绘制行
		for(var index=0; index <= rowNum; index++) {
			var xStart = offiset;
			var xEnd = xLineLength + offiset;
			var y = index * cellHeight + offiset;
			htmlText += `<line x1="${xStart}" y1="${y}" x2="${xEnd}" y2="${y}" style="stroke:#c3c3c3;stroke-width:1"/>`
		}
		//绘制列
		for(var index=0; index <= cellNum; index++) {
			var yStart = offiset;
			var yEnd = yLineLength + offiset;
			var x = index * cellWidth + offiset;
			htmlText += `<line x1="${x}" y1="${yStart}" x2="${x}" y2="${yEnd}" style="stroke:#c3c3c3;stroke-width:1"/>`
		}
		
		//圆点样式
		htmlText += `
			<defs>
				<radialGradient id="grad1" cx="50%" cy="50%" r="50%" fx="50%" fy="50%">
				  <stop offset="0%" style="stop-color:red; stop-opacity:1" />
				  <stop offset="100%" style="stop-color:white;stop-opacity:1" />
				</radialGradient>
			</defs>
		`
		//绘制圆点,例: (1,1)(2,2)位置
		htmlText += `
			<circle cx="${cellWidth + offiset}" cy="${cellHeight + offiset}" r="20" stroke="black" stroke-width="0" fill="url(#grad1)"/>
			<circle cx="${cellWidth * 2 + offiset}" cy="${cellHeight * 2 + offiset}" r="20" stroke="black" stroke-width="0" fill="url(#grad1)"/>
		`
		//插入html
		svg.innerHTML = htmlText;
	</script>
</html>

 2、css

* {
	margin: 0;
	padding: 0;
	width: 100%;
	height: 100%;
}

body{
	background-color: #333;
}
#container{
	position: relative;
	border: 3px solid #333;
	border-radius: 30px;
	width: calc(100% - 6px);
	height: calc(100% - 6px);
	background-color: #fff;
}

#title-container{
	width: 100%;
	height: 80px;
	line-height: 80px;
	font-size: 3rem;
	text-align: center;
}
#mySvg{
	width: calc(100% - 60px);
	height: calc(100% - 100px);
	margin-left: 30px;
}

3、效果

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值