HTML5绘图

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>

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>

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>

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>

⑫填充规则

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");
    }

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);
    }

清除画布: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>

旋转坐标 

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 规范旨在帮助开发人员更轻松的编写出各类 Web 应用,以顺应当前 SaaS,云计算以及 RIA 等技术的最新趋势。在 HTML5 得以广泛推广之前,开发人员通常使用 SVG,VML 等技术进行 Web 绘图操作,但这些基于 XML 的绘图语言声明式的绘图方式并不能满足复杂绘图操作在性能上的需求,比如 Web 游戏所需要的像素级别的绘图能力。HTML5 canvas 元素的出现填补了这种不足,开发人员可以使用 JavaScript 脚本语言在 canvas 中进行一系列基于命令的图形绘制操作,本文将通过讲解如何使用 canvas 元素进行基本绘图操作,以及完成简单的动画和用户交互任务,阐明 canvas 在帮助构建 Web 图形类应用时所能够提供的能力。更多html5相关信息请关注html5中国:http://www.html5cn.org 背景介绍 HTML5 中新引入的 canvas 元素使得 Web 开发人员在无须借助任何第三方插件(如 Flash,Silverlight)的情况下,可以直接使用 JavaScript 脚本在 Web 页面进行绘图。它首次由苹果公司的 Webkit 框架引入实现,并成功运用在 Safari 浏览器中,读者在 这里可以体验到基于 canvas 的精彩示例。目前,canvas 已成为 HTML5 规范中的事实性标准,并且已经被 Firefox 3.0+, Safari 3.0+, Chrome 3.0+, Opera10.0+ 等浏览器所支持。最近(本文撰写之时),IE 也正式宣称将在其 9.0 版本之后,开始对 canvas 元素进行支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漂流の少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值