canvas入门/基础语法

canvas入门

1. canvas是什么

Canvas 中文名叫 “画布”,是 HTML5 新增的一个标签。

Canvas 允许开发者通过 JS在这个标签上绘制各种图案。

Canvas 拥有多种绘制路径、矩形、圆形、字符以及图片的方法。

Canvas 在某些情况下可以 “代替” 图片。

Canvas 可用于动画、游戏、数据可视化、图片编辑器、实时视频处理等领域。

2. 使用canvas绘制图形的步骤

​ a. 在html中创建canvas元素

​ b. 通过js获取canvas标签

​ c. 从canvas标签获取到绘图工具

​ d. 通过绘图工具,在canvas标签上绘制图行

<canvas id="cvs"></canvas> // 步骤a

<script>
    let cvs = document.getElementById('cvs') // 步骤b
    let ctx = cvs.getContext('2d'); // 步骤c
    <!-- 步骤d -->
    ctx.moveTo(100, 100); // 起点坐标
    ctx.lineTo(200, 100); // 下一个点的坐标
    ctx.stroke(); // 将所有坐标用一条线连起来
</script>

**注意:**canvas有默认宽高300px*150px,不能使用css设置canvas宽高,否则内容会被拉伸(canvas提供了width height两个属性设置宽高)

3. 坐标系

与数学中的坐标系y轴相反(y轴正方向向下,原点在浏览器的左上角)

4. 线

线条的默认宽度是 1px,默认颜色是黑色(但由于默认情况下 canvas 会将线条的中心点和像素的底部对齐,所以会导致显示效果是 2px和非纯黑色问题)

  • lineWidth: 线的粗细

  • strokeStyle: 线的颜色

  • lineCap: 线帽,线两端的形状设置了该值线条会稍长一点(默认:butt; 圆形: round;方形: square)

  • lineJoin: 拐角样式(默认值:miter尖角;round:圆角;bevel:斜角)

  • setLineDash(): 将线条变为虚线,需传入一个数值类型的数组(数组只有一个元素:实线与空白都是该值; 数组有两个元素:实线是元素一,虚线是元素二)

  • lineDashOffset(): 设置虚线起始偏移量

  • beginPath(): 新开路径;

    ​ 在绘制多条线段且样式不同时需要开辟新路径,否则各个线条样式之间会相互污染;

    ​ 使用beginPath()方法重新开一个路径,并设置新线段的样式(必须);

let cvs = document.getElementById('cvs')
let ctx = cvs.getContext('2d');
ctx.moveTo(100, 50);
ctx.lineTo(290, 50);
ctx.stroke();

ctx.moveTo(100, 80.5);
ctx.lineTo(290, 80.5);
ctx.stroke();

// 虚线
ctx.beginPath();
ctx.moveTo(50, 100);
ctx.lineTo(290, 100);
ctx.setLineDash([10])
ctx.stroke();

在这里插入图片描述

5. 矩形

可以使用前面的线段绘制矩形,canvas也提供了rect()方法直接生成矩形。

// 线段方式
let cvs = document.getElementById('cvs')
let ctx = cvs.getContext('2d');
ctx.moveTo(100, 100);
ctx.lineTo(200, 100);
ctx.lineTo(200, 200);
ctx.lineTo(100, 200);
ctx.lineTo(100, 100); // 需要再设置一次起点坐标进行闭合 或者推荐使用closePath()方法
ctx.stroke();

rect()方法:参数一、二分别对应起点(左上角)坐标X、Y的值,参数三、四表示矩形的宽高

// rect(x, y, width, height)
ctx.rect(150, 50, 50, 99);
ctx.stroke();

strokeRect(); 描边矩形;(用法、参数都同rect())

fillRect(); 填充矩形;

clearRect(); 清空指定区域(使用 ctx.clearRect(0, 0, cvs.width, cvs.height) 可以清空整个canvas);

6. 多边形

绘制多边形需要结合使用moveTo()、 lineTo()、 closePath();

7. 圆形(弧线)

绘制圆形的方法是arc(); ( 绘制曲线bezierCurveTo() )

arc(x, y, r, sAngle, eAngle,counterclockwise)
// x, y 是圆心坐标
// sAngle, eAngle是开始角度 结束角度(以弧度为单位。例如 180°就写成 Math.PI ,360°写成 Math.PI * 2 )
// counterclockwise 绘制方向,默认false(true: 逆时针,false: 顺时针)

注意: 绘制圆形之前必须先调用beginPath()方法;绘制完之后还需调用closePath()方法;

let cvs = document.getElementById('cvs')
let ctx = cvs.getContext('2d');

ctx.beginPath();
ctx.arc(100, 100, 50, 0, 360 * Math.PI / 180, false);
ctx.closePath(); // 不调用closePath()就可以绘制弧线
ctx.stroke();

在这里插入图片描述

8. 文本

可设置文本样式、描边、填充、对齐方式等

样式:font

cxt.font = 'font-style font-variant font-weight font-size/line-height font-family'

描边:strokeText()

/** 
text: 要描边的文本
x: 横坐标,文本左边要对齐的坐标
y: 纵坐标, 文本底部要对齐的坐标
maxWidth: 可选,文本最大渲染宽度,超出文本会被压缩
**/
strokeText(text, x, y, maxWidth)

填充:fillText() 语法同描边

<canvas id="canvas"></canvas>
<script>
let cvs = document.getElementById('canvas')
let ctx = cvs.getContext('2d'); // 获取webgl上下文
ctx.font = '40px Arial'
ctx.strokeStyle = 'red' // 设置描边颜色
ctx.strokeText('hello', 100, 100)

ctx.fillStyle = 'black' // 设置填充颜色
ctx.fillText('hello', 100, 100)

</script>

在这里插入图片描述

计算文本宽度:measureText(text)

ctx.measureText('hello world!').width
9. 图片

可用于渲染图片、设置图片宽高、截取图片等

渲染图片:

语法: 
// image: 图片对象 
// ltx: 图片左上角的横坐标位置
// lty: 图片左上角的纵坐标位置
drawImage(image, ltx, lty)  
<canvas id="canvas" width="1500" height="1500"></canvas>
<script>
    let cvs = document.getElementById('canvas')
    let ctx = cvs.getContext('2d'); // 获取webgl上下文

    const image = new Image(); // 1. 创建image对象
    image.src = './微信图片_20220620163205.png'// 2. 引入图片
    image.onload = () => { // 3. 加载图片
    	ctx.drawImage(image, 100, 100); // 使用drawImage()方法渲染
	}
</script>

设置图片宽高:只需加多两个参数~

drawImage(image, ltx, lty, w, h); // w h分别表示图片宽高

**截取图片:**参数多了, 顺序也变了

// sx, sy, sw, sh分别表示: 开始截取的横坐标、纵坐标,截取的宽高
drawImage(image, sx, sy, sw, sh, ltx, lty, w, h)
ctx.drawImage(image, 50, 300, 300, 300, 200, 200, 200, 200);

在这里插入图片描述在这里插入图片描述

10. 渐变:

线性渐变: createLinearGradient(x1, y1, x2, y2)

放射渐变: createRadialGradient(x1, y1, r1, x2, y2, r2)

创建线性渐变的步骤:

​ a. 使用 createLinearGradient() 方法创建一个指定了开始和结束点(两点确定一条直线)的 CanvasGradient 对象;

​ b. 使用 CanvasGradient 对象上的 addColorStop()方法添加起始色标;

​ c. 把 CanvasGradient 对象赋值给strokeStyle 或 fillStyle属性;

let cvs = document.getElementById('canvas')
let ctx = cvs.getContext('2d'); // 获取canvas 平面 上下文

var gradient = ctx.createLinearGradient(0,0,200,0); // 步骤a
gradient.addColorStop(0,"green"); // 步骤b
gradient.addColorStop(1,"blue");
ctx.fillStyle = gradient; // 步骤c
ctx.fillRect(10,10,200,100);

以上只是canvas的一些基础语法,还有投影、滤镜等高级玩法;

更多详细语法请参考:https://developer.mozilla.org/zh-CN/docs/Web/API/CanvasRenderingContext2D

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
嗨!欢迎来到 Vue Canvas 入门。Vue 是一个流行的 JavaScript 框架,而 Canvas 是一个 HTML5 元素,用于在网页上绘制图形。结合 Vue 和 Canvas,你可以创建动态的图形和交互性应用程序。下面是一个简单的入门示例。 首先,确保你已经安装了 Vue。你可以使用 Vue CLI 来创建一个新的 Vue 项目。 ```shell npm install -g @vue/cli vue create vue-canvas-demo cd vue-canvas-demo npm run serve ``` 接下来,我们将在 Vue 组件中创建一个 Canvas 元素。在 `src/components/Canvas.vue` 文件中添加以下代码: ```html <template> <canvas ref="canvas"></canvas> </template> <script> export default { mounted() { this.draw(); }, methods: { draw() { const canvas = this.$refs.canvas; const ctx = canvas.getContext('2d'); // 在画布上绘制一个矩形 ctx.fillStyle = 'red'; ctx.fillRect(10, 10, 100, 100); } } }; </script> ``` 这是一个简单的 Vue 组件,它在页面上创建了一个红色的矩形。我们使用 `mounted` 钩子来在组件加载后调用 `draw` 方法。在 `draw` 方法中,我们获取 Canvas 元素的引用并获取 2D 上下文对象 (`ctx`),然后使用 `fillRect` 方法绘制一个红色的矩形。 最后,在 `src/App.vue` 文件中引入并使用我们刚刚创建的 Canvas 组件: ```html <template> <div id="app"> <Canvas /> </div> </template> <script> import Canvas from './components/Canvas.vue'; export default { components: { Canvas } }; </script> ``` 现在,可以启动开发服务器并在浏览器中查看效果: ```shell npm run serve ``` 这只是一个简单的入门示例,你可以根据需要在 Canvas 中绘制更复杂的图形和添加交互性。希望对你有所帮助!如果你有任何问题,请随时问我。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值