canvas无疑是H5之中最受欢迎的新特性了,它可以让浏览毫无费力的画出各种图案,动画。

canvas的性能不会因为画布上的图案多少而改变,因此做动画用canvas性能也相当优秀。

canvas最基本的概念是1.路径 2.描边 3.填充 4.变换 5.图片操作

首先先获得canvas的操作借口集(这里先用2d为例):

let canvas = document.getElementById('canvas');
// canvas的所有画图接口都集成在gd这里了
let gd = canvas.getContext('2d');

1.路径

常见的路径操作有

//清除之前的路径
gd.beginPath(); //移动点到x,y
gd.moveTo(x,y); //线连到x,y
gd.lineTo(x,y); //矩形“选区”(x,y为左上角的点,w,h分别为宽高)
gd.rect(x,y,w,h); //圆弧“选区”
gd.arc(x,y,r,startArg,endArg,是否逆时针); //闭合路径
gd.closePath();

2.描边

常见的描边操作:

// 先设置好描边的样式
gd.strokeStyle = '任意CSS颜色';
gd.lineWidth = 3; // 边宽3px
// 把上面的路径描一次边
gd.stroke(); //直接描矩形
gd.strokeRect(x,y,w,h); //写字
gd.font = '30px 宋体';
gd.strokeText('内容~~',x,y);

3.填充

常见的填充操作:

//设置填充样式
gd.fillStyle = '任意css样式';
//把上面的路径自动闭合填充
gd.fill(); //直接填充矩形
gd.fillRect(x,y,w,h); //填充字体
gd.font = '30px 宋体';
gd.fillText('内容',x,y);

4.变换

和CSS3的变换一样。canvas的变换也有scale、translate、rotate

gd.translate(x,y) //图形相对原来的位置移动多少

gd.rotate(Math.PI/) //整个画布相对与左上角,逆时针转90°

gd.scale(x轴放大倍数,y轴放大倍数); //整个画布左上角为原点,分别放大不同倍数

而变换前后要有save和restore来还原画布的变换状态

gd.save(); //先保存变换前画布状态
//。。。。变换1
//。。。。变换2
//。。。。变换n
gd.restore(); //还原变换后的画布状态

5.图片操作

//填充图片
let img = new Image();
img.src = 'url';
img.onload = function(){
gd.drawImage(
img, //或者是get一个img dom又或者createElement('img')
sx,sy,sw,sh, //原图的定位,大小
dx,dy,dw,dh //在canvas的定位,大小
)
} //操作图片像素 let data = gd.getImageData(x1,y1,x2,y2); //获取从点1到点2之间的所有像素点的值,每个点都有r、g、b、a四个值,例如点1的值为data[0~3] //对data数组一波操作之后,把数据放回画布中
gd.putImageData(data,x1,x2); //把数据从点1这里开始放数据

ps:当然还有一个比较重要的操作

gd.clearRect(0,0,canvas.width,canvas.height); //清除画布

canvas.toDataURL(); //把canvas转化成base64

H5新特性之canvas的更多相关文章

  1. H5新特性——--第三方绘图工具库 echarts(canvas)---SVG绘图

    今天学习的内容 3.1:h5新特性---第三方绘图工具库 echarts(canvas) 百度 echarts;d3;two.js;.... 3.2:h5新特性---SVG绘图 3.2:h5新特性-- ...

  2. H5新特性汇总

    H5新特性: 新增选择器 document.querySelector.document.querySelectorAll 拖拽释放(Drag and drop) API 媒体播放的 video 和 ...

  3. H5新特性-视频,音频-Flash-canvas绘图

    json格式 json - > AJAX json:数据格式,通常是以字符串形式表示 对象 {"name":"james","age" ...

  4. H5新特性--WebStorage--WebSocke

    今天的目标 3.2:h5新特性--WebStorage localStorage  在客户端浏览器保存数据 永久保存 保存数据 localStorage [key] = value 保存数据 loca ...

  5. H5新特性---Web Worker---Web Stroage

    今天的目标 3.1:h5新特性八--Web Worker---代码就3行 程序:program 存储在外存(磁盘)中代码 进程:Process/Task 将程序调用内存中,分配空间 线程:Thread ...

  6. H5新特性---SVG--椭圆--直线--文本--滤镜(高斯滤镜--模糊)--地理定位

    今天的目标 3.1:h5新特性--SVG--椭圆 <ellipse rx="" ry=""  cx="" cy="" ...

  7. H5新特性实现对class的增删改

    直接撸代码 全靠死记硬背 没什么技术点 HTML部分 <!DOCTYPE html> <html lang="en"> <head> <m ...

  8. Atitti html5 h5 新特性attilax总结

    Atitti html5 h5 新特性attilax总结 Attilax觉得不错的新特性 3.语义Header和Footer (The Semantic Header and Footer) 8.占位 ...

  9. 使用h5新特性,轻松监听任何App自带返回键

    1.前言 如今h5新特性.新标签.新规范等有很多,而且正在不断完善中,各大浏览器商对它们的支持,也是相当给力.作为前端程序员,我觉得我们还是有必要积极关注并勇敢地加以实践.接下来我将和各位分享一个特别 ...

随机推荐

  1. 6-Python3从入门到实战—基础之数据类型(元组-Tuple)

    Python从入门到实战系列--目录 元组的定义 定义元组只需要在括号中添加元素,并使用逗号隔开即可 tup = ('Python','Java','C++','Kotlin') 元组与列表的区别 P ...

  2. 【Alpha发布】网站已经正式发布!

    Alpha版本发布说明 一.功能介绍 本团队所做的物理实验网站是以生成物理实验报告为基础功能的网站.Alpha版本具有的功能大体如下: Figure 1首页 1. 注册登录功能 用户可以通过在注册页通 ...

  3. Java的JDK下Hashtable与HashMap的区别

    时间角度: Hashtable * @since JDK1.0 ; HashMap* @since   1.2 基类与接口角度: public class Hashtable<K,V> e ...

  4. ODBC 驱动程序管理器 在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配 解决方案

    程序报错如下: ---------------------------Microsoft 数据链接错误---------------------------测试连接失败,因为初始化提供程序时发生错误. ...

  5. OA实例

    let express = require('express'); let consolidate = require('consolidate'); let bodyParser = require ...

  6. [书摘]图解HTTP 状态码

    状态码类别: 1XX informational 信息性状态码 2XX Suess   成功状态码 3XX Redirection 重定向状态码 4XX Client error 客户端错误状态码 5 ...

  7. FICO基础知识(四)

    What is the organizational structure for CO? Operating Concern 经营组织 Controlling Area 成本控制范围 Profit c ...

  8. 关于python requests 包跑ssl的设置 和 charles相关抓包的问题

    由于在测试服务器上测试东西都是https,然后最近又在和大神一起开发openapi,api写好当然是要测试的 python上测试接口最好用的莫过于requests模块了.但是 我还从来没有用reque ...

  9. 关于ArcGIS常用功能的实现

    关于ArcGIS中常见的一些功能的总结,一般首先在前台中放置地图,代码如下所示: <esri:Map Grid.Row="0" Grid.Column="0&quo ...

  10. Java 死锁

    什么是死锁? 当一个线程永远地持有一个锁,并且其他线程都尝试去获得这个锁时,那么它们将永远被阻塞,当线程A持有锁1想获取锁2,当线程B持有锁2想获取锁1 这种情况下就会产生2个线程一直在阻塞等待其他线 ...