赶上别人的唯一方法多收集资料,多整理资料。 

1.自己的canvas的功能函数。

2.canvas资料。

1.

var c=document.getElementById("myCanvas");

var ctx=c.getContext("2d");

--------------------------------------------------------------

画矩形。

context.fillRect(X左上,Y左上,宽,高) //绘制实心形状矩形

// ps:

context.fillStyle=" #ffffaa"  //填充颜色

context.strokeStyle = “#000” //描边颜色

context.strokeRect(X左上,Y左上,宽,高)//绘制空心矩形 默认是黑色

context.clearRect(X左上,Y左上,宽,高) //清楚指定区域 并且完全透明

--------------------------------------------------------------

划线。

context.beginPath()

ctx.moveTo(0,0);

ctx.lineTo(200,100);

ctx.stroke();//必须

context.closePath()

// ps:

ctx.fill();//闭合

context.lineWidth=10 ;//线的宽度

context.lineCap = 'butt' //定义上下文 线的端点 默认 butt , round  square  状态堆栈

context.lineJoin = 'miter' //定义两条线相交产生的拐角 默认值 miter 在连接处边缘延长相接, bevel 对角线斜角, round 连接处是一个圆 状态堆栈

context.beginPath()//开始路径

stroke() 方法会实际地绘制出通过 moveTo() 和 lineTo() 方法定义的路径。默认颜色是黑色。

context.closePath()//结束路径

--------------------------------------------------------------

画圆

ctx.arc(95,50,40,0,2*Math.PI,false);//x,y,半径,开始的角度,结束的角度

ctx.stroke();//必须

// ps:

圆的最后一个参数默认是false表示顺时针,如果为true表示顺时针。

--------------------------------------------------------------

文本


  • fillText(text,x,y) - 在 canvas 上绘制实心的文本
  • strokeText(text,x,y) - 在 canvas 上绘制空心的文本

     ctx.fillText("ttttt",100,20)

     //ps:

    context.font="20px SimSum" //设置字体大小
    context.textBaseline ='top' //字体对其方式     
   

--------------------------------------------------------------

线性渐变。

// 创建渐变

var grd=ctx.createLinearGradient(0,0,200,0);

grd.addColorStop(0,"red");

grd.addColorStop(1,"white");

// 填充渐变

ctx.fillStyle=grd;

ctx.fillRect(10,10,150,80);

canvas画布_sed

 --------------------------------------------------------------

镜像渐变。

/ 创建渐变

var grd=ctx.createRadialGradient(75,50,5,90,60,100);

grd.addColorStop(0,"red");

grd.addColorStop(1,"white");

// 填充渐变

ctx.fillStyle=grd;

ctx.fillRect(10,10,150,80);

canvas画布_html_02

 --------------------------------------------------------------

3. 

4.


5.

context.bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y); //

canvas画布_html_03


简单的做法

context.moveTo(150,0);

context.bezierCurveTo(0,125,300,175,300,300)

context.quadraticCurveTo(cpx,cpy,x,y);

canvas画布_sed_04


7.

context.arcTo(x1,y1,x2,y2,r); 

//x1         弧的起点的 x 坐标

y1         弧的起点的 y 坐标

x2         弧的终点的 x 坐标

y2         弧的终点的 y 坐标

r         弧的半径

8.

9.

context.clip() //裁剪

10.

drawImage(image, x, y)

drawImage(image, x, y, width, height)  

drawImage(image, sourceX, sourceY, sourceWidth, sourceHeight,destX, destY, destWidth, destHeight)//sourceX, sourceY 图像开始裁剪的左上角坐标 sourceWidth, sourceHeight,截取图片的宽高   destX, destY, 画布上的左上角X Y坐标  destWidth, destHeigh剪切的图片在画布上面的大小

11.

context.save() //保存当前状态到堆栈

context.beginPath();

context.rect(0, 0, 500, 500);

context.clip();

context.beginPath();

context. restore() //调出最后储存的堆栈恢复画布

canvas画布_html_05

canvas画布_html_06


12.demo需要记住的代码


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
body { background: url(http://pic.qiantucdn.com/58pic/18/25/22/85258PIC5ZN_1024.jpg); background-size: cover; }
#app{}
#btn{position: absolute;bottom: 100px;left:50%;transform: translateX(-50%);z-index: 10;opacity: 0.5;}
button{padding:5px;}
</style>
</head>
<body>
<canvas id="app"></canvas>
<div id="btn">
<!-- <button></button> -->
</div>
<script>
var WINDOW_WIDTH = window.innerWidth;
var WINDOW_HEIGHT = window.innerHeight;
var canvas = document.querySelector('#app')
var context = canvas.getContext('2d')
function iframeResize(){
WINDOW_WIDTH = window.innerWidth;
WINDOW_HEIGHT = window.innerHeight;
context.fillRect(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
canvas.width = WINDOW_WIDTH
canvas.height = WINDOW_HEIGHT
}
function addEvent(){
/*document.addEventListener('mousemove',documentMousemove,false);
document.addEventListener('mousedown',documentMousedown,false);
document.addEventListener('mouseup',documentMouseup,false);
canvas.addEventListener('touchstar',canvasTouchStar,false);
canvas.addEventListener('touchmove',canvasTouchMove,false);
*/
window.addEventListener('resize',iframeResize,false)
}
var count = 100;
var rains = [];
window.onload = function(){
iframeResize();
addEvent();
}

</script>
</body>
</html>




13.随机生成颜色,以后封装一个函数。

color:'rgba('+Math.ceil(Math.random()*255)+','+Math.ceil(Math.random()*255)+','+Math.ceil(Math.random()*255)+',1)',

14.利用canvas 透明渐变的这个特点,每次都会比上一次变化一点。

有些render函数中,没有使用clearRect函数而是用了

context.fillStyle = 'rgba(0,0,0,0.05)';

context.fillRect(0,0,WIDTH,HEIGHT);

这个我们仔细看,fillStyle透明度0.05,每次都是上一次的的0.05透明度。

如果是0的话,是完全透明,这样每次的就不会覆盖,0.05的话,每次还是会有一点点覆盖的,渐渐的会消失

15.记住这两种球屏幕宽高的写法,

var WINDOW_WIDTH = window.innerWidth;

var WINDOW_HEIGHT = window.innerHeight;

或者

var WINDOW_WIDTH = Math.min(800,document.body.offsetWidth);

var WINDOW_HEIGHT = Math.min(600,document.body.offsetHeight);

16.createLinearGradient 这个函数表示是线性的渐变,怎么理解线性渐变呢

当你context.createLinearGradient(0,0,0,300) 这个表示从0,0到0,300的直线出来的样子就是这个,

canvas画布_html_07

当你context.createLinearGradient(0,0,300,0) 这个表示从0,0到300,0的直线出来的样子就是这个

canvas画布_2d_08

当你context.createLinearGradient(0,0,300,300) 这个表示从0,0到300,300的直线出来的样子就是这个

canvas画布_2d_09

17.

canvas画布_2d_10


var grd=ctx.createRadialGradient(100,100,10,150,150,100);

grd.addColorStop(0,"red");

grd.addColorStop(1,"white");

如果你的起始圆的范围超过了终点圆的范围,那么规律如下图,​​​​

canvas画布_2d_11

18.


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
#btn{position: absolute;bottom: 100px;left:50%;transform: translateX(-50%);z-index: 10;opacity: 0.5;}
button{padding:5px;}
</style>
</head>
<body>
<div id="btn"></div>
<script>
window.onload = function(){
var piao = new Piao()
var cxt = piao.cxt;
cxt.fillStyle = "black";
cxt.beginPath()
cxt.fillRect(0,0,piao.canvasWidth,piao.canvasHeight)
cxt.stroke()
cxt.closePath()
}
function Piao(){
this.canvas = null //容器canvas
this.canvasWidth = null
this.canvasHeight = null
this.isBody = false //容器是不是document.body
this.cxt = null //context
this._init();
}
Piao.prototype = {
constructor:'Piao',
_init:function(){
window.requestAnimFrame = ( function() {
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
function( callback ) {
window.setTimeout( callback, 1000 / 60 );
};
})();
//创建元素
this._createCanvas();
//添加事件
this._addEvent();
},
_createCanvas:function(container){
if(typeof container == 'string'){
container = document.querySelector(container)
}
if(!container){
container = container || document.body;
this.isBody = true;
}
var ele = document.createElement("canvas");
ele.id = "canvas";
ele.value = "sorry,your browser can not support canvas!";
//ele.style.width = 100%;
//ele.style.height = 100%;
this.cxt = ele.getContext('2d');
container.appendChild(ele);
this.canvas = ele;
},
_addEvent:function(){
/*
document.addEventListener('mousemove',documentMousemove,false);
document.addEventListener('mousedown',documentMousedown,false);
document.addEventListener('mouseup',documentMouseup,false);
canvas.addEventListener('touchstar',canvasTouchStar,false);
canvas.addEventListener('touchmove',canvasTouchMove,false);
*/
window.addEventListener('resize',this._windowResizeEvent.bind(this),false)
this._windowResizeEvent();
},
_windowResizeEvent:function(){
if(this.isBody){
this.canvas.width = this.canvasWidth = window.innerWidth;
this.canvas.height = this.canvasHeight = window.innerHeight;
}
}
}
</script>
</body>
</html>


19.在位置 (10,10) 处绘制一个矩形,将新的 (0,0) 位置设置为 (70,70)。再次绘制新的矩形(请注意现在矩形从位置 (80,80) 开始绘制):

var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
ctx.fillRect(10,10,100,50);
ctx.translate(70,70);
ctx.fillRect(10,10,100,50);

20. CanvasRenderingContext2D 函数

21.关于