1.canvas标签

html5新增了canvas标签

使用canvas

<canvas id=”myCanvas” width=”200” height=”100”></canvas>

在js中用getContext()方法获取画布的上下文,以获取允许进行绘制的2D环境

var c=document.getElementById(“myCanvas”);

var context=c.getContext(“2d”);

2.绘制矩形

canvas仅提供一种原生的图形绘制:矩形

三种方法绘制矩形

①fillRect(x,y,width,height):绘制一个填充的矩形

②strokeRect(x,y,width,height):绘制一个矩形的边框

③clearRect(x,y,width,height):清除指定矩形区域

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>
<canvas id="canvas" width="300" height="200" style="border: solid 1px #999;"></canvas>
<script>
    draw();
    function draw() {
        var canvas=document.getElementById('canvas');
        if(canvas.getContext){
            var ctx=canvas.getContext('2d');
            ctx.fillRect(25,25,100,100);
            ctx.clearRect(45,45,60,60);
            ctx.strokeRect(50,50,50,50);
        }
    }
</script>
</body>
</html>

html5绘制半月 html5绘图_html5绘制半月

3.路径

 图形的基本元素是路径

用路径绘制图形的步骤

①创建路径起始点,调用beginPath()方法

②使用画图命令绘制路径

③把路径封闭

④生成路径后,可通过描边或填充来渲染图形

closePath()闭合路径

stroke()描边路径,不会自动闭合没有闭合的形状

fill()填充路径,调用该方法,所有没有闭合的形状都会自动闭合

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>
<canvas id="canvas" width="300" height="200" style="border: solid 1px #999;"></canvas>
<script>
    draw();
    function draw() {
        var canvas=document.getElementById('canvas');
        if(canvas.getContext){
            var ctx=canvas.getContext('2d');
            ctx.moveTo(75,50);
            ctx.lineTo(100,75);
            ctx.lineTo(100,25);
            ctx.fill();
        }
    }
</script>
</body>
</html>

html5绘制半月 html5绘图_css_02

lineTo()方法可以绘制直线

line(x,y)将绘制一条从当前位置到指定(x,y)位置的直线

arc()方法可以绘制弧或者圆

arc(x,y,r,sAngle,eAngle,counterclockwise)

sAngle:起始角,以弧度计。(弧的圆形的三点钟方向是0度)

eAngle:起始角,以弧度计。

counterclockwise:可选参数,定义绘图方向。false为顺时针,为默认值。true为逆时针。

4.绘制曲线

quadraticCurveTo(cpx,cpy,x,y)方法可以绘制二次方贝塞尔曲线

cpx,cpy表示控制点的x和y坐标

x,y表示结束点的坐标

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>
<canvas id="canvas" width="300" height="200" style="border: solid 1px #999;"></canvas>
<script>
    draw();
    function draw() {
        var canvas=document.getElementById('canvas');
        var ctx=canvas.getContext('2d');
        ctx.beginPath();
        ctx.moveTo(0,200);
        ctx.quadraticCurveTo(75,50,300,200);
        ctx.strokeStyle="dark";
        ctx.stroke();
        ctx.globalCompositeOperation="source-over";
        ctx.strokeStyle="#ff00ff";
        ctx.beginPath();
        ctx.moveTo(75,50);
        ctx.lineTo(0,200);
        ctx.moveTo(75,50);
        ctx.lineTo(300,200);
        ctx.stroke();
    }
</script>
</body>
</html>

html5绘制半月 html5绘图_css_03

bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y)方法可以绘制三次方贝塞尔曲线

cp1x,cp1y表示第一个控制点的x和y坐标

cp2x,cp2y表示第二个控制点的x和y坐标

x,y表示结束点的坐标

5.canvas定义样式和颜色

①fillStyle和strokeStyle分别设置图形的填充颜色和轮廓颜色

初始颜色都是黑色,#000000

②rgba(R,G,B,A)

R,G,B将红绿蓝指定为0-255的十进制整数

A把alpha(不透明)指定为0.0-1.0之间的一个浮点数值。0.0为完全透明。1.0为完全不透明。

例如,表示半透明的完全红色rgba(255,0,0,0.5)

③lineWidth属性可以设置线条的粗细,取值必须为正数,默认值为1.0

④lineCap属性用于设置线段端点的样式:butt(平头)、round(圆头)和square(方头),默认值为butt

⑤lineJoin属性用于设置两条线段连接处的样式:round(圆角)、bevel(斜角)和miter(直角),默认值为miter

⑥miterLimit属性用于设置两条线段连接处交点的绘制方式,如果lineJoin属性为round和bevel时,该属性无效

⑦虚线

⑧线性渐变

⑨径向渐变

⑩图案

⑪阴影

四个属性:shadowColor(阴影颜色)、shadowBlur(阴影的模糊级别)、shadowOffsetX(阴影在x轴的偏移距离)、shadowOffsetY(阴影在y轴的偏移距离)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>
<canvas id="canvas" width="300" height="200" style="border: solid 1px #999;"></canvas>
<script>
    draw();
    function draw() {
        var ctx=document.getElementById('canvas').getContext('2d');
        //设置阴影
        ctx.shadowBlur=4;
        ctx.shadowOffsetX=4;
        ctx.shadowOffsetY=4;
        ctx.shadowColor="rgba(0,0,0,0.5)";
        //绘制文本
        ctx.font="60px Times New Roman";
        ctx.fillStyle="Black";
        ctx.fillText("Canvas API",5,80);
    }
</script>
</body>
</html>

html5绘制半月 html5绘图_html5绘制半月_04

⑫填充规则

fill()方法可以接收两个值定义填充规则:“nonezero”和“evenodd”

function draw() {
        var ctx=document.getElementById('canvas').getContext('2d');
        ctx.beginPath();
        ctx.arc(50,50,30,0,Math.PI*2,true);
        ctx.arc(50,50,15,0,Math.PI*2,true);
        ctx.fill("evenodd");
    }

html5绘制半月 html5绘图_html5_05

6.图形变形

Canvas状态存储在栈中,使用save()方法可以将当前状态送到栈中保存,使用restore()方法可以将上一个保存的状态从栈中弹出

示例

function draw() {
        var ctx=document.getElementById('canvas').getContext('2d');
        //绘制第一个矩形
        ctx.fillStyle="yellow";
        ctx.strokeStyle="blue";
        ctx.fillRect(20,20,100,100);
        ctx.strokeRect(20,20,100,100);
        ctx.fill();
        ctx.stroke();
        //保存当前canvas状态
        ctx.save();
        //绘制第二个图形
        ctx.fillStyle="green";
        ctx.strokeStyle="red";
        ctx.fillRect(140,20,100,100);
        ctx.strokeRect(140,20,100,100);
        ctx.fill();
        ctx.stroke();
        //恢复第一个矩形的状态
        ctx.restore();
        ctx.fillRect(20,140,50,50);
        ctx.strokeRect(80,140,50,50);
    }

html5绘制半月 html5绘图_html5_06

清除画布:clearRect(x,y,width,height)

x,y是要清除的矩形的左上角的坐标,width和height是要清除的矩形的宽度和高度

移动坐标

translate(dx,dy)

dx,dy分别表示坐标原点沿水平和垂直两个方向的偏移量

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>
<canvas id="myCanvas" width="600" height="200" style="border: solid 2px black"></canvas>
<script type="text/javascript">
    draw();
    function draw() {
        let ctx=document.getElementById("myCanvas").getContext('2d');
        ctx.translate(0,80);
        for(let i=1;i<10;i++){
            ctx.save();
            ctx.translate(60*i,0);
            drawTop(ctx,"rgb("+(30*i)+","+(255-30*i)+",255)");
            drawGrip(ctx);
            ctx.restore();
        }
    }
    //绘制伞形顶部半圆
    function drawTop(ctx,fillStyle){
        ctx.fillStyle=fillStyle;
        ctx.beginPath();
        ctx.arc(0,0,30,0,Math.PI,true);
        ctx.closePath();
        ctx.fill();
    }
    //绘制伞形底部手柄
    function drawGrip(ctx){
        ctx.save();
        ctx.fillStyle="blue";
        ctx.fillRect(-1.5,0,1.5,40);
        ctx.beginPath();
        ctx.strokeStyle="blue";
        ctx.arc(-5,40,4,Math.PI,Math.PI*2,true);
        ctx.stroke();
        ctx.closePath();
        ctx.restore();
    }
</script>
</body>
</html>

html5绘制半月 html5绘图_canvas_07

旋转坐标 

rotate(angle)

旋转角度angle以顺时针为正方向,以弧度为单位。

7.绘制文本

填充文字

fillText(text,x,y,maxWidth)方法可在画布上绘制填色文本,默认是黑色

x,y是开始绘制文本是坐标位置

maxWidth:可选。允许的最大文本宽度

轮廓文字

strokeText(text,x,y,maxWidth)方法可在画布上绘制描边文本,默认是黑色

文本样式

8.测量宽度

measureText()方法可以测量当前绘制文字的宽度,要用到该对象的width属性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>测量文字宽度</title>
</head>
<body>
<canvas id="myCanvas" width="400" height="200" style="border: solid 2px black"></canvas>
<script type="text/javascript">
    draw();
    function draw() {
        let ctx=document.getElementById("myCanvas").getContext('2d');
        ctx.font="bold 20px 楷体";
        ctx.fillStyle="Blue";
        let txt1="HTML5+CSS3";
        ctx.fillText(txt1,10,40);
        let txt2="以上字符串的宽度为:";
        let mtxt1=ctx.measureText(txt1);
        let mtxt2=ctx.measureText(txt2);
        ctx.font="bold 15px 宋体";
        ctx.fillStyle="Red";
        ctx.fillText(txt2,10,80);
        ctx.fillText(mtxt1.width.toString(),mtxt2.width,80);
    }
</script>
</body>
</html>

html5绘制半月 html5绘图_html5_08