canvas是H5新增的一个元素,可以用来描绘各种你想描绘的东西。

canvas本身没有绘制能力,你可以把它当做一个容器,需要我们用脚本,也就是js来给他灌满水。

兼容性

1. IE9版本以上、Firefox、Opera、Chrome 以及 Safari 支持 <canvas> 及其属性和方法。

2. IE8 以及更早的版本不支持 <canvas> 元素。

基本用法

要想使用canvas,大致分三步:

第一步:页面中添加canvas元素

第二步:给该元素添加标识,并设置宽高

第三步:获取该元素,使用getContent()方法获取绘制属性和方法,开始绘制

下面我们简单画一个长方形:

<body>
<canvas id="canvas-wrap" width="" height="">你的浏览器不支持canvas</canvas>
</body>
<script>
// 获取canvas元素
let canvasWrap = document.getElementById("canvas-wrap");
// 获取属性和方法
let context = canvasWrap.getContext("2d");
// 开始绘制
context.fillStyle="#FF0000";
context.fillRect(,,,);
</script>

页面效果:

路径:

使用canvas可以支持多种在画布上绘制路径的方法,从而可以勾勒出多种线条

案例一:画一个直角:

<body>
<canvas id="canvas-wrap" width="" height="">你的浏览器不支持canvas</canvas>
</body>
<script>
// 获取canvas元素
let canvasWrap = document.getElementById("canvas-wrap");
// 获取属性和方法
let context = canvasWrap.getContext("2d");
// 移动
context.moveTo(,);
// 线条
context.lineTo(,);
context.lineTo(,);
// 开始画
context.stroke();
</script>

案例二:画一条曲线

<body>
<canvas id="canvas-wrap" width="" height="">你的浏览器不支持canvas</canvas>
</body>
<script>
// 获取canvas元素
let canvasWrap = document.getElementById("canvas-wrap");
// 获取属性和方法
let context = canvasWrap.getContext("2d");
// 移动
context.moveTo(,);
// 创建二次贝塞尔曲线
context.quadraticCurveTo(,,,);
// 开始画
context.stroke();
</script>

附:贝塞尔曲线对照表:

ease:cubic-bezier(.25, .1, .25, 1)
liner:cubic-bezier(0, 0, 1, 1)
ease-in:cubic-bezier(.42, 0, 1, 1)
ease-out:cubic-bezier(0, 0, .58, 1)
ease-in-out:cubic-bezier(.42, 0, .58, 1)
In Out Back:cubic-bezier(0.68, -0.55, 0.27, 1.55)

案例三:画一个正方形并用绿色填充

<body>
<canvas id="canvas-wrap" width="" height="">你的浏览器不支持canvas</canvas>
</body>
<script>
// 获取canvas元素
let canvasWrap = document.getElementById("canvas-wrap");
// 获取属性和方法
let context = canvasWrap.getContext("2d");
// 移动
context.moveTo(,);
// 线条
context.lineTo(,);
context.lineTo(,);
context.lineTo(,);
context.lineTo(,);
// 颜色设置
context.fillStyle = "green";
// 填充
context.fill();
</script>

绘制矩形:

矩形是canvas给出的唯一能直接能用方法描绘的图形,他提供了四个方法。

案例:画两个矩形交叉,并清除叠加的部分:

<body>
<canvas id="canvas-wrap" width="" height="">你的浏览器不支持canvas</canvas>
</body>
<script>
// 获取canvas元素
let canvasWrap = document.getElementById("canvas-wrap");
// 获取属性和方法
let context = canvasWrap.getContext("2d");
//绘制一个矩形
context.fillStyle = "#1fb19e";
context.fillRect(, , , ); //绘制另一个矩形
context.fillStyle = "blue";
context.fillRect(, , , ); //将这两个矩形重叠的地方清除
context.clearRect(, , , );
</script>

文字:

1. canvas绘图上下文提供了2个绘制文本方法和一个相关方法

2. fillText()和strokeText()都可以接收4个参数:要绘制的文本字符串、x坐标、y坐标和可选的最大像素宽度。而measureText()接受一个参数,表示要测量的文本。

这三个方法共有的属性:

案例: 画一个200*100的矩形,文字水平居中

<body>
<canvas id="canvas-wrap" width="" height="">你的浏览器不支持canvas</canvas>
</body>
<script>
// 获取canvas元素
let canvasWrap = document.getElementById("canvas-wrap");
// 获取属性和方法
let context = canvasWrap.getContext("2d");
//绘制一个矩形
context.lineWidth=
context.strokeStyle="#1fb19e";
context.rect(,,,);
context.stroke()
// 绘制文字
let str = "Hello World";
context.font="30px Microsoft YaHei";
context.textAlign="center";
context.strokeText(str,,);
</script>

图片:

案例: 裁剪头像

<body style="display: flex">
<img src="https://pic1.zhimg.com/80/v2-66f0648db805932fd3e8a94fcdd58f36_hd.jpg" id="img" />
<canvas id="canvas-wrap" width="" height="" style="margin-left: 20px">你的浏览器不支持canvas</canvas>
</body>
<script>
let img = document.getElementById("img");
img.onload = function () {
// 获取canvas元素
let canvasWrap = document.getElementById("canvas-wrap");
let context = canvasWrap.getContext("2d");
context.drawImage(img,,,,,,,,);
}
</script>

效果:

canvas转换成图片:

<body>
<canvas id="canvas-wrap" width="" height="">你的浏览器不支持canvas</canvas>
</body>
<script>
// 获取canvas元素
let canvasWrap = document.getElementById("canvas-wrap");
// 获取属性和方法
let context = canvasWrap.getContext("2d");
//绘制一个矩形
context.lineWidth=
context.strokeStyle="#1fb19e";
context.rect(,,,);
context.stroke()
// 绘制文字
let str = "Hello World";
context.font="30px Microsoft YaHei";
context.textAlign="center";
context.strokeText(str,,);
//取得图像的数据URI
var url = canvasWrap.toDataURL("image/png"); //显示图像
var image = document.createElement("img");
image.src = url;
document.body.appendChild(image);
</script>

实战:

实战一: 钟表的画法

<body>
<canvas id="canvas-wrap" width="" height="">你的浏览器不支持canvas</canvas>
</body>
<script>
// 获取canvas元素
let canvasWrap = document.getElementById("canvas-wrap");
// 获取属性和方法
let ctx = canvasWrap.getContext("2d"); ctx.beginPath();
ctx.arc(,,,,*Math.PI); ctx.moveTo(,);
ctx.arc(,,,,*Math.PI);
ctx.stroke(); //变换原点
ctx.translate(,); ctx.textBaseline = "middle";
ctx.fillText('',,);
ctx.textAlign="center";
ctx.fillText('',,);
ctx.fillText('',-,);
ctx.fillText('',,-); ctx.moveTo(,);
ctx.lineTo(,);
ctx.moveTo(,);
ctx.lineTo(,-); ctx.stroke();
</script>

实战二:画一个简单的海报

<body>
<canvas id="canvas" width="" height=""></canvas>
<img src="20190802165310.jpg" id="img" alt="">
<img id="imgTwo" src="https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/w%3D268%3Bg%3D0/sign=0003b03088b1cb133e693b15e56f3173/0bd162d9f2d3572c257447038f13632763d0c35f.jpg" alt="">
</body>
<script>
var canvasWrap = document.getElementById("canvas");
var ctx = canvasWrap.getContext("2d");
var img = document.getElementById("img");
var imgTwo = document.getElementById("imgTwo");
// 画文字方法
function drawText (ctx,text,font,x,y) {
ctx.font=`${font}px Microsoft YaHei`;
ctx.strokeText(text,x,y);
}
img.onload = function () {
let arr = [
{
text:'马云,我想和你说',
font: ,
x: ,
y:
},
{
text:'不,你不说',
font: ,
x: ,
y:
},
{
text:'是什么让我唱出《西海情歌》?',
font: ,
x: ,
y:
}
]
// 图片
ctx.drawImage(img,,);
ctx.drawImage(imgTwo,,,,);
// 矩形
ctx.fillStyle = "#1fb19e"
ctx.fillRect(, , ,);
ctx.fillRect(, , ,);
ctx.fillRect(, , ,);
// 文字
ctx.strokeStyle = "#fff";
arr.forEach(el => {
let { text, font, x, y} = el
drawText(ctx, text, font, x, y)
})
}
</script>

效果:

实战三:画一个柱状图

<body>
<canvas id="canvas" width="" height=""></canvas>
</body>
<script>
var ocanvas = document.getElementById("canvas");
var mycanvas = ocanvas.getContext("2d");
var arr = [,,,,,,,,,,,]; //第一先画xy轴
function line(aX,aY,bX,bY) {//开始和结束的横坐标 开始和结束的纵坐标
mycanvas.beginPath();
mycanvas.moveTo(aX,aY);
mycanvas.lineTo(bX,bY);
mycanvas.stroke();
}
line(,,,);
line(,,,); //第二用for循环 画11条线 利用上面line的画线方法
for(var i=;i<;i++){
//300,80,900,80
//300,120,900,120
line(,+i*,,+i*);
write(-i*,,+i*) }
//第三定义一个矩形的函数方法
function rect(X,Y,width,height) {
mycanvas.beginPath();
mycanvas.fillStyle="#abcdef";
mycanvas.rect(X,Y,width,height);
mycanvas.fill();
mycanvas.closePath()
} //第四定义一个方法 绘制横纵坐标
function wenrect() {
for(var i=;i<;i++){
var width=;
var height=arr[i]*;
var X=+i*+i*;
var Y=-height;
rect(X,Y,width,height);
write((i+)+"月",+i*+i*,)
}
}
wenrect(); //添加字
function write(start,ox,oy) {
mycanvas.beginPath();
mycanvas.fillStyle = "black";
mycanvas.fillText(start,ox,oy);
mycanvas.closePath();
}
</script>

效果:

canvas---从基础到实战的更多相关文章

  1. HTML5 Canvas(画布)实战编程初级篇:基本介绍和基础画布元素

    欢迎大家阅读HTML5 Canvas(画布)实战编程初级篇系列,在这个系列中,我们将介绍最简单的HTML5画布编程.包括: 画布元素 绘制直线 绘制曲线 绘制路径 绘制图形 绘制颜色,渐变和图案 绘制 ...

  2. Node.js基础与实战

    Node.js基础与实战 Node.jsJS高级进阶 NODE原理与解析 REPL交互环境 模块与NPM Buffer缓存区 fs文件操作 Stream流 TCP&UDP 异步编程 HTTP& ...

  3. Android中Canvas绘图基础详解(附源码下载) (转)

    Android中Canvas绘图基础详解(附源码下载) 原文链接  http://blog.csdn.net/iispring/article/details/49770651   AndroidCa ...

  4. RabbitMQ-从基础到实战(3)— 消息的交换

    1.简介 在前面的例子中,每个消息都只对应一个消费者,即使有多个消费者在线,也只会有一个消费者接收并处理一条消息,这是消息中间件的一种常用方式.还有另外一种方式,生产者生产一条消息,广播给所有的消费者 ...

  5. RabbitMQ-从基础到实战(2)— 防止消息丢失

    转载请注明出处 1.简介 RabbitMQ中,消息丢失可以简单的分为两种:客户端丢失和服务端丢失.针对这两种消息丢失,RabbitMQ都给出了相应的解决方案. 2.防止客户端丢失消息 如图,生产者P向 ...

  6. RabbitMQ-从基础到实战(1)— Hello RabbitMQ

    转载请注明出处 1.简介 本篇博文介绍了在windows平台下安装RabbitMQ Server端,并用JAVA代码实现收发消息 2.安装RabbitMQ RabbitMQ是用Erlang开发的,所以 ...

  7. RabbitMQ-从基础到实战(4)— 消息的交换(下)

    0.目录 RabbitMQ-从基础到实战(1)- Hello RabbitMQ RabbitMQ-从基础到实战(2)- 防止消息丢失 RabbitMQ-从基础到实战(3)- 消息的交换(上) 1.简介 ...

  8. RabbitMQ-从基础到实战(5)— 消息的交换(下)

    转载请注明出处 0.目录 RabbitMQ-从基础到实战(1)- Hello RabbitMQ RabbitMQ-从基础到实战(2)- 防止消息丢失 RabbitMQ-从基础到实战(3)- 消息的交换 ...

  9. RabbitMQ-从基础到实战(6)— 与Spring集成

    0.目录 RabbitMQ-从基础到实战(1)- Hello RabbitMQ RabbitMQ-从基础到实战(2)- 防止消息丢失 RabbitMQ-从基础到实战(3)- 消息的交换(上) Rabb ...

  10. canvas绘画基础(一):认识canvas画布

    html5提供了一个<canvas>标签,结合javascript的canvas api接口可以用来绘制图形和动画.最近工作中涉及到画图的任务,下面来了解一下canvas的基础:canva ...

随机推荐

  1. MFC的DoModal(转)

    DoModal会产生模态对话框(有模式的对话框,有“是”或者“否”供用户选择),函数运行到此处后不会马上返回,会等待用户的响应(响应后对话框销毁),在此对话框未销毁前,其他窗口不会接收到用户的输入(注 ...

  2. Syntax behind sorted(key=lambda :)

    I think all of the answers here cover the core of what the lambda function does in the context of so ...

  3. 02 spring security 自定义用户认证流程

    1. 自定义登录页面 (1)首先在static目录下面创建login.html       注意: springboot项目默认可以访问resources/resources, resources/s ...

  4. 使用PowerShell下载必应图片

    今天想聊聊POWERSHELL对于WEB页面的一些应用,本人也是最近才发觉其实PS也是可以做爬虫的...所以想抛砖引玉给大家一个思路. 这次要用到的主要命令是 invoke-webrequest 先来 ...

  5. php str_repeat()函数 语法

    php str_repeat()函数 语法 str_repeat()函数怎么用? php str_repeat()函数用于重复使用指定字符串,语法是str_repeat(string,repeat), ...

  6. 【CF1257B】Magic Stick【思维】

    题意:每次可以对a进行两种操作,1:如果是偶数,则变成3*a/2:2:变成a-1 显然当a=1时,b只能为1 a=2或3时,b只能为123 a>3时,b可以为任意数 代码: #include&l ...

  7. delphi按字节长度分割字符串函数(转)

    此字符串分割函数用delphi编写,可以适应字符串中存在双字节字符和单字节字符. function TricheditEfm.SplitString(source:string;Sleng:Integ ...

  8. CVE-2017-0213 | 记一次失败的提权经历

    环境: CVE-2017-0213下载 提权步骤: 提权失败.... 好迷啊,,,,事后查了一下补丁 我的wind7上也没装啊,然后防火墙也是关闭的 迷了迷了....

  9. [杂题]:group(状压DP+轮廓线)

    题目描述 $pure$在玩一个战略类游戏.现在有一个士兵方阵,每行有若干士兵,每个士兵属于某个兵种.行的顺序不可改变,且每一行中士兵的顺序也不可改变.但由于每一行都有$C$个位置($C$不小于任一行的 ...

  10. [CSP-S模拟测试]:Tourist Attractions(简单图论+bitset)

    题目描述 在美丽的比特镇一共有$n$个景区,编号依次为$1$到$n$,它们之间通过若干条双向道路连接.$Byteasar$慕名来到了比特镇旅游,不过由于昂贵的门票费,他只能负担起$4$个景区的门票费. ...