HTML5 Canvas(画布)

canvas是什么?

图片

简单来说,<canvas> 是HTML5中的标签,它是一个容器,可以使用JS在其中绘制图形或文字。

MDN<canvas>是一个可以使用脚本 (通常为JavaScript) 来绘制图形的 HTML 元素。例如,它可以用于绘制图表、制作图片构图或者制作简单的动画。主要聚焦于2D图形。

预备知识

canvas标签本身

canvas标签是一张画布,如果你写了一个canvas标签,打开live server,在支持canvas的浏览器上显示是这样的:

你可能会问怎么啥都没有呢?因为canvas标签只是一个默认长300像素,宽150像素的白色画布,你可以给它加上页面居中和box-shadow的css样式:

 如果你觉得这个画布太小了,施展不开,那么你可以通过标签属性来自定义宽高:

<canvas height="600" width="700"></canvas>

设置后:

这里注意,设置画布的宽高只能在html标签里通过height和width属性来设置(canvas标签有且只有这两个属性),如果你在css中设置:

canvas {
  height: 600px;
  width: 700px;
}

上边的这种方式只是将画布拉伸变形了,就好像拿放大镜看一样,会导致失真,其实它本质上的大小并没有变化,比如:

所以canvas的宽高还是要在html中使用标签属性设置。

支持的浏览器

IE已经有自己的墓碑了。。

那么如果你的浏览器不支持canvas呢?那么你canvas标签中的文字就派上用场了,浏览器上会显示出你canvas标签里的文字,比如:

<canvas>你的浏览器不支持canvas,快去升级浏览器吧!</canvas>

(为了演示方便,以下教程全部默认浏览器支持canvas,且给画布加上了居中和阴影效果。)

详细教程

基本步骤

我们以现实生活中画水墨画为例:如果我们要画一幅画,要有以下的准备步骤:

①首先要有一用来画画的纸;

②找到这张纸;

③决定是画二维还是三维的画

类比于canvas,也是这样的几个步骤:

①首先要有一用来画画的纸:

<!-- 创建canvas标签: -->
<canvas id="canvas" height="600" width="700"></canvas>

②找到这张纸:

// 我们现在要使用JS获得这个canvas标签的DOM对象:
<script>
    const canvas = document.getElementById('canvas')
</script>

③决定是画二维还是三维的画:

// 通过getContext()方法来获得渲染上下文和它的绘画功能:
<script>
    const ctx = canvas.getContext('2d') // 这里我们先聚焦于2D图形
</script>

坐标系

Canvas 使用的是 W3C 坐标系 ,也就是遵循我们屏幕、报纸的阅读习惯,从上往下,从左往右。

已经做好了准备工作,接下来就可以开始画画了!

一、绘制基础图形

1. 画线段

画线之前你需要知道canvas上下文的以下几个api:

moveTo(x,y):定义画线的起始点;

lineTo(x,y):定义画线的折点;

stroke():通过线条来绘制图形轮廓

完整代码:

<canvas id="canvas" height="600" width="700"></canvas>
<script>
    const canvas = document.getElementById('canvas')
    const ctx = canvas.getContext('2d')
    ctx.moveTo(200, 300) // 起点为(200,300)
    ctx.lineTo(500, 300)
    ctx.stroke()
</script>

当然,你也可以同时画多条折线:

<canvas id="canvas" height="600" width="700"></canvas>
<script>
    const canvas = document.getElementById('canvas')
    const ctx = canvas.getContext('2d')
    ctx.moveTo(10, 300)
    ctx.lineTo(100, 300)
    ctx.lineTo(100, 200)
    ctx.lineTo(200, 200)
    ctx.lineTo(200, 300)
    ctx.lineTo(300, 300)
    ctx.lineTo(300, 200)
    ctx.lineTo(400, 200)
    ctx.lineTo(400, 300)
    ctx.lineTo(500, 300)
    ctx.stroke()
    // 绘制第二条:
    ctx.moveTo(100, 400)
    ctx.lineTo(500, 500)
    ctx.stroke()
</script>

给线段设置样式

strokeStyle = '颜色':设置线的颜色;

lineWidth = 数字:设置线的宽度;

lineCap = 'round/butt/square':设置线帽为圆型/默认/方形;

lineJoin = 'miter/round/bevel':设置线段连接处为默认/圆形/平直形式;

globalAlpha = 数字:设置图案的透明度

一个简单的示例,设置一条线的线宽:

<canvas id="canvas" height="600" width="700"></canvas>
<script>
    canvas = document.getElementById("canvas");
    ctx = canvas.getContext("2d")
    ctx.moveTo(200, 300)
    ctx.lineTo(500, 300)
    ctx.lineWidth = 10 // 设置线宽为10像素
    ctx.stroke()
</script>

显示:

image-20221006104445983

这里有一个地方需要注意,就是样式的设置必须写在绘制图形轮廓(stroke())方法之前!否则会不生效!(因为stroke()方法是进行绘制,如果已经绘制了再设置线段的样式,自然会不生效) 

同时画多条线并分别设置样式

如果现在你画了两条宽20 像素圆角的线,并且想一条设置为红色,一条设置为天蓝色,那么你可能会这样写:

<canvas id="canvas" height="600" width="700"></canvas>
<script>
    const canvas = document.getElementById('canvas')
    const ctx = canvas.getContext('2d')
    ctx.moveTo(200, 200)
    ctx.lineTo(500, 200)
    ctx.strokeStyle = 'skyblue' // 设置为天蓝色
    ctx.lineWidth = 20
    ctx.lineCap = 'round'
    ctx.stroke()
    // 绘制第二条线:
    ctx.moveTo(200, 300)
    ctx.lineTo(500, 300)
    ctx.strokeStyle = 'red'
    ctx.lineWidth = 20
    ctx.lineCap = 'round'
    ctx.stroke()
</script>

但是显示的会是这样:

两条线都显示的是红色,这是因为第二条线的颜色“覆盖”了第一条线的颜色。如果我们想分别设置每条线的样式,就需要用到下面两个方法:

beginPath():开启一条新路径,生成之后,图形绘制命令会被指向到新路径上;

closePath():关闭上一条路径的绘制

在每条路径开始和结束的时候加上这两个方法即可分别设置两条线的样式:

<canvas id="canvas" height="600" width="700"></canvas>
<script>
    const canvas = document.getElementById('canvas')
    const ctx = canvas.getContext('2d')
    ctx.beginPath()
    ctx.moveTo(200, 200)
    ctx.lineTo(500, 200)
    ctx.strokeStyle = 'skyblue' // 设置为天蓝色
    ctx.lineWidth = 20
    ctx.lineCap = 'round'
    ctx.stroke()
    ctx.closePath()
    // 绘制第二条线:
    ctx.beginPath()
    ctx.moveTo(200, 300)
    ctx.lineTo(500, 300)
    ctx.strokeStyle = 'red'
    ctx.lineWidth = 20
    ctx.lineCap = 'round'
    ctx.stroke()
    ctx.closePath()
</script>

显示:

综合示例: 

<canvas id="canvas" height="600" width="700"></canvas>
<script>
    canvas = document.getElementById("canvas");
    ctx = canvas.getContext("2d")
    ctx.beginPath()
    ctx.moveTo(150, 200)
    ctx.lineTo(250, 100)
    ctx.lineTo(350, 200)
    ctx.lineTo(450, 100)
    ctx.lineTo(550, 200)
    ctx.lineWidth = 20
    ctx.strokeStyle = 'skyblue' // 设置颜色为天蓝色
    ctx.lineCap = 'round' // 设置线帽为圆形
    ctx.lineJoin = 'miter' // 设置线段连接处为默认形式
    ctx.stroke()
    ctx.beginPath()
    ctx.moveTo(150, 350)
    ctx.lineTo(250, 250)
    ctx.lineTo(350, 350)
    ctx.lineTo(450, 250)
    ctx.lineTo(550, 350)
    ctx.lineWidth = 10
    ctx.strokeStyle = 'red' // 设置线段颜色为红色
    ctx.lineCap = 'square' // 设置线帽为方形
    ctx.lineJoin = 'round' // 设置线段连接处为圆形
    ctx.stroke()
    ctx.beginPath()
    ctx.moveTo(150, 500)
    ctx.lineTo(250, 400)
    ctx.lineTo(350, 500)
    ctx.lineTo(450, 400)
    ctx.lineTo(550, 500)
    ctx.lineWidth = 30
    ctx.strokeStyle = '#a37400' // 设置线段颜色
    ctx.lineCap = 'butt' // 设置线帽为默认形式
    ctx.lineJoin = 'bevel' // 设置线段连接处为平直的形式
    ctx.stroke()
    ctx.beginPath()
    ctx.arc(350, 300, 300, 0, [(Math.PI) / 180] * 360)
    ctx.globalAlpha = 0.3 // 设置圆的透明度为0.3
    ctx.fillStyle = 'skyblue'
    ctx.fill()
</script>

显示:

线宽、线帽、连接处、颜色、透明度

 p.s.:其实在画第二条线的时候只需要开启(beginPath())新路径即可,两条线仍然可以分别设置样式,但是为了规范起见,还是建议写上closePath()

2. 画三角形

画三角形其实也是用画线的思路,只需要注意首尾点连接起来即可:

<canvas id="canvas" height="600" width="700"></canvas>
<script>
    const canvas = document.getElementById('canvas')
    const ctx = canvas.getContext('2d')
    ctx.beginPath()
    ctx.moveTo(200, 200) 
    ctx.lineTo(500, 200)
    ctx.lineTo(500, 500)
    ctx.lineTo(200, 200) // 第四个点要和第一个点的坐标一致才能画出三角形
    ctx.stroke()
    ctx.closePath()
</script>

显示:

如果要设置样式也和画线是一样的:

<canvas id="canvas" height="600" width="700"></canvas>
<script>
    const canvas = document.getElementById('canvas')
    const ctx = canvas.getContext('2d')
    ctx.beginPath()
    ctx.moveTo(200, 200)
    ctx.lineTo(500, 200)
    ctx.lineTo(500, 500)
    ctx.lineTo(200, 200)
    ctx.strokeStyle = 'skyblue'
    ctx.lineWidth = 20
    ctx.stroke()
    ctx.closePath()
</script>

显示:

可能有人会想把三角形左上角的闭合处显示的更衔接一点,那么我们可以使用closePath()方法,它会把线段的终点和起点连接起来,这样看上去就更更衔接了:

<canvas id="canvas" height="600" width="700"></canvas>
<script>
    const canvas = document.getElementById('canvas')
    const ctx = canvas.getContext('2d')
    ctx.beginPath()
    ctx.moveTo(200, 200)
    ctx.lineTo(500, 200)
    ctx.lineTo(500, 500)
    ctx.closePath()
    ctx.strokeStyle = 'skyblue'
    ctx.lineWidth = 20
    ctx.stroke()
</script>

显示:

3. 画矩形

(1)空心矩形

绘制矩形有三种方法,第一种和画三角形的思路一样,比如:

<canvas id="canvas" height="600" width="700"></canvas>
<script>
    const canvas = document.getElementById('canvas')
    const ctx = canvas.getContext('2d')
    ctx.beginPath()
    ctx.moveTo(200, 150)
    ctx.lineTo(500, 150)
    ctx.lineTo(500, 450)
    ctx.lineTo(200, 450)
    ctx.lineTo(200, 150)
    ctx.stroke()
    ctx.closePath()
</script>

显示:

第二种方法是直接使用ctx身上的strokeRect()方法:

例如:

<canvas id="canvas" height="600" width="700"></canvas>
<script>
    const canvas = document.getElementById('canvas')
    const ctx = canvas.getContext('2d')
    ctx.beginPath()
    ctx.strokeRect(200, 150, 300, 300) // 起点为(200,150),宽300像素,高300像素
    ctx.closePath()
</script>

 显示:

第三种方法和第二种类似,只是把strokeRect()方法拆成了stroke()rect()方法,好处就是使用rect()暂时生成了矩形,但是必须调用stroke()方法才会绘制出来,比如可以使用下面的方式延迟两秒钟再绘制矩形: 

<canvas id="canvas" height="600" width="700"></canvas>
<script>
    const canvas &#
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: HTML5 Canvas是一种用于绘制图形的Web API,可以用它来绘制各种形状、线条、文本和图像等。要绘制一个logo,可以先设计好logo的样式和颜色,然后使用Canvas API来实现。具体步骤包括:创建Canvas元素,设置Canvas的宽度和高度,获取Canvas的上下文对象,使用上下文对象绘制各种形状和文本,最后将Canvas元素插入到HTML页面中即可。绘制logo需要一定的设计和技术能力,需要不断尝试和调整才能得到满意的效果。 ### 回答2: Html5 Canvas是一项很有意思的技术,通过调用canvas的API来进行拉近、缩小、旋转、平移、变形等各种绘图效果的创作操作。在本次绘制Logo的任务中,我们需要通过这种技术来完成一个漂亮的Logo,下面就以一个实际绘制的案例来详解一下。 首先,我们可以在html中创建一个canvas标签,显示一个画布。“canvas”是HTML5中新加入的标签,用于绘制2D或3D图形,只需要在标签中定义画布的大小和高度等属性,就可以在上面自由的绘制。 接下来我们需要引用一些javascript库,比如jQuery、Snap.svg等。这些库可以简化我们的开发流程,并且提供了一些强大的绘图工具。 在绘制方面,我们需要将画布分为三个部分:中央部分、左侧部分和右侧部分。首先,在中央部分,我们需要绘制一个圆形,通过canvas提供的api,使用arc函数来绘制圆形,可以根据需要设置圆形的大小、颜色和边框等属性。接下来是左侧部分和右侧部分,我们需要绘制一些简单的线条和多边形图形,可以使用css或SVG实现。 最后,我们需要将这些位置合并在一起,达到最终的效果。通过CSS调整位置和字体,添加一些特殊的过渡效果和动画效果,实现一个独具风格的Logo设计。 绘制Logo时需要注意的是,在设计中,最好保留一定的空间留给用户进行绘图,比如将背景色设为白色或浅色。同时,也要考虑不同设备的屏幕分辨率和绘图的效果,确保Logo在不同设备上的显示效果都一致。此外,我们还可以增加一些特效,比如模糊、阴影、渐变和光影等,来营造出更加绚丽的视觉效果。 综上所述,html5 canvas绘图是一项多方面都需要考虑的技术,需要在技术、设计和用户体验等方面多方面的关注。只有在各个方面都考虑到位,才能达到最佳的绘图效果和用户体验。 ### 回答3: HTML5Canvas画布让网页设计者可以绘制出非常酷炫的图形,它提供了许多绘制路径、多种颜色和文本等功能。在Canvas中,最常见的是用来绘制各种形状的路径。除此之外,还可以使用图像和聚光灯效果创建各种动画效果,甚至可以在Canvas上面添加音频和视频元素。 绘制logo可以说是Canvas的重头戏,在这里,我们简单介绍几个Canvas绘制logo的方法。 一、使用图像绘制 如果你已经有了一个已经设计好的logo图像,你可以在Canvas上绘制这个图像。这是相对简单的方法,只需调用Canvas的drawImage()方法即可实现,在绘制成功后,可以对这个Canvas绘制的图像进行一些变换。 二、使用路径和填充绘制 如果你需要绘制一个比较复杂的图形,最好的选择就是使用路径和填充绘制。Canvas提供了一系列的绘制路径方法,可以绘制各种形状。通过路径和填充,你可以创建出一个虚实交错的图形,给人留下深刻的印象。 三、使用动画绘制 如果你想让你的Logo充满动态感,就可以使用Canvas的动画API,通过逐帧更新Canvas,使图形产生连续的动画效果。这个方法可以让你的Logo动感十足,让观众很难动过目不忘。 总结:在HTML5 Canvas画布上绘制Logo图案可以使用图像绘制、路径填充绘制和动画绘制这三种方式。如果你足够熟练的话,可以使用这三种方式组合起来,打造一款炫酷的Logo。无论是什么方法,实现漂亮的Logo都需要你有耐心和创造性,只有不断尝试,加强练习,才能创造出让人印象深刻的Logo。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值