HTML5_Canvas

1. 创建Canvas

//HTML
<canvas id="myCanvas" width="400" height="200">
  您的浏览器不支持canvas!
</canvas>
//JavaScript
var canvas = document.getElementById('myCanvas');

if (canvas.getContext) {
  var ctx = canvas.getContext('2d');
}

2. API

颜色、样式和阴影

fillStyle:设置或返回用于填充绘画的颜色、渐变或模式
strokeStyle:设置或返回用于笔触的颜色、渐变或模式
shadowColor:设置或返回用于阴影的颜色
shadowBlur: 设置或返回用于阴影的模糊级别
shadowOffsetX:设置或返回阴影距形状的水平距离
shadowOffsetY:设置或返回阴影距形状的垂直距离
createLinearGradient():创建线性渐变(用在画布内容上)
createPattern(): 在指定的方向上重复指定的元素
createRadialGradient():创建放射状/环形的渐变(用在画布内容上)
addColorStop(): 规定渐变对象中的颜色和停止位置

线条样式

lineCap:设置或返回线条的结束端点样式
lineJoin:设置或返回两条线相交时,所创建的拐角类型
lineWidth:设置或返回当前的线条宽度
miterLimit:设置或返回最大斜接长度

矩形

rect(x, y, width, height): 创建矩形
fillRect(x, y, width, height): 绘制“被填充”的矩形
strokeRect(x, y, width, height): 绘制矩形(无填充)
clearRect(x, y, width, height): 在给定的矩形内清除指定的像素

路径

fill():填充当前绘图(路径)
stroke():绘制已定义的路径
beginPath():起始一条路径,或重置当前路径
moveTo(x,y):把路径移动到画布中的指定点,不创建线条
closePath():创建从当前点回到起始点的路径
lineTo():添加一个新点,然后在画布中创建从该点到最后指定点的线条
clip():从原始画布剪切任意形状和尺寸的区域

var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
// 剪切矩形区域
ctx.rect(50,20,200,120);
ctx.stroke();
ctx.clip();
// 在 clip() 之后绘制绿色矩形,只能显示出部分
ctx.fillStyle="green";
ctx.fillRect(0,0,150,100);

quadraticCurveTo(控制点的 x ,控制点的 y ,结束点的 x ,结束点的 y ): 创建二次贝塞尔曲线
bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y): 创建三次方贝塞尔曲线
arc(x, y, radius, startAngle, endAngle, anticlockwise): 创建弧/曲线(用于创建圆形或部分圆)
arcTo(): 创建两切线之间的弧/曲线
isPointInPath(): 如果指定的点位于当前路径中,则返回 true,否则返回 false

转换

scale(): 缩放当前绘图至更大或更小
rotate(): 旋转当前绘图
translate(): 重新映射画布上的 (0,0) 位置
transform(): 替换绘图的当前转换矩阵
setTransform(): 将当前转换重置为单位矩阵。然后运行 transform()

文本

fontctx.font = "Bold 20px Arial"
textAlign: 对齐方式
textBaseline
fillText(string, x, y): 在画布上绘制“被填充的”文本 ,fillText方法不支持文本断行,即所有文本出现在一行内
strokeText(): 在画布上绘制文本(无填充)
measureText(): 返回包含指定文本宽度的对象

图像绘制

drawImage(): 向画布上绘制图像、画布或视频

像素操作

width: ImageData 对象的宽度
height: ImageData 对象的高度
data: ImageData 对象的图像数据
createImageData(): 创建新的、空白的 ImageData 对象
getImageData(): 返回 ImageData 对象,该对象为画布上指定的矩形复制像素数据
putImageData(): 把图像数据(从指定的 ImageData 对象)放回画布上

合成

globalAlpha: alpha 或透明值
globalCompositeOperation

其他

save():保存当前环境的状态
restore():返回之前保存过的路径状态和属性
createEvent()
getContext()
toDataURL()

3. 离屏canvas进行预渲染

用离屏canvas进行预渲染了,原理很简单,就是先绘制到一个离屏canvas中,然后再通过drawImage把离屏canvas画到主canvas中

一般例子

ctx.save();
    var j = 0;
    ctx.lineWidth = borderWidth;
    for (var i = 1; i < this.r; i += borderWidth) {
        ctx.beginPath();
        ctx.strokeStyle = this.color[j];
        ctx.arc(this.x, this.y, i, 0, 2 * Math.PI);
        ctx.stroke();
        j++;
    }
    ctx.restore();

4. 示例

画尺子

//canvas宽高为900
    let canvas = document.getElementById('c')
    let ctx = canvas.getContext('2d');
    //画尺子主体
    ctx.lineWidth = 3;
    ctx.beginPath();
    ctx.moveTo(48, 400);
    ctx.lineTo(652, 400);
    ctx.strokeStyle = "#666";
    ctx.stroke();
    //每厘米间隔像素
    var rate = 10;
    //循环画出刻度线
    for (var i = 0; i < 61; i++) {
        ctx.beginPath();
        ctx.moveTo(50 + rate * i, 400);

        if (i % 5 == 0 && i % 10 != 0 && i != 0) {
            //中间5刻度
            ctx.lineWidth = 2;
            ctx.fillText(i, 45 + rate * i, 420);
            ctx.lineTo(50 + rate * i, 380);
        } else if (i % 10 == 0) {
            //中间10刻度
            ctx.lineWidth = 4;
            ctx.fillText(i, 45 + rate * i, 420);
            ctx.lineTo(50 + rate * i, 375);
        } else {
            ctx.lineWidth = 1;
            ctx.lineTo(50 + rate * i, 385);
        }
        ctx.stroke();
    }

画时钟

 let canvas = document.getElementById('c')
    let ctx = canvas.getContext('2d');
    ctx.translate(400, 400)
    ctx.lineWidth = 1;
    ctx.strokeStyle = "#666";
    //圆圈
    ctx.beginPath();
    ctx.arc(0, 0, 110, 0, 2 * Math.PI);
    ctx.stroke();
    ctx.closePath()

    //刻度盘
    ctx.save()
    for (var i = 0; i < 60; i++) {
        ctx.lineWidth = 1;
        ctx.beginPath();
        if (i % 5 == 0) {
            ctx.lineWidth = 3;
            ctx.moveTo(0, 95);
        } else {
            ctx.moveTo(0, 100);
        }
        ctx.lineTo(0, 110);
        ctx.stroke();
        ctx.rotate(6 * Math.PI / 180);
    }
    ctx.restore()

    /** 
     * @Author: xujianwei 
     * @Date: 2018-04-14 09:45:08 
     * @Desc:  画指针的函数
     * @params:  ctx--canvas对象
     * @params:  rotate--旋转角度系数
     * @params:  length--指针长度
     * @params:  color--指针颜色
     */
    function pointer(ctx, rotate, length, color) {
        ctx.save()
        ctx.beginPath();
        ctx.rotate(rotate * Math.PI / 30);
        ctx.moveTo(0, -10);
        ctx.lineTo(0, length);
        ctx.strokeStyle = color
        ctx.lineWidth = 3;
        ctx.stroke();
        ctx.closePath()
        ctx.restore()
    }
    //使画布的起始点旋转到钟表的12点刻度
    ctx.rotate(Math.PI);
    setInterval(function () {
        //清理现场
        ctx.beginPath();
        ctx.arc(0, 0, 85, 0, 2 * Math.PI);
        ctx.fillStyle = '#fff'
        ctx.fill()
        ctx.closePath()
        //清理完毕
        var date = new Date()
        pointer(ctx, date.getSeconds(), 80, '#ff4d4d')
        pointer(ctx, date.getSeconds() / 60 + date.getMinutes(), 80, '#333')
        pointer(ctx, date.getSeconds() / 720 + date.getMinutes() / 12 + date.getHours() * 5, 30, '#333')

        //添加中间原点
        ctx.beginPath();
        ctx.arc(0, 0, 4, 0, 2 * Math.PI);
        ctx.fillStyle = '#ff4d4d'
        ctx.fill()
        ctx.closePath()
    }, 1000)
 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,784评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,745评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,702评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,229评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,245评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,376评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,798评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,471评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,655评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,485评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,535评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,235评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,793评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,863评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,096评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,654评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,233评论 2 341

推荐阅读更多精彩内容

  • 一:canvas简介 1.1什么是canvas? ①:canvas是HTML5提供的一种新标签 ②:HTML5 ...
    GreenHand1阅读 4,657评论 2 32
  • 一、简介 HTML5 中的定义:“它是依赖分辨率的位图画布,你可以在 canvas 上面绘制任何图形,甚至加载照片...
    destiny0904阅读 10,513评论 1 4
  •   HTML5 添加的最受欢迎的功能就是 元素。这个元素负责在页面中设定一个区域,然后就可以通过 JavaScri...
    霜天晓阅读 2,984评论 0 2
  • 线条样式 绘制直线,第五章知识简单回顾 lineWidth 设置或返回当前的线条宽度,单位为像素 lineCap ...
    Zd_silent阅读 467评论 0 0
  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    Looog阅读 3,926评论 3 40