什么是Canvas
<canvas>是 HTML5 新增的元素,可使用JavaScript脚本来绘制图形。
canvas是一个矩形区域,您可以控制其每一像素。
引入Canvas
```html
<canvas id="canvas" width="300" height="300"></canvas>
```

`<canvas>` 看起来和 `<img>` 元素很相像,唯一的不同就是它并没有 `src` 和 `alt` 属性。实际上,`<canvas>` 标签只有两个属性—— `width` 和 `height`,并且这些属性都是可选的。

width 和 height 属性
当没有设置宽度和高度的时候,`canvas` 会初始化宽度为300像素和高度为150像素。该元素可以使用CSS来定义大小,但在绘制时图像会伸缩以适应它的框架尺寸:如果CSS的尺寸与初始画布的比例不一致,它会出现扭曲。

*注意*: 如果你绘制出来的图像是扭曲的, 尝试在<canvas>的属性中明确规定宽和高,而不是使用CSS。

兼容性
某些较老的浏览器(尤其是IE9之前的IE浏览器)或者文本浏览器不支持HTML元素"canvas",在这些浏览器上会把`<canvas>`标签内部的内容显示出来,因此我们可以在这些不支持`<canvas>`的浏览器上提供一些替代内容,而支持`<canvas>`的浏览器将会忽略在容器中包含的内容,并且只是正常渲染canvas。
```html
<canvas id="myCanvas" width="150" height="150">
  如果您的浏览器不支持Canvas,那么您将看到本行文字
</canvas>
```
</canvas> 标签不可省
与 `<img>` 元素不同,`<canvas>` 元素需要结束标签(`</canvas>`).如果结束标签不存在,则文档的其余部分会被认为是替代内容,将不会显示出来。

获取绘图上下文(the rendering context)
canvas起初是空白的.如果想要对canvas进行一些操作,那么则需要获取canvas的绘图上下文对象。`<canvas>` 元素有一个做 `getContext()` 的方法,这个方法是用来获得渲染上下文和它的绘画功能。`getContext()`只有一个参数,上下文的格式.对于2D图像而言,这个格式参数是`"2d"`。

```javascript
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
```

如果在不支持`<canvas>`的浏览器中运行了上述代码,会抛出一个错误.所以在我们获取绘图上下文对象之前,应该先检查一下浏览器对该特性的支持情况。
```javascript
var canvas = document.getElementById('tutorial');
if (canvas.getContext){
  var ctx = canvas.getContext('2d');
  // drawing code here
} else {
  // canvas-unsupported code here
}
```

基本绘图操作
和Windows操作系统自带的画图程序一样,`Canvas`的两种基本绘图操作是填充和描边。填充,就是用指定的样式(颜色、渐变或图像)填充图形;描边,就是只在图形的边缘画线。填充和描边的样式分别取决于两个属性:`fillStyle`和`strokeStyle`。这两个属性的值可以是字符串、渐变对象或模式对象,而且它们的默认值都是`"#000000"`。如果为它们指定表示颜色的字符串值,可以使用 CSS 中指定颜色值的任何格式,包括颜色名、十六进制码、 rgb、rgba、hsl 或 hsla。

 绘制矩形
矩形是唯一一种可以直接在 2D 上下文中绘制的形状.与矩形有关的方法包括 `fillRect()`、 `strokeRect()` 和 `clearRect()`。这三个方法都能接收 4 个参数:矩形的 x 坐标、矩形的 y 坐标、矩形宽度和矩形高度。这些参数的单位都是像素。

填充矩形
`fillRect(x, y, width, height)`

绘制矩形描边
`strokeRect(x, y, width, height)`

清除矩形
该方法的功能类似于Windows系统中画图程序的橡皮擦,会将指定矩形矩形区域中的所有内容全部清除。

`clearRect(x, y, width, height)`

绘制路径
如果要绘制矩形以外的形状,则需要自定义绘制路径。2D 绘制上下文支持很多在画布上绘制路径的方法。要绘制路径,首先必须调用 beginPath()方法,表示要开始绘制新路径。然后,再通过调用下列方法来实际地绘制路径。

`arc(x, y, radius, startAngle, endAngle, counterclockwise)`

> 以`(x,y)`为圆心绘 制一条弧线,弧线半径为 `radius`,起始和结束角度(用弧度表示)分别为 `startAngle` 和 `endAngle`。最后一个参数表示 `startAngle` 和 `endAngle` 是否按逆时针方向计算,值为 `false` 表示按顺时针方向计算。

 `arcTo(x1, y1, x2, y2, radius)`
> 从上一点开始绘制一条弧线,到`(x2,y2)`为止,并且以 给定的半径 `radius` 穿过`(x1,y1)`。

`lineTo(x, y)`
> 从上一点开始绘制一条直线,到`(x,y)`为止。

 `moveTo(x, y)`
> 将绘图游标移动到`(x,y)`,不画线。

`rect(x, y, width, height)`
> 从点`(x,y)`开始绘制一个矩形,宽度和高度分别由 `width` 和 `height` 指定。这个方法绘制的是矩形路径,而不是 `strokeRect()` 和 `fillRect()` 所绘制的独立的形状。

创建了路径后,接下来有几种可能的选择。如果想绘制一条连接到路径起点的线条,可以调用 `closePath()`。如果路径已经完成,你想用 `fillStyle` 填充它,可以调用 `fill()` 方法。另外,还可 以调用 `stroke()` 方法对路径描边,描边使用的是 `strokeStyle`。最后还可以调用 `clip()`,这个方法可以在路径上创建一个剪切区域。

绘制一个简易时钟

```javascript
var canvas = document.getElementById("canvas");
//确定浏览器支持元素
if (canvas.getContext){
	var context = canvas.getContext("2d");

	//开始路径
	context.beginPath();

	//绘制外圆
	context.arc(100, 100, 99, 0, 2 * Math.PI, false);

	//绘制内圆
	context.moveTo(194, 100);
	context.arc(100, 100, 94, 0, 2 * Math.PI, false);

	//绘制分针
	context.moveTo(100, 100);
	context.lineTo(100, 15);

	//绘制时针
	context.moveTo(100, 100);
	context.lineTo(35, 100);

	//描边路径
	context.stroke();
}
```

绘制文本
绘制文本主要有两个方法:`fillText()` 和 `strokeText()`。这两个方法都可以接收 4 个参数:要绘制的文本字符串、`x` 坐标、`y` 坐标和可选的最大像素宽度。

而绘制出来文本的样式,由下面3个属性决定:

font`
> 表示文本样式、大小及字体,用 CSS 中指定字体的格式来指定,例如`"10px Arial"`。

textAlign`
> 表示文本对齐方式。可能的值有 `"start"`、`"end"`、`"left"`、`"right"` 和 `"center"`。建议使用 `"start"` 和 `"end"`,不要使用 `"left"` 和 `"right"`,因为前两者的意思更稳妥,能同时适合从左到右和从右到左显示(阅读)的语言。

textBaseline`
> 表示文本的基线。可能的值有 `"top"`、`"hanging"`、`"middle"`、`"alphabetic"`、 `"ideographic"` 和 `"bottom"`。

```javascript
context.font = 'bold 14px Arial';
context.textAlign = 'center';
context.textBaseline = 'middle';
context.fillText('hello, world', 100, 100);
```

初探Javascript之Canvas的更多相关文章

  1. 使用 JavaScript 和 canvas 做精确的像素碰撞检测

    原文地址:Pixel accurate collision detection with Javascript and Canvas 译者:nzbin 我正在开发一个需要再次使用碰撞检测的游戏.我通常 ...

  2. javascript的canvas绘图的基本用法

    <canvas>是HTML里面非常强大的元素,利用它结合js可以实现很多动画效果,大大增强交互性.下面,我想用图文并茂的方式阐述一下canvas的绘图机制的基础内容,话不多说,先上代码: ...

  3. 使用javascript和canvas画月半弯

    使用javascript和canvas画月半弯,月半弯好浪漫!浏览器须支持html5 查看效果:http://keleyi.com/a/bjad/8xqdm0r2.htm 以下是代码: <!do ...

  4. 初探JavaScript(四)——作用域链和声明提前

    前言:最近恰逢毕业季,千千万万的学生党开始步入社会,告别象牙塔似的学校生活.往往在人生的各个拐点的时候,情感丰富,感触颇深,各种对过去的美好的总结,对未来的展望.与此同时,也让诸多的老“园”工看完这些 ...

  5. 初探JavaScript(三)——JS带我"碰壁"带我飞

    已经写了两篇关于小白的JavaScript之行,不可否认,每一种语言都有其精华与糟粕之处,来不及细细体味其精华奥妙,也没法对其评头论足,只能先了解,后深入.到目前为止已经看完<JavaScrip ...

  6. 初探JavaScript(二)——JS如何动态操控HTML

    除去五一三天,我已经和<JavaScript Dom编程艺术>磨合了六天,第一印象很好.慢慢的,我发现这是一块排骨,除了肉还有骨头.遇到不解的地方就会多看几遍,实在不懂的先跳过,毕竟,初次 ...

  7. 初探JavaScript(一)——也谈元素节点、属性节点、文本节点

    Javascript大行其道的时候,怎么能少了我来凑凑热闹^_^ 基本上自己对于js的知识储备很少,先前有用过JQuery实现一些简单功能,要论起JS的前世今生,来龙去脉,我就一小白.抱起一本< ...

  8. JavaScript之canvas

    num.push(x,y); 动画草图(举个栗子,我们把数字“2”给画出来): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transit ...

  9. 每天一个JavaScript实例-canvas绘图

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

随机推荐

  1. Web安全概述

    互联网刚开始是安全的,但是伴随着黑客(Hacker)的诞生,互联网变得越来越不安全.任何一个事情都有两面性,黑客也有好有坏,好的黑客叫白帽子,坏的黑客叫黑帽子.与此同时,随着Web技术发展越来越成熟, ...

  2. C语言第七次作业

    一.PTA实验作业 题目1:求整数序列中出现次数最多的数 1.本题PTA提交列表 2.设计思路 定义一个整型数组a[1001],i,j 为循环变量,N,定义数组b[1001]={0} 输入N for( ...

  3. alpha-咸鱼冲刺day4

    一,合照 emmmmm.自然还是没有的. 二,项目燃尽图 三,项目进展 QAQ具体工作量没啥进展.但是前后端终于可以数据交互了!.. 四,问题困难 日常啥都不会,百度真心玩一年. 还得自学nodejs ...

  4. 简易web服务器

    当通过Socket开发网络应用程序的时候,首先需要考虑所使用的网络类型,主要包括以下三个方面: 1)Socket类型,使用网络协议的类别,如IPv4的类型为PF_INET. 2)数据通信的类型,常见的 ...

  5. Django 模版语法

    一.简介 模版是纯文本文件.它可以产生任何基于文本的的格式(HTML,XML,CSV等等). 模版包括在使用时会被值替换掉的 变量,和控制模版逻辑的 标签. {% extends "base ...

  6. 【iOS】Swift类的继承、构造方法、析构器等复习

    一.继承与重写, 防止重写 1.1 基类, 不继承任何类. Swift不想OC或者Java中继承自Object类.定义一个类,不继承任何类,该类就是基类. [java] view plaincopy ...

  7. [知识梳理]课本3&9.1

    函数:关键词:参数.返回值.函数返回类型.函数体. 函数按照返回类型,可以分为有参函数和无参函数. 函数根据是否有返回值,可以分为返回值函数和非返回值函数.     函数的定义:函数的定义可以放在任意 ...

  8. Visual Studio Code初识与自动化构建工具安装

    1.Visual Studio Code如何新建文件夹 要自己手动在本地新建,然后再点击文件->打开文件夹即可. 之后你就可以任意添加文件了 2.如何使用自动化构建工具 通过自动化构建工具,用户 ...

  9. JAVA_SE基础——58.如何用jar命令对java工程进行打包

    有时候为了更方便快捷的部署和执行Java程序,要把java应用程序打包成一个jar包.而这个基础的操作有时候也很麻烦,为了方便java程序员们能够方便的打包java应用程序,下面对jar命令进行介绍, ...

  10. javascript原型链__proto__属性的理解

    在javascript中,按照惯例,构造函数始终都应该以一个大写字母开头,而非构造函数则应该以一个小写字母开头.一个方法使用new操作符创建,例如下面代码块中的Person1(可以吧Person1看做 ...