目录

1. canvas 简介

2. canvas 标签介绍

3. canvas 上下文 Context

4. 案例:在 canvas 画布中绘制表格

5. canvas 的 beginPath 状态

6. 绘制矩形 rect

7. 绘制圆形 arc

8. 案例:根据一组数据绘制饼状图


1. canvas 简介

canvas 是HTML5 提供的一种新标签 ,与 div 类似,是一个矩形的画布,它可以支持 JavaScript 在上面绘画,控制每一个像素;canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法,可以使得页面更加丰富多彩。当前 canvas 广泛应用于游戏、可视化数据(echarts)、广告等领域。

2. canvas 标签介绍

canvas 其实就是一个普通的 HTML 标签,需要进行闭合,可以设置宽高、背景色属性,但宽高单位必须是 px,否则就会被忽略;一个 canvas 默认为 300*150 像素。

需要注意 canvas 元素的宽高必须使用它自带的属性进行设置,而不要用 CSS 选择器控制 canvas 的宽高,否则会造成图像拉伸,除宽高之外的其余属性则可用 CSS。如下简单案例:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>canvas标签</title><style>#can1 {background-color: cadetblue;border: 2px solid red;}</style>
</head><body><!-- 设置宽高使用canvas标签的属性 --><canvas id="can1" width="300px" height="150px"></canvas>
</body></html>

效果如下:

3. canvas 上下文 Context

Context 是 canvas 的上下文,也就是绘制环境,它是所有绘制操作 api 的入口或者集合;canvas 本身是无法绘制任何内容的,需要使用 JavaScript 进行操作。而 Context 正是 JavaScript 操作 canvas 的接口。

获取上下文分为两步:首先获取 canvas 标签,然后再获取该标签的上下文;

<script>// 1.DOM操作获取canvas标签var canvas = document.getElementById('can1');// 2.获取canvas的上下文(2d渲染)var ctx = canvas.getContext('2d');
</script>

获取 canvas 上下文之后,就可以在画布上进行图形绘制了;上下文 Context 相关属性如下:

(ctx 是博主定义的获取到的上下文 Context 的变量名,可以随意更换,以下介绍都用ctx)

  • **ctx.moveTo(x,y);**将画笔移动到坐标(x,y)位置

  • **ctx.lineTo(x,y);**从当前位置绘制直线到坐标(x,y)位置

  • **ctx.closePath();**关闭路径,闭合线条

  • **ctx.lineWidth;**线宽

  • **ctx.strokeStyle;**描边颜色,必须用于描边之前

  • **ctx.stroke();**渲染直线,相当于描边

  • **ctx.fillStyle;**填充颜色,必须用于填充之前

  • **ctx.fill();**填充,默认为黑色

接下来我们结合这些属性绘制一个简单的正方形:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>canvas标签</title><style>#can1 {background-color: rgb(204, 216, 216);border: 2px solid red;}</style>
</head><body><!-- 设置宽高使用canvas标签的属性 --><canvas id="can1" width="600px" height="500px"></canvas>
</body><script>// DOM操作获取canvas标签var canvas = document.getElementById('can1');// 获取canvas的上下文(2d渲染)var ctx = canvas.getContext('2d');// 绘制长方形ctx.moveTo(100, 100); //将画笔移动到坐标 100 100ctx.lineTo(200, 100); //从画笔位置绘制直线到坐标 200 100ctx.lineTo(200, 200); //从当前位置绘制直线到 200 200ctx.lineTo(100, 200); //.从当前位置...ctx.closePath(); //闭合线条ctx.lineWidth = 6; //线宽ctx.strokeStyle = 'red'; //描边颜色ctx.stroke(); //渲染直线(描边)ctx.fillStyle = 'blue'; //填充颜色ctx.fill(); //填充
</script></html>

效果如下:

4. 案例:在 canvas 画布中绘制表格

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>案例:绘制表格</title><style></style>
</head><body><div><canvas id="table"></canvas></div>
</body>
<script>(function () {var canvas = document.getElementById('table'); //获取canvas标签var ctx = canvas.getContext('2d'); //获取上下文//设置画布宽高、边框(边框也可使用CSS选择器来设定)canvas.width = 600;canvas.height = 400;canvas.style.border = '2px solid #000';//设置上下文样式ctx.lineWidth = .5;ctx.strokeStyle = '#999';//绘制表格var rect_hei = 20; //定义每一行高20pxvar rect_wit = 40; //定义每一列宽40pxfor (var i = 0; i < canvas.width / rect_hei; i++) { //循环绘制//绘制横线ctx.moveTo(0, i * rect_hei); //从x轴为0的位置开始,每隔一个行高便绘制横线ctx.lineTo(canvas.width, i * rect_hei);ctx.stroke();//绘制竖线ctx.moveTo(i * rect_wit, 0); //从y轴为0的位置开始,每隔一个列宽便绘制竖线ctx.lineTo(i * rect_wit, canvas.height);ctx.stroke();}}())
</script></html>

效果如下:

5. canvas 的 beginPath 状态

需要知道,在 canvas 画布中绘制图形是基于状态的,意思就是说如果前面已经设置了描边颜色属性 strokeStyle 为某个颜色,那么在这之后的绘制当中,所有线条都会是这个颜色;如果再次设置描边颜色,则所有线条都会成为最新设置的颜色,前面设置的都被覆盖,无法做到颜色不一。如下:

而这个时候,为了能够绘制出不同颜色的线条,就需要使用到 beginPath 开启新状态;

  • ctx.beginPath();开启新状态的绘图,前面的设置不会被覆盖;新状态可以继承之前状态的样式,但是在新状态中设置的样式就只能作用在新状态当中。

如下案例:

6. 绘制矩形 rect

如果只是按照步骤:起点 --> 画线 --> 描边 一步一步的绘制一个矩形的话,就太麻烦了,canvas 也提供了一种快速绘制矩形的方法 rect,并且提供了各种属性。语法如下:

  • **ctx.rect(x, y, width, height);**x, y为矩形左上角坐标, width 和 height 以像素 px 为单位,该语法只规定了矩形的路径,没有填充和描边。
  • **ctx.strokeRect(x, y, width, height);**描边矩形,结合绘制与描边。
  • **ctx.fillRect(x, y, width, height);**填充矩形,结合绘制与填充
  • **ctx.clearRect(x, y, width, height);**清除矩形,相当于橡皮擦,在该矩形范围内的图像都会被擦除。

我们使用 rect 语法绘制一个矩形,只需一句代码即可:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>绘制矩形</title><style></style>
</head><body><div><canvas id="table"></canvas></div>
</body>
<script>var canvas = document.getElementById('table'); //获取canvas标签var ctx = canvas.getContext('2d'); //获取上下文//设置画布宽高、边框(边框也可使用CSS选择器来设定)canvas.width = 600;canvas.height = 400;canvas.style.border = '2px solid #000';//快速绘制矩形ctx.rect(100, 100, 50, 50);ctx.stroke();//描边矩形ctx.strokeRect(200, 100, 50, 50);//填充矩形ctx.fillRect(300, 100, 50, 50);
</script></html>

效果如下:

7. 绘制圆形 arc

  • **ctx.arc(x,y,r,sAngle,eAngle,counterclockwise);**x、y 为圆心点坐标;r 半径;sAngle 开始角度,圆心到最右边点为 0 度,顺时针方向依次增大;eAngle 结束角度,注意用的是弧度 Π(180°);counterclockwise:是否是逆时针,true 是逆时针,false 顺时针。

接下来,我们使用 arc 绘制一个圆弧,效果如下:

(提示:弧度与角度的转换公式,角度 = 度数 * Math.PI / 180

8. 案例:根据一组数据绘制饼状图

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>绘制饼状图</title><style></style>
</head><body><div><canvas id="table"></canvas></div>
</body>
<script>var canvas = document.getElementById('table'); //获取canvas标签var ctx = canvas.getContext('2d'); //获取上下文//设置画布宽高、边框(边框也可使用CSS选择器来设定)canvas.width = 600;canvas.height = 400;canvas.style.border = '2px solid #000';//定义饼状图数据var data = [{'value': 0.2,'color': '#149985','title': '城市A'},{'value': 0.3,'color': 'red','title': '城市B'},{'value': 0.4,'color': 'blue','title': '城市C'},{'value': 0.1,'color': '#999999','title': '城市D'},]//绘制饼状图var tempAngle = -90; //从-90°开始绘制for (var i = 0; i < data.length; i++) {ctx.beginPath(); //每一次循环都绘制不同的扇区,所以都要开启新状态ctx.moveTo(200, 200); //每一次都回到圆心点开始绘制var angle = data[i].value * 360; //每一个扇区的角度ctx.fillStyle = data[i].color; //颜色填充按照数据遍历var startAngle = tempAngle * Math.PI / 180; //起始角度var endAngle = (tempAngle + angle) * Math.PI / 180; //每一次的结束角度=起始角度+扇区角度ctx.arc(200, 200, 100, startAngle, endAngle);tempAngle = tempAngle + angle; //每次绘制完一次扇区起始角度为原角度加该扇区角度ctx.fill();}
</script></html>

案例效果如下:

饼状图文字的绘制等参见下期:H5画布 canvas 入门到精通 _ 第二部分


小结:canvas 绘制基本步骤

  • 获得上下文:canvas.getContext(‘2d’)
  • 开始新状态绘制:ctx.beginPath()
  • 画笔起始点:ctx.moveTo(x, y)
  • 绘制线:ctx.lineTo(x, y)
  • 闭合路径:ctx.closePath()
  • 描边:ctx.stroke()

三篇文章速通 canvas:

第一部分:canvas介绍,绘制圆形、矩形;
第二部分:绘制文字、图片、坐标系,canva颜色和样式,绘制环境;
第三部分:canvas库Konva.js的使用。

先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

H5画布 canvas(一)canvas简介、绘制圆形矩形、案例饼状图绘制相关推荐

  1. H5画布 canvas(一)canvas简介、绘制圆形/矩形、案例饼状图绘制

    目录 1. canvas 简介 2. canvas 标签介绍 3. canvas 上下文 Context 4. 案例:在 canvas 画布中绘制表格 5. canvas 的 beginPath 状态 ...

  2. QT绘制嵌套的圆饼状图

    QT绘制嵌套的圆饼状图 项目简介 项目技术 项目展示 主要源码片段解析 获取完整项目源码传送门 项目简介 使用QPieSeries API创建嵌套的甜甜圈图. 项目技术 qt5.12,qt chart ...

  3. 淘宝商品信息爬取,实现词云,并进行饼状图绘制及效果图

    对应json文件地址:https://blog.csdn.net/nicholas_K/article/details/86094530 1. 获取了淘宝手机商品的评论和追评 2. 对淘宝评论进行了词 ...

  4. android自定义View: 饼状图绘制(四)

    本系列自定义View全部采用kt 系统mac android studio: 4.1.3 kotlin version1.5.0 gradle: gradle-6.5-bin.zip 本篇效果: 画矩 ...

  5. 用python把数据画成饼状图_Python学习第92课——数据可视化之饼状图绘制

    [每天几分钟,从零入门python编程的世界!] 假如一个行业只有ABCD四个公司,我们想要用图表展现,它们各自每年的生产总额,占整个行业的比例是多少,这时我们用饼状图(pie chart)更好. 假 ...

  6. 使用matplotlib绘制图形(条形图,饼状图,散点图,直方图)

    安装 pip install matplotlib 图形的基础绘制 from matplotlib import pyplot as plt# 设置图形大小,figure图形图像的意思,在这里指的是我 ...

  7. 怎么让饼状图里面显示百分比_教你用matplotlib绘制带有负值的饼状图

    matplotlib官网示例中给出了很多简单易用的饼图绘制范例,这里先在官网范例的基础上,做一个简单的总结. 利用函数ax1.pie绘制饼状图,传入的参数分别为: sizes 切片大小 explode ...

  8. Qt绘制柱状图BarChart、饼状图PieChart、堆叠柱状图StackedChart、散点图ScatterChart

    一.效果展示 二.工程中添加charts模块 三.在工程布局文件中放一块Graphics View,然后右键提升为QChartView,每个Tab都一样.如下图 四.更改控件名,如下图所示 五.Mai ...

  9. 前端基础学习之h5-canvas入门3-曲线的绘制及绘制完整饼状图

    canvas直线绘制及绘制完整折线图 canvas一些基础的概念在直线绘制中已经提过.下面主要提曲线和文本绘制,以完成一个完整饼状图的绘制. (一)曲线的绘制 弧度概念 1 弧度 = 1 r(半径) ...

最新文章

  1. You Don't Know JS: Scope Closures(翻译)
  2. EASYHOOK逆向寒假生涯(20/100)
  3. 【面试必备】通俗易懂的XGBoost、Transformer、BERT、水波网络原理解析
  4. MyBatis 源码解读-settingsElement(settings)
  5. flask中 app.run(host='0.0.0.0', port=5000, debug=False) 不能用外网ip访问的解决办法
  6. [html] 图片上传时实现本地预览功能的原理是什么?
  7. Modelsim 后仿真操作步骤之二——用Modelsim单独进行后仿真
  8. vue 自定义键盘组件_vue 自定义 数字键盘+mint UI MessageBox的应用
  9. 书信用语“商祺”是的意思
  10. 2021年11月_IEEE TRANSACTIONS ON MEDICAL IMAGING_科技前言热点调研表
  11. enum ordinal_Java Enum ordinal()方法与示例
  12. 写论文不会写摘要,演讲不会写开场白,不会写广告词,SCQA模型帮你搞定
  13. (综述)微信聊天记录导出制作年度报告方法和相关软件
  14. IE打印A4,表格缩小问题剖析
  15. 为Go语言GC正名-20秒到100微妙的演变史
  16. sam卡和sim卡区别_什么是PSAM卡、SAM卡、SIM卡
  17. BootLoader——嵌入式系统的引导加载程序
  18. php配置本地一个新的虚拟主机
  19. 重庆市行政边界划分矢量图
  20. 运用c++打印一个日历

热门文章

  1. A,B,C类网络子网掩码
  2. 隐马尔科夫模型(HMM)择时应用的量化策略
  3. 苹果开发者账号申请 .cer 证书
  4. win10系统常用办公技巧
  5. 荣耀v8 android8,荣耀8/V8在列! 荣耀两年前老机型开始推送Android 8.0
  6. Vue3多选框(Checkbox)
  7. 为论文《xml数据库在移动系统中应用研究》所做的文献综述报告
  8. 病毒木马查杀第002篇:熊猫烧香之手动查杀
  9. 【开源项目】智慧机房~国企某大数据中心机房数字孪生可视化项目——开源工程及源码
  10. php SQL 生成 导航 代码,帝国cms模板利用php实现无限级导航的代码,可以指定ID