canvas画布 案例——1、心电图 2、绘制矩形——柱状图 3、挂钟 4、饼状图 5、评分空间——五角星 6、动图

目录

1、心电图

2、绘制矩形——柱状图

3、挂钟

4、饼状图

5、评分空间——五角星

6、动图


1、心电图

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title></title>
</head>
<body>
    <style>
        #box {
            border: 1px solid black;
        }
    </style>
    <canvas id="box" width="400px" height="400px"></canvas>
    <script>
        var canvas = document.querySelector("#box")
        var ctx = canvas.getContext("2d") //context 上下文(代码):用的技术是由底层实现的,我们写的是上层代码,直接调用,使用下层代码
        var arr = [50, 30, 40, 50, 52, 54, 57, 80, 42, 60,70,50,40,60,40]
        var x = 30   //用于后面绘制心电图x y值
        //让数组每一秒加一个元素
        setInterval(()=>{
            arr.push(Math.random()*(120-50)+50)   //代表取随机的人的心跳:范围:50-120
        },1000)
        setInterval(()=>{     // 让心电图动起来
            canvas.width=400  //清除画板
            x-=(30/(1000/30))   //让心电图等比例的动
            biaoge()
            zuobiao()
            xindian()
        },30)
        //绘制表格
        function biaoge() {
            ctx.beginPath()
            ctx.lineWidth = 1
            ctx.strokeStyle = "black"
            var m = 10
            for (var i = 0; i < parseInt(400 / m); i++) {
                //横线
                ctx.moveTo(0, i * m)
                ctx.lineTo(400, i * m)
                //竖线
                ctx.moveTo(i * m, 0)
                ctx.lineTo(i * m, 400)
            }
            ctx.stroke()
        }
        //绘制坐标
        function zuobiao() {
            ctx.beginPath()
            ctx.strokeStyle = "green"
            ctx.lineWidth = 1
            //x轴
            ctx.moveTo(20, 380)
            ctx.lineTo(20, 20)
            ctx.lineTo(10, 30)
            ctx.moveTo(20, 20)
            ctx.lineTo(30, 30)
            //y轴
            ctx.moveTo(20, 380)
            ctx.lineTo(380, 380)
            ctx.lineTo(370, 370)
            ctx.moveTo(380, 380)
            ctx.lineTo(370, 390)
            ctx.stroke()
        }
        //画心电图
        function xindian() {
            ctx.beginPath()
            ctx.strokeStyle = "blue"
            ctx.lineWidth = 5
            for (var i = 0; i < arr.length; i++) {
                ctx.lineTo(i*30+x, 300 - arr[i])

            }
            ctx.stroke()
        }
    </script>
</body>
</html>

2、绘制矩形——柱状图

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<style>
    #box {
        border: 1px solid red
    }
</style>
<body>
    <canvas id="box" width="600" height="600"></canvas>
    <script>
        var canvas=document.querySelector("#box")
        var ctx=canvas.getContext("2d")
        var arr=[1000,800,799,789,699,540,799]
        ctx.lineTo(50,500)
        ctx.lineTo(580,500)
        ctx.stroke()
        var h=450/Math.max(...arr)   //450是整个柱状图最高的高度,除以数组中最大的数就是得到一个比例,后面每个柱状图就可以等比例的得到相应高度
        for(var i=0;i<arr.length;i++) {
            ctx.fillStyle="pink"
            ctx.fillRect(100+i*70,500-h*arr[i],50,h*arr[i])
            //x:100+i*70  100是距离左边100开始,然后每一个柱状图50宽度,20的间距,所以i*70
            // y:500-h*arr[y:i]  因为横线下面有100,上面就剩下500,用500-柱状图的高度=柱状图上面顶点的y轴
        }
    </script>
</body>
</html>

3、挂钟

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<style>
			#box {
				border: 1px gray solid;
			}
		</style>
		<canvas id="box" width="600" height="600"></canvas>
		<script>
			var canvas = document.querySelector("#box")
			var ctx = canvas.getContext("2d")
			var deg = Math.PI / 180
			function biaopan(){
				//画一个圆
				var r=200
				var y1=300
				var x1=300
				var kedu=10
				ctx.arc(x1, y1, r, 0, 360 * deg)
				//画圆中的刻度
				var startAnge=6;   //圆360度,分为60个刻度,每一格就是6度
				for(let i=0;i<60;i++){   //60是指表盘中有60个刻度
					let a;
					if(i%5){a=kedu}  //i%5如果为true,就代表它除不尽5,就是秒针最短的长度
					else{a=kedu*2}	 //等于false,就代表整点 1 2 3,就是长一点			
					var y2=y1+r*Math.sin(i*startAnge*deg)   //代表每一个刻度的y轴的值
					var x2=x1+r*Math.cos(i*startAnge*deg)
					var y3=y1+(r-a)*Math.sin(i*startAnge*deg)   //代表刻度长度从圆上面延申到圆内的y轴值
					var x3=x1+(r-a)*Math.cos(i*startAnge*deg)
					ctx.moveTo(x2,y2)  //将两个点连接起来,作为刻度
					ctx.lineTo(x3,y3)
				}			
				ctx.stroke()
			}
			//绘制表中 秒针、分针、时针
			function biaozhen(){
				var sh=160  //秒针的长度
				var hh=100  //时针的长度
				var mh=140  //分针的长度
				//思想:不管是秒针、分针、时针,盘上60个刻度都会走
				//一秒钟:秒针走6度,分针走6/60度,时针0.5/60度
				var s=new Date().getSeconds()//获取当前时间的秒数
				//秒针
				ctx.moveTo(300,300)
				var y4=300+sh*Math.sin(s*6*deg)  //算出当前秒数下,相对应的秒针的坐标
				var x4=300+sh*Math.cos(s*6*deg)
				ctx.lineTo(x4,y4)   //与圆心相连接
				//时针
				ctx.moveTo(300,300)
				var y5=300+hh*Math.sin(s*0.5/60*deg)
				var x5=300+hh*Math.cos(s*0.5/60*deg)
				ctx.lineTo(x5,y5)
				//分针
				ctx.moveTo(300,300)
				var y5=300+mh*Math.sin(s*6/60*deg)
				var x5=300+mh*Math.cos(s*6/60*deg)
				ctx.lineTo(x5,y5)
				ctx.stroke()
			}
			setInterval(()=>{
				canvas.width=canvas.width
				biaopan()
				biaozhen()
			},1000)
		</script>
	</body>
</html>

4、饼状图

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title></title>
</head>
<body>
    <style>
        #box {
            border: 1px solid black;
        }
    </style>
    <canvas id="box" width="400" height="400"></canvas>

    <script>
        var canvas = document.querySelector("#box")
        var ctx = canvas.getContext("2d")
        var deg = Math.PI / 180
        //给出数据,算每一个物品花费的占比
        var arr = [{
            name: "衣服",
            money: 8000
        }, {
            name: "car",
            money: 2000
        }, {
            name: "food",
            money: 7000
        }, {
            name: "cash",
            money: 1000
        }, {
            name: "cash2",
            money: 5000
        }, {
            name: "cash3",
            money: 5400
        }]
        var total = 0
        var start = 45 //饼状图最开始的起点,可以随意设
        for (var i = 0; i < arr.length; i++) {
            total = total + arr[i].money //获取买所有物品的钱
        }
        arr.forEach((el) => {
            //给每一个闭合图形填充一个随机的颜色
            var r = parseInt(Math.random() * 255)
            var g = parseInt(Math.random() * 255)
            var b = parseInt(Math.random() * 255)
            ctx.fillStyle = `rgb(${r},${g},${b})`
            //开始画每一个板块的图形
            ctx.beginPath()
            var n = (el.money / total) * 360 //算出每一个钱占总数的比例,再乘以360,就得到相应的度数
            ctx.arc(200, 200, 100, start * deg, (start + n) * deg) //(start + n) * deg  这是每一个每一个板块距离饼状图起点位置的度数
            //绘制文本
            var tetxAngle = start + n / 2
            var leng = 130
            var x1 = 200
            var y1 = 200
            var y2 = y1 + leng * Math.sin( tetxAngle * deg) //代表每一个刻度的y轴的值
            var x2 = x1 + leng * Math.cos( tetxAngle * deg)
            ctx.fillText(el.name, x2, y2)
            //绘制扇形饼图
            start = start + n
            ctx.lineTo(200, 200) //画完曲线,就接着回到圆心
            ctx.fill()
            ctx.stroke()
        })
    </script>
</body>
</html>

5、评分空间——五角星

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<style>
			.rank {
				width: 400px;
				height: 50px;
				cursor: pointer;
			}
		</style>
		<h1>请给我五星好评哦</h1>
		<div class="rank"></div>
		<script>
			//画五角星
			Object.prototype.drawstar = function(x, y, r, color = "gray") {				
				this.beginPath()
				var deg = Math.PI / 180
				var startAngle = -90
				var arr = []
				for (var i = 0; i < 5; i++) {
					var point = {  //算出五角星 五个在圆上的点的坐标
						x: x + r * Math.cos((startAngle+i*72)*deg),  // 360/5=72度
						y: y + r * Math.sin((startAngle+i*72)* deg) 
					}
					arr.push(point)    //将每一个点放入到数组中
				}
				//024130  ==>五角星的五个点连线  按照顺序相连接成五角星
				this.moveTo(arr[0].x, arr[0].y)
				this.lineTo(arr[2].x, arr[2].y)
				this.lineTo(arr[4].x, arr[4].y)
				this.lineTo(arr[1].x, arr[1].y)
				this.lineTo(arr[3].x, arr[3].y)
				this.lineTo(arr[0].x, arr[0].y)
				this.fillStyle = color
				this.fill()
			}
			//判断鼠标在五角星的位置,让其变颜色
			Object.prototype.addrank = function(n=0,color="gray",activecolor="yellow") {
				var canvas = document.createElement("canvas")
				var ctx = canvas.getContext("2d")
				var r = this.offsetHeight   //盒子的高度   r是直径
				canvas.width = (this.offsetHeight + 5) * 5  //+5是五角星之间的间隔是5,*5是画五个五角星,需要五个宽度
				canvas.height = r  
				this.appendChild(canvas)  //this是下面的调用者rankdiv
				for (var i = 0; i < 5; i++) {
					if(i<n){  //将鼠标之前的五角星颜色变为黄色
						ctx.drawstar(r / 2 + r * i + 5, r / 2, r/2,activecolor)
					}else{  //将鼠标之后的五角星颜色变为黄色
						ctx.drawstar(r / 2 + r * i + 5, r / 2, r/2,color)
					}
				}
			}
		</script>
		<script>
			var rankdiv = document.querySelector(".rank")
			rankdiv.addrank()
			//判断鼠标的位置是第几个五角星
			rankdiv.onmousemove=function(e){
				var n=Math.ceil((e.pageX-this.offsetLeft)/(this.offsetHeight + 5))    //向上取整:比如3.5,就代表第四个五角星
				//(e.pageX-this.offsetLeft表示的是:鼠标距离左边页面的宽度- rankdiv距离左边页面的宽度=鼠标与rankdiv的距离
				//鼠标与rankdiv的距离来除以 每一个五角星的宽度(this.offsetHeight + 5)=就知道此鼠标在哪一个五角星上
				this.innerHTML=""   //先将页面置空
				this.addrank(n)
			}
		</script>
	</body>
</html>

6、动图

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title></title>
</head>
<body>
    <style>
        #box {
            border: 1px solid black;
        }
    </style>
    <canvas id="box" width="600" height="600"></canvas>
    <script>
        var canvas = document.querySelector("#box")
        var ctx = canvas.getContext("2d")
        //加一个精灵图,让整个精灵图动起来
        var img3 = new Image()
        img3.src = "img/hui.PNG"     //图片宽高:807   84
        img3.onload = function () {
            var i = 80.7
            var n = 0
            setInterval(() => {
                n++
                n=n%10   //10代表的是 图片里有10个小图片
                ctx.clearRect(20,200,80,84)
                //cx cy cw ch (剪图片的大小:cx和cy代表从图片哪个位置开始,cw和ch是代表取多大)    
                // dx dy dw dh(显示到屏幕上的位置:dx和dy表示将图片放在屏幕哪里,dw和dh表示让在多大的盒子里)
                ctx.drawImage(img3, n*80.7, 0, 80.7, 84, 20, 200, 80.7, 84)
            },200)
        }
    </script>
</body>
</html>

 

 

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值