<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<!--
canvas:H5新标签,在页面上绘制图形用的,(通常称它画布)
canvas只是一个容器,用js脚本来控制它
-->
<canvas id="draw" width="600" height="500" style="border:2px dashed #aaa"></canvas>
<canvas id="drawDH" width="200" height="400" style="border:2px dashed #aaa"></canvas>
<script type="text/javascript">
//加注释有canvas提示,任意一个都行
/** @type {HTMLCanvasElement} */
var draw = document.getElementById("draw");
/** @type {CanvasRenderingContext2D} */
var cvs = draw.getContext("2d");
function draw1Fn(){
//获取canvas标签
var draw = document.getElementById('draw');
console.dir(draw)
//设置绘制环境
var cvs = draw.getContext("2d");
console.dir(cvs)
cvs.fillStyle; //填充的颜色
cvs.strokeStyle; //笔触颜色(边框)
cvs.lineWidth; //边框的宽度
//绘制图形两种方式
cvs.fill(); //填充
cvs.stroke(); //边框
//颜色值:1颜色名'red',2十六进制'#ff6700',3三色值rgb(123,234,120),4四色值rgba(123,234,120,0.3)
}
function draw2Fn(){
//坐标:以画布为基准,距离画布上边的距离是y坐标值,距离画布左边的距离是x坐标值
//绘制线条
cvs.moveTo(x,y); //起始点坐标
cvs.lineTo(x,y); //结束点坐标
//如果没有moveTo就把上一个挨着的lineTo作为起始坐标
//如果第一个不是moveTo而是lineTo,那么lineTo就是起始坐标,可以开始只写一个moveTo后面都用lineTo
cvs.beginPath(); //开始一个新的路径
cvs.closePath(); //关闭当前路径,自动闭合,从结束坐标值到起始坐标自动连接
}
//直线
function draw3Fn(){
cvs.beginPath(); //开始
cvs.moveTo(50,50); //开始坐标
cvs.lineTo(150,50); //结束坐标
//cvs.closePath(); //结束
cvs.strokeStyle = "#800080"; //线颜色
cvs.lineWidth = 20; //线粗
//设置线段两端样式:平butt,圆角round,方角square(比平角稍长一块)
cvs.lineCap="round"; //加了关闭路径就失效了
cvs.stroke(); //画线
}
// draw3Fn()
//三角形 矩形
function draw4Fn(){
cvs.beginPath();
cvs.moveTo(100,50);
cvs.lineTo(150,150);
cvs.lineTo(50,150);
cvs.closePath();
cvs.strokeStyle = "#ff9900";
cvs.lineWidth = 20;
//三个属性:尖角miter,斜角bevel(平角),圆角round
cvs.lineJoin="round";
cvs.stroke();
cvs.beginPath();
cvs.moveTo(200,50);
cvs.lineTo(200,150);
cvs.lineTo(300,150);
cvs.closePath();
cvs.strokeStyle = "#ff9900";
cvs.lineWidth = 4;
cvs.stroke();
//填充
cvs.fillStyle = '#ff0000'
cvs.fill();
//矩形
cvs.fillRect(200,200,200,200);//(x,y,宽,高)
cvs.beginPath();
cvs.moveTo(199,199);
cvs.lineTo(401,199);
cvs.lineTo(401,401);
cvs.lineTo(199,401);
cvs.closePath();
cvs.strokeStyle = "#000";
cvs.lineWidth = 1;
cvs.stroke();
}
// draw4Fn()
//线条圆
function draw5Fn(){
//cvs.arc(x,y,r,star,end,n);
//x,y 圆心坐标
//r 半径
//star 起始角(以弧度计算,三点钟方向0度)
//end 结束角
//n 是否逆时针true/false (默认false顺时针)
cvs.beginPath();
cvs.arc(200,200,100,0,2*Math.PI,false);//Math.PI Math.PI/2
// cvs.lineTo(200,300);
// cvs.lineTo(200,200);
cvs.closePath();
// var CRG = cvs.createRadialGradient(200,200,10,200,200,100);
// CRG.addColorStop(0,"#000");
// CRG.addColorStop(0.9,"orange");
// CRG.addColorStop(1,"red");
// cvs.strokeStyle = CRG
cvs.strokeStyle = "#ff9900";
cvs.lineWidth = 20;
cvs.stroke();
}
// draw5Fn()
//填充圆
function draw6Fn(){
cvs.fillStyle = "#ff9900";
cvs.arc(200,200,100,0,2*Math.PI);
cvs.fill();
cvs.lineWidth = 40;
cvs.strokeStyle = "#00ff00";
cvs.beginPath();
cvs.arc(200,200,120,0,2*Math.PI);
cvs.closePath();
cvs.stroke();
}
// draw6Fn()
//渐变
function draw7Fn(){
//线性渐变
//var CLG = cvs.createLinearGradient(x0,y0,x1,y1);
//CLG.addColorStop(n,m);可以写多个
//x0:渐变开始的x坐标
//y0:渐变开始的y坐标
//x1:渐变结束的x坐标
//y1:渐变结束的y坐标
//n: 设置颜色偏移量,0-1的区间
//m: 颜色
var CLG = cvs.createLinearGradient(0,0,200,200);
CLG.addColorStop(0,"red");
CLG.addColorStop(0.25,"yellow");
CLG.addColorStop(0.5,"#ccc");
CLG.addColorStop(0.75,"yellow");
CLG.addColorStop(1,"red");
cvs.fillStyle = CLG;//填充颜色用CLG
cvs.fillRect(0,0,200,200);
cvs.clearRect(50,50,100,100);//清除矩形区域
//径向渐变
//var CRG = cvs.createRadialGradient(x0,y0,r0,x1,y1,r1);
//x0:渐变开始中心的x坐标
//y0:渐变开始中心的y坐标
//r0:渐变开始的半径
//x1:渐变结束中心的x坐标
//y1:渐变结束中心的y坐标
//r1:渐变结束的半径
// var CRG = cvs.createRadialGradient(300,300,100,300,300,10);
var CRG = cvs.createRadialGradient(300,300,10,300,300,100);
CRG.addColorStop(0,"#000");
CRG.addColorStop(0.5,"orange");
CRG.addColorStop(1,"red");
cvs.fillStyle = CRG;
cvs.fillRect(200,200,200,200)
}
// draw7Fn()
//阴影
function draw8Fn(){
// cvs.shadowOffsetX; 阴影横向偏移量
// cvs.shadowOffsetY; 阴影纵向偏移量
// cvs.shadowColor; 阴影的颜色
// cvs.shadowBlur; 阴影的模糊范围
cvs.shadowColor = "#0000ff";
cvs.shadowOffsetX = 30;
cvs.shadowOffsetY = 20;
cvs.shadowBlur = 20;
cvs.fillStyle = "#449FDB";
cvs.fillRect(50,50,100,100);
}
// draw8Fn()
//绘制文本
function draw9Fn(){
// cvs.font = "font-size font-family" 字体样式
// cvs.textAlign = "start","end","right","center" 水平对齐方式
// cvs.textBaseline = "top","middle","hanging","bottom","alphabetic","ideographic" 垂直对齐方式
// 计算文本宽度,文字在画布里占得宽度,和其实位置使用可以在文字后面接着写
// var text = '123456';
// var length = cvs.measureText(text);
// cvs.fillText(text,x,y); 填充文字
// cvs.strokeText(text,x,y); 绘制文本轮廓
// text:文本内容
// x,y:文字起始点坐标
var text = "hello word";
cvs.fillStyle = "#ffe470";
cvs.font = "40px verdana";
cvs.textAlign = "start";
cvs.textBaseline = "top";
cvs.fillText(text,0,0);
var length = cvs.measureText(text);
console.log(length)
cvs.fillText("字体宽度为:" + length.width,0,50);
//渐变色文字
var CLG = cvs.createLinearGradient(0,150,450,250);
CLG.addColorStop(0,"#ff0000");
CLG.addColorStop(0.25,"yellow");
CLG.addColorStop(0.5,"green");
CLG.addColorStop(0.75,"skyblue");
CLG.addColorStop(1,"#ff0000");
var text1 = "hello world";
cvs.fillStyle = CLG;
cvs.shadowOffsetX = 5;
cvs.shadowOffsetY = 4;
cvs.shadowColor = "#ffb6c1";
cvs.shadowBlur = 5;
cvs.font = "40.6px simsun";
cvs.textAlign = "start";
cvs.textBaseline = "top";
cvs.fillText(text1,20,120);
var wid = cvs.measureText(text1).width;
console.log(wid)
cvs.fillText("Zitichangduwei:"+wid,0,170)
cvs.strokeStyle = CLG
cvs.strokeText("Zitichangduwei:"+wid,0,210)
}
// draw9Fn()
//绘图
function draw10Fn(){
// cvs.drawImage(Image,x,y,w,h)
// Image: 真实的图片,可以动态创建,也可以获取页面上的document.createElement("img"),new Image()
// x,y: 图片左上角坐标
// w,h: 绘制图片的宽高
// cvs.drawImage(Image,sx,sy,sw,sh,dx,dy,dw,dh)
// sx,sy: 图片左上角坐标
// sw,sh: 矩形区域的宽高,用来截取图片
// dx,dy: 截取出来放在canvas上的坐标
// dw,dh: 画在canvas上的宽高
// sx,sy,sw,sh:是截取图片的过程
// dx,dy,dw,dh:把截取出的图片放在canvas上的过程
// cvs.createPattern(this,type); 重复绘制
// type: no-repeat不平铺,repeat全方向平铺
// repeat-x: x轴方向平铺
// repeat-y: y轴方向平铺
var img = new Image;
img.src = "lunbotu/img/loading.gif";
img.onload = function(){
var rep = cvs.createPattern(this,"repeat");
cvs.fillStyle = rep;
cvs.fillRect(0,0,draw.width,draw.height);
}
}
// draw10Fn()
//图片拼接
function draw11Fn(){
var img = new Image;//ie不支持
img.src = "https://www.baidu.com/img/flexible/logo/pc/result.png";
img.width = 200; // 使用可选的图片尺寸
img.height = 200;
img.onload = function () {
// 在画布上使用图片的实际尺寸(以 CSS 像素为单位)
// 这样会改变canvas画布的尺寸
// draw.width = this.naturalWidth;
// draw.height = this.naturalHeight;
// 若要使用自定义尺寸,必须指定缩放参数
// 让我们在画布的左上角绘制一个使用元素宽度和高度属性的图片:
cvs.drawImage(this, 0, 0, this.width, this.height);
//console.log(this.width,draw.width);//外面定义的宽度和真实宽度
var img1 = new Image;
img1.src = "https://www.baidu.com/img/flexible/logo/pc/result.png";
img1.onload = function(){
cvs.drawImage(this,this.width,0,this.width,this.width)
var img2 = new Image;
img2.src = "https://www.baidu.com/img/flexible/logo/pc/result.png";
img2.onload = function(){
cvs.drawImage(this,(this.width+this.width),0,this.width,this.width)
}
}
}
// var img1 = document.createElement("img");//也可用
// img1.src = "https://www.baidu.com/img/flexible/logo/pc/result.png";
// img1.onload = function(){
// var rep = cvs.drawImage(this,200,0,200,200)
// }
}
// draw11Fn()
//平移,缩放,旋转,这些都是对原始坐标操作的
function draw12Fn(){
//平移
//cvs.translate(x,y);
//x:坐标原点向x轴平移的距离
//y:坐标原点向y轴平移的距离
//缩放
//cvs.scale(x0,y0);
//x0:x轴按照x0的比利缩放
//y0:y轴按照y0的比利缩放
//旋转
//cvs.rotate(angle);
//angle:坐标轴转的角度(跟画圆的弧度计算是一样的)
cvs.fillStyle="#0000ff";
cvs.fillRect(0,0,200,200); //此时已经画完了
cvs.translate(50,0); //这里设置才会影响下面的矩形
cvs.scale(1,2);
cvs.fillStyle="#ffffff";
cvs.fillRect(0,0,100,50);
}
// draw12Fn()
//旋转
function draw13Fn(){
//先平移在旋转,因为先旋转坐标轴就变了
cvs.translate(100,0);
cvs.rotate(Math.PI/2);
// cvs.translate(0,-100); 先选择再平移坐标轴变了就要xy颠倒
cvs.fillStyle="#800080";
cvs.fillRect(100,0,100,50);
}
// draw13Fn()
//图形的组合
function draw14Fn(){
// cvs.globalCompositeOperation = type;
// type的值:
// 1.source-over 覆盖,在原来的图形上绘制新图(默认值)
// 2.destination-over 被覆盖,在原来的图形下面绘制新图
// 3.source-in 显示交集,颜色是新图
// 4.source-out 显示非交集,新图
// 5.destination-in 显示交集,颜色是旧图
// 6.destination-out 显示非交集,旧图
// 7.source-atop 双色,显示旧图和交集部分新图的颜色
// 8.destination-atop 双色,显示新图和交集部分旧图的颜色
// 9.lighter 全部显示,交集是叠加颜色
// 10.xor 显示全部非交集
// 11.copy 只显示新图
cvs.fillStyle = "gold";
cvs.fillRect(10,10,100,100); //旧图
cvs.globalCompositeOperation = "copy";
cvs.arc(120,120,100,0,2*Math.PI); //新图
cvs.fillStyle = "#0000ff";
cvs.fill();
}
// draw14Fn()
//动画
function draw14Fn(){
var num = 0
var drawDH = document.getElementById("drawDH");//画布
var cvsDH = drawDH.getContext("2d");
var img = new Image;
img.src = "img/11.png"
img.onload = function(){
var width = this.width/10;//每张图片的宽
setInterval(()=>{
num += -width
cvsDH.clearRect(0,0,drawDH.width,drawDH.height);
cvsDH.drawImage(img,num,0);
// this或者img都是图片
if(num == -(this.width-width)){
num = 0
}
},120)
}
}
// draw14Fn()
function draw15Fn(){
var num = 0
var drawDH = document.getElementById("drawDH");
var cvsDH = drawDH.getContext("2d");
var img = new Image;
img.src = "img/11.png"
img.onload = function(){
var width = this.width/10;//每张图片的宽
var height = this.height;
var i = 0;
setInterval(()=>{
cvsDH.clearRect(0,0,draw.width,draw.height);
cvsDH.drawImage(this,i*width,0,width,height,0,0,width,height);
if(i == 9){
i = 0;
}else{
i++;
}
},120)
}
}
// draw15Fn()
</script>
</body>
</html>