06. Web大前端时代之:HTML5+CSS3入门系列~HTML5 画布
Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html
我们先看看画布的魅力:
初始画布
canvas默认是宽300px,高150px;
绘制步骤
1.定义一个id
<canvas id="canvasOne" width="300" height="300"></canvas>
2.获取canvas对象
var canvasObj = document.getElementById('canvasOne');
3.通过getContext获取上下文
var context = canvasObj.getContext("2d");
目前支持2d绘图
4.通过javascript进行绘制
context.fillStyle = "red";
设置样式为红色
context.fillRect(125, 125, 50, 50);
,y坐标为125的地方绘制一个长为50宽为50的正方形
绘制案例
常见几何
绘制直线
绘制300*300画布的对角线
beginPath()
开始绘制
moveTo(x,y)
直线起点
lineTo(x,y)
直线终点
stroke()
绘制直线
<canvas id="canvasOne" width="300" height="300"></canvas>
<script type="text/javascript">
var canvasObj = document.getElementById('canvasOne');
var context = canvasObj.getContext("2d");
//context.strokeStyle = "#ff6a00";
context.beginPath();
context.moveTo(0, 0);
context.lineTo(300, 300);
context.stroke();
context.moveTo(0, 300);
context.lineTo(300, 0);
context.stroke();
</script>
绘制矩形
在画布中间绘制一个100*的矩形
绘制
strokeStyle
strokeRect(x,y,w,h)
填充
fillStyle
fillRect(x,y,w,h)
<canvas id="canvasOne" width="300" height="300"></canvas>
<script type="text/javascript">
var canvasObj = document.getElementById('canvasOne');
var context = canvasObj.getContext("2d");
context.strokeStyle = 'rgb(100%,0%,100%)';
context.strokeRect(100, 125, 100, 50);
</script>
绘制圆形
绘制300*300画布的内切圆
beginPath()
开始绘制路径
arc(x, y, r, s, e, b)
x,y 坐标这次是代表圆心
r 代表半径
s 代表开始弧度
e 代表结束弧度
b 代表是否逆时针方向画图
默认顺时针
closePath()
结束绘制路径
扩充案例
fill()
填充
<canvas id="canvasOne" width="300" height="300"></canvas>
<script type="text/javascript">
var canvasObj = document.getElementById('canvasOne');
var context = canvasObj.getContext("2d");
context.fillStyle = 'rgb(0,50,0)';
context.beginPath();//开始绘制路径
context.arc(150, 150, 150, 0, Math.PI * 2,true);//注意:x,y 坐标这次是代表圆心
context.closePath();//结束绘制路径
context.fill();//填充
</script>
绘制弧线
context.closePath();
路径不闭合的时候会自动画一条直线(代码看注释)
<canvas id="canvasOne" width="300" height="300"></canvas>
<canvas id="canvasTwo" width="300" height="300"></canvas>
<canvas id="canvasThree" width="300" height="300"></canvas>
<script type="text/javascript">
//第一个画布
var canvasObj = document.getElementById('canvasOne');
var context = canvasObj.getContext("2d");
for (var i = 0; i <= 15; i++) {
context.strokeStyle= 'rgb(0,50,0)';
context.beginPath();//开始绘制路径
context.arc(0, 150, i * 10, 0, Math.PI * 1.5);//注意:x,y 坐标这次是代表圆心
//context.closePath();//结束绘制路径
context.stroke();//填充
}
//第二个画布
var canvasObj2 = document.getElementById('canvasTwo');
var context2 = canvasObj2.getContext("2d");
for (var i = 0; i <= 30; i++) {
context2.strokeStyle= 'rgb(0,0,50)';
context2.beginPath();//开始绘制路径
context2.arc(0, 0, i * 10, 0, Math.PI * 1.5);//注意:x,y 坐标这次是代表圆心
//context2.closePath();//结束绘制路径
context2.stroke();//填充
}
//第三个画布-搞怪来袭
var canvasObj3 = document.getElementById('canvasThree');
var context3 = canvasObj3.getContext("2d");
for (var i = 0; i <= 30; i++) {
context3.strokeStyle= 'rgb(0,0,50)';
context3.beginPath();//开始绘制路径
context3.arc(0, 150, i * 10, 1, 3);//注意:x,y 坐标这次是代表圆心
context3.closePath();//结束绘制路径,路径不闭合的情况下会自动补上一个直线,所以就搞怪了
context3.stroke();//填充
}
</script>
绘制三角形
绘制三角形
<canvas id="myCanvas" width="200" height="200"></canvas>
<script type="text/javascript">
var c = document.getElementById("myCanvas");
var context = c.getContext("2d");
context.strokeStyle = "red";
context.beginPath();
context.moveTo(25, 25);
context.lineTo(150, 25);
context.lineTo(25, 150);
context.closePath();
context.stroke();
</script>
常用技能
透 明 度
rgba(r,g,b,a)
a代表透明度,取值范围在 0~1
清 除 画 布
context.clearRect(x,y,w,h)
(圆形橡皮擦)
案例
保存与恢复状态
状态
指当前画面所有样式,变形,裁切的快照
举个例子:你先用红色样式画一个矩形,然后保存状态,然后再用蓝色样式画一个矩形。
恢复状态画个矩形看看,发现====> 矩形是红色的====>说明====>状态保存下来了。
图例
保存
context.save();
恢复
context.restore()
移动坐标空间
context.translate(60,50);
x轴方向右移60,y轴方向下移50
for (var i = 1; i < 10; i++) {
context.save();//保存一下状态
context.translate(60 * i, 50);//x轴方向右移60*i,y轴方向下移50
//画伞的顶部
context.fillStyle = 'rgb(' + i * 25 + ',' + 0 + ',' + 255 + ')';
context.beginPath();
context.arc(0, 0, 30, 0, Math.PI, true);//在起点位置顺时针画一个半圆
context.closePath();
context.fill();
//画伞的底部
context.strokeStyle = "red";
context.strokeRect(-0.2, 0, 0.4, 30);
//画伞的根部
context.beginPath();
context.arc(-5, 30, 5, 0, Math.PI);//圆心左移五个单位,圆的右边点就在根部了
context.stroke();
context.restore();//恢复一下状态(不然每次都移动坐标原点,就变成天女散花了)
}
for (var i = 1; i < 10; i++) {
//x轴方向右移60+i,y轴方向下移50
context.translate(60 + i, 50);
//画伞的顶部
context.fillStyle = 'rgb(' + 255 + ',' + i * 25 + ',' + 0 + ')';
context.beginPath();
context.arc(0, 0, 30, 0, Math.PI, true);//在起点位置顺时针画一个半圆
context.closePath();
context.fill();
//画伞的底部
context.strokeStyle = "red";
context.strokeRect(-0.2, 0, 0.4, 30);
//画伞的根部
context.beginPath();
context.arc(-5, 30, 5, 0, Math.PI);//圆心左移五个单位,圆的右边点就在根部了
context.stroke();
}
旋转坐标空间
rotate(angle)
angle 代表旋转角度
弧度为单位
在坐标原点顺时针方向旋转
<canvas id="canvasOne" width="600" height="600"></canvas>
<script type="text/javascript">
var canvasObj = document.getElementById('canvasOne');
var context = canvasObj.getContext('2d');
context.translate(300, 300);
//画伞
function drawUmbrella(i) {
//画伞的顶部
context.fillStyle = 'rgb(' + i * 25 + ',' + 0 + ',' + 255 + ')';
context.beginPath();
context.arc(0, 0, 30, 0, Math.PI, true);//在起点位置顺时针画一个半圆
context.closePath();
context.fill();
//画伞的底部
context.strokeStyle = "red";
context.strokeRect(-0.2, 0, 0.4, 30);
//画伞的根部
context.beginPath();
context.arc(-5, 30, 5, 0, Math.PI);//圆心左移五个单位,圆的右边点就在根部了
context.stroke();
}
function draw() {
for (var i = 1; i <= 10; i++) {
context.save();//保存一下状态
context.rotate(Math.PI * (0.2 * i));//2Pi 弧度是一个圆
context.translate(0, 150);//越小越紧凑
drawUmbrella(i);//画伞(画伞代码未变)
context.restore();//恢复一下状态
}
}
window.onload = function () {
draw();
}
</script>
缩 放 图 形
context.scale(1.1, 1.1)
扩大1.1倍
rgba(r,g,b,a)
a代表透明度,取值范围在 0~1
<canvas id="canvasOne" width="600" height="600"></canvas>
<script type="text/javascript">
var canvasObj = document.getElementById('canvasOne');
var context = canvasObj.getContext('2d');
context.translate(300, 300);
for (var i = 1; i < 50; i++) {
context.rotate(Math.PI / 9);//旋转
context.scale(1.1, 1.1);//扩大1.1倍
context.translate(0.5, 0.5);//平移
context.fillStyle = 'rgba(' + i * 5 + ',' + 0 + ',' + 200 + ',' + 0.5 + ')';
context.beginPath();
context.arc(0, 0, 1, 0, Math.PI * 2, true);
context.closePath();
context.fill();
}
</script>
矩 阵 变 化
其实像 translate(移动),scale(缩放),rotate(旋转)都是特殊的矩阵变换
transform(m11,m12,m21,m22,dx,dy)
替换当前的变换矩阵(transform() 允许您缩放、旋转、移动并倾斜当前的环境)
http://www.w3school.com.cn/tags/canvas_transform.asp
参数图解
本质公式
参数详解
水平缩放绘图
m11
水平倾斜绘图
m12
垂直倾斜绘图
m21
垂直缩放绘图
m22
水平移动绘图
dx
垂直移动绘图
dy
setTransform(m11,m12,m21,m22,dx,dy)
重置并创建新的变换矩阵
http://www.w3school.com.cn/tags/canvas_settransform.asp
小案例
<canvas id="canvasOne" width="600" height="600"></canvas>
<script type="text/javascript">
var canvasObj = document.getElementById('canvasOne');
var context = canvasObj.getContext('2d');
context.translate(200, 20);
for (var i = 1; i < 90; i++) {
context.save();
//参数:水平缩放绘图,水平倾斜绘图,垂直倾斜绘图,垂直缩放绘图,水平移动绘图,垂直移动绘图
context.transform(0.95, 0, 0, 0.95, 30, 30);
context.rotate(Math.PI / 12);//旋转角度
context.beginPath();
context.fillStyle = "rgba(255,0,0,0.5)";
context.arc(0, 0, 50, 0, Math.PI * 2, true);
context.closePath();
context.fill();
}
//参数:水平缩放绘图,水平倾斜绘图,垂直倾斜绘图,垂直缩放绘图,水平移动绘图,垂直移动绘图
context.setTransform(1, 0, 0, 1, 10, 10);
//检验一下是否变化过来了
context.fillStyle = "blue";
context.fillRect(0, 0, 50, 50);
context.fill();
</script>
扩 展 样 式
线形属性
lineWidth
设置线条粗细默认为1,为正数
<canvas id="canvasOne" width="300" height="300"></canvas>
<script type="text/javascript">
var canvasObj = document.getElementById('canvasOne');
var context = canvasObj.getContext('2d');
for (var i = 1; i < 12; i++) {
context.strokeStyle = 'rgb(255,0,0)';
context.lineWidth = i;
context.beginPath();
context.moveTo(i * 20, 0);
context.lineTo(i * 20, 300);
//context.closePath();
context.stroke();
}
</script>
lineCap
设置端点样式
butt
平头
默认
round
圆头
square
方头
<canvas id="canvasOne" width="300" height="300"></canvas>
<script type="text/javascript">
var canvasObj = document.getElementById('canvasOne');
var context = canvasObj.getContext('2d');
//定义数组
var lineCap = ['butt', 'round', 'square'];
// 绘制参考线。
context.strokeStyle = 'red';
context.beginPath();
context.moveTo(10,10);
context.lineTo(10,150);
context.moveTo(150,10);
context.lineTo(150,150);
context.stroke();
// 绘制直线段。
context.strokeStyle = 'blue';
for (var i = 0; i < lineCap.length; i++) {
context.lineWidth = 20;
context.lineCap = lineCap[i];
context.beginPath();
context.moveTo(10, 30 + i * 50);
context.lineTo(150, 30 + i * 50);
context.stroke();
}
</script>
lineJoin
设置连接处样式
round
圆
bevel
斜面
miter
默认
<canvas id="canvasOne" width="500" height="200"></canvas>
<script type="text/javascript">
var canvasObj = document.getElementById('canvasOne');
var context = canvasObj.getContext('2d');
var lineJoin = ['round', 'bevel', 'miter'];
context.strokeStyle = 'rgb(0,0,0)';
for (var i = 0; i < lineJoin.length; i++) {
context.lineWidth = 25;
context.lineJoin = lineJoin[i];
context.beginPath();
context.moveTo(10 + i * 150, 30);
context.lineTo(100 + i * 150, 30);
context.lineTo(100 + i * 150, 100);
context.stroke();
}
</script>
miterLimit
设置或返回最大斜接长度
前提
lineJoin使用默认属性(miter)
<canvas id="canvasOne" width="1600" height="300"></canvas>
<script type="text/javascript">
var context = document.getElementById('canvasOne').getContext('2d');
for (var i = 1; i < 10; i++) {
context.strokeStyle = 'blue';
context.lineWidth = 10;
context.lineJoin = 'miter';
context.miterLimit = i * 10;
context.beginPath();
context.moveTo(10, i * 30);
context.lineTo(100, i * 30);
context.lineTo(10, 33 * i);
context.stroke();
}
</script>
渐 变 系 列
线形渐变
createLinearGradient(x0, y0, x1, y1)
请使用该对象作为 strokeStyle 或 fillStyle 属性的值
x0,y0
渐变起点
x1,y1
渐变终点
addColorStop(position, color);
一般都是设置多个色标
position
色相偏移值
取值 0~1
color
颜色
并非一定从0开始,1结束
<canvas id="canvasOne" width="300" height="300"></canvas>
<script type="text/javascript">
var context = document.getElementById('canvasOne').getContext('2d');
var lingrad = context.createLinearGradient(0, 0, 0, 200);
lingrad.addColorStop(0, '#ff0000');
lingrad.addColorStop(1 / 7, '#ff9900');
lingrad.addColorStop(2 / 7, '#ffff00');
lingrad.addColorStop(3 / 7, '#00ff00');
lingrad.addColorStop(4 / 7, '#00ffff');
lingrad.addColorStop(5 / 7, '#0000ff');
lingrad.addColorStop(6 / 7, '#ff00ff');
lingrad.addColorStop(1, '#ff0000');
context.fillStyle = lingrad;
context.fillRect(10, 10, 200, 200);
</script>
var c = document.getElementById('myCanvas');
var ctx = c.getContext('2d');
var grd = ctx.createLinearGradient(0, 0, 170, 0);
grd.addColorStop(0.1, 'rgb(255,255,255)');
grd.addColorStop(0.5, 'rgb(0,100,0)');
grd.addColorStop(0.9, 'rgb(0,0,0)');
ctx.fillStyle = grd;
ctx.fillRect(20, 20, 150, 100);
径向渐变
createRadialGradient(x1,y1,r1,x2,y2,r2)
以(x1,y1)为原点,r1为半径的圆
以(x2,y2)为原点,r2为半径的圆
addColorStop(position, color);
一般都是设置多个色标
position
色相偏移值
取值 0~1
color
颜色
并非一定从0开始,1结束
<canvas id="myCanvas" width="300" height="240"></canvas>
<script language="javascript">
var ctx = document.getElementById('myCanvas').getContext('2d');
var radgrad = ctx.createRadialGradient(55, 55, 20, 100, 100, 90);
radgrad.addColorStop(0, 'rgb(255,255,0)');
radgrad.addColorStop(0.75, 'rgb(255,0,0)');
radgrad.addColorStop(1, 'rgb(255,255,255)');
ctx.fillStyle = radgrad;
ctx.fillRect(10, 10, 200, 200);
</script>
创 建 阴 影
参数
shadowOffsetX
shadowOffsetX 属性设置或返回形状与阴影的水平距离
shadowOffsetX=0 指示阴影位于形状的正下方。
shadowOffsetX=20 指示阴影位于形状 left 位置右侧的 20 像素处。
shadowOffsetX=-20 指示阴影位于形状 left 位置左侧的 20 像素处。
shadowOffsetY
shadowOffsetY 属性设置或返回形状与阴影的垂直距离。
shadowOffsetY=0 指示阴影位于形状的正下方。
shadowOffsetY=20 指示阴影位于形状 top 位置下方的 20 像素处。
shadowOffsetY=-20 指示阴影位于形状 top 位置上方的 20 像素处。
shadowBlur
shadowBlur 属性设置或返回阴影的模糊级数。
shadowColor
shadowColor 属性设置或返回用于阴影的颜色
<canvas id="canvasOne" width="600" height="600"></canvas>
<script type="text/javascript">
var canvasObj = document.getElementById('canvasOne');
var context = canvasObj.getContext('2d');
//设置前画个图
context.fillStyle = '#0094ff';
context.fillRect(410, 310, 50, 50);
//设置阴影
context.shadowOffsetX = 3;
context.shadowOffsetY = 3;
context.shadowBlur = 1;
context.shadowColor = '#808080';
//画矩形
context.fillRect(200, 200, 200, 100);
//绘图
var img = new Image();
img.src = '/images/1.jpg';
img.onload = function () {
context.fillStyle = context.createPattern(img, 'no-repeat');
context.fillRect(0, 0, 600, 600);
}
</script>
绘制文字
绘制填充文字
fillText(str,x,y,[mw])
str
文字内容
x,y
起点坐标
mw
最大宽度
可选参数
绘制文字轮廓
strokeText(str,x,y,[mw])
str
文字内容
x,y
起点坐标
mw
最大宽度
可选参数
测量文字宽度
measureText(str)
context.measureText(str).width
文字宽度
str
文字内容
文字系列属性
context.font
语法
context.font="italic small-caps bold 12px arial";
font-style
规定字体样式。可能的值:
normal
italic
斜体字
oblique
倾斜
font-variant
规定字体变体。可能的值:
normal
small-caps
大写
font-weight
规定字体的粗细。可能的值:
normal
bold
bolder
lighter
100
font-family
规定字体系列。
font-size / line-height
规定字号和行高,以像素计。
icon
使用用于标记图标的字体。
menu
使用用于菜单中的字体(下拉列表和菜单列表)。
caption
使用标题控件的字体(比如按钮、下拉列表等)。
status-bar
使用用于窗口状态栏中的字体。
message-box
使用用于对话框中的字体。
small-caption
使用用于标记小型控件的字体。
案例
<canvas id="canvasOne" width="500" height="300"></canvas>
<script type="text/javascript">
var canvasObj = document.getElementById('canvasOne');
var context = canvasObj.getContext('2d');
var str = 'http://dnt.dkill.net';
context.fillStyle = 'rgba(255,0,0,0.9)';
context.strokeStyle = 'rgba(255,0,0,0.9)';
context.font = '30px 微软雅黑';
context.strokeText(str, 100, 40);
console.log(context.measureText(str).width);
context.fillText(str, 100, 80);
console.log(context.measureText(str).width);
context.font = 'bold 30px 微软雅黑';
context.strokeText(str, 100, 150);
console.log(context.measureText(str).width);
context.fillText(str, 100, 180);
console.log(context.measureText(str).width);
</script>
图像系列
1.图像来源
路径图片
直接对 src 赋值
var img=new Image();
img.src='xxx';
页面图片
来源于页面,如果已知id则可通过
document.images 集合
document.getElementsByTagName
document.getElementsById
其他canvas元素
document.getElementsByTagName
document.getElementsById
2.drawImage绘图
context.drawImage(img,x,y)
在画布上定位图像
img 规定要使用的图像、画布或视频。
x 在画布上放置图像的 x 坐标位置。
y 在画布上放置图像的 y 坐标位置。
//获取路径图片
document.getElementById('btn1').onclick = function () {
clearCanvas(context);
var img1 = new Image();
img1.src = '/images/1.jpg';
context.drawImage(img1, 150, 150);
}
context.drawImage(img,x,y,w,h)
在画布上定位图像,并规定图像的宽度和高度
img 规定要使用的图像、画布或视频。
x 在画布上放置图像的 x 坐标位置。
y 在画布上放置图像的 y 坐标位置。
w 要使用的图像的宽度。(伸展或缩小图像)
h 要使用的图像的高度。(伸展或缩小图像)
//获取页面图片
document.getElementById('btn2').onclick = function () {
clearCanvas(context);
var img2 = document.getElementById('imgOne');
context.drawImage(img2, 150, 150, 200, 200);
}
context.drawImage(img,sx,sy,sw,sh,x,y,w,h)
剪切图像,并在画布上定位被剪切的部分
img 规定要使用的图像、画布或视频。
sx 开始剪切的 x 坐标位置。
sy 开始剪切的 y 坐标位置。
sw 被剪切图像的宽度。
sh 被剪切图像的高度。
x 在画布上放置图像的 x 坐标位置。
y 在画布上放置图像的 y 坐标位置。
w 要使用的图像的宽度。(伸展或缩小图像)
h 要使用的图像的高度。(伸展或缩小图像)
//从Canvas获取
document.getElementById('btn3').onclick = function () {
clearCanvas(context);
var img3 = document.getElementById('canvasTwo');
context.drawImage(img3, 150, 150, 300, 250, 50, 50, 400, 300);
}
扩展(不完美)
createPattern(image,type)
image
规定要使用的图片、画布或视频元素
var img=new Image();
type
是否重发
repeat|repeat-x|repeat-y|no-repeat
<canvas id="canvasOne" width="600" height="600"></canvas>
<script type="text/javascript">
var canvasObj = document.getElementById('canvasOne');
var context = canvasObj.getContext('2d');
var img = new Image();
img.src = '/images/1.jpg';
img.onload = function () {
context.fillStyle = context.createPattern(img, 'repeat');
context.fillRect(0, 0, 600, 600);
}
</script>
注意:
context.fillRect(100, 0, 600, 600);
这里的fillRect(x,y,w,h)。x,y既指的是坐标原点,也指的是图片原点
扩展部分
绘制贝塞尔曲线
二次方贝塞尔曲线
quadraticCurveTo(cp1x,cp1y,x,y)
cp1x,cp1y是控制点坐标
x,y是终点坐标
<canvas id="myCanvas" style="border:1px solid;" width="300" height="200"></canvas>
<script type="text/javascript">
var c=document.getElementById("myCanvas");
var context=c.getContext("2d");
// 下面开始绘制二次方贝塞尔曲线。
context.strokeStyle="dark";
context.beginPath();
context.moveTo(0,200);
context.quadraticCurveTo(75,50,300,200);
context.stroke();
context.globalCompositeOperation="source-over";
// 下面绘制的直线用于表示上面曲线的控制点和控制线,控制点坐标即两直线的交点(75,50)。
context.strokeStyle="#ff00ff";
context.beginPath();
context.moveTo(75,50);
context.lineTo(0,200);
context.moveTo(75,50);
context.lineTo(300,200);
context.stroke();
</script>
三次方贝塞尔曲线
bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y)
cp1x,cp1y是控制点坐标
cp2x,cp2y是第二个控制点坐标
x,y是终点坐标
<canvas id="myCanvas" width="300" height="200"></canvas>
<script type="text/javascript">
var c=document.getElementById("myCanvas");
var context=c.getContext("2d");
// 下面开始绘制三次方贝塞尔曲线。
context.strokeStyle="dark";
context.beginPath();
context.moveTo(0,200);
context.bezierCurveTo(25,50,75,50,300,200);
context.stroke();
context.globalCompositeOperation="source-over";
// 下面绘制的直线用于表示上面曲线的控制点和控制线,控制点坐标为(25,50)和(75,50)。
context.strokeStyle="#ff00ff";
context.beginPath();
context.moveTo(25,50);
context.lineTo(0,200);
context.moveTo(75,50);
context.lineTo(300,200);
context.stroke();
</script>
组合裁切
组合
globalCompositeOperation
设置或返回如何将一个源(新的)图像绘制到目标(已有)的图像上
裁切
clip()
从原始画布中剪切任意形状和尺寸
案例
从画布中剪切 200*120 像素的矩形区域。然后,绘制绿色矩形。只有被剪切区域内的绿色矩形部分是可见的
<p>不使用 clip():</p>
<canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;"></canvas>
<script>
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.rect(50, 20, 200, 120);
ctx.stroke();
ctx.fillStyle = "green";
ctx.fillRect(0, 0, 150, 100);
</script>
<br />
<p>使用 clip():</p>
<canvas id="myCanvas2" width="300" height="150" style="border:1px solid #d3d3d3;"></canvas>
<script>
var c = document.getElementById("myCanvas2");
var ctx = c.getContext("2d");
// Clip a rectangular area
ctx.rect(50, 20, 200, 120);
ctx.stroke();
ctx.clip();
// Draw red rectangle after clip()
ctx.fillStyle = "green";
ctx.fillRect(0, 0, 150, 100);
</script>
案例2
<canvas id="myCanvas" style="border:1px solid;" width="300" height="300"></canvas>
<script type="text/javascript">
function draw() {
var ctx = document.getElementById('myCanvas').getContext("2d");
// 绘制背景。
ctx.fillStyle = "black";
ctx.fillRect(0, 0, 300, 300);
ctx.fill();
// 绘制圆形。
ctx.beginPath();
ctx.arc(150, 150, 130, 0, Math.PI * 2, true);
// 裁切路径。
ctx.clip();
ctx.translate(200, 20);
for (var i = 1; i < 90; i++) {
ctx.save();
ctx.transform(0.95, 0, 0, 0.95, 30, 30);
ctx.rotate(Math.PI / 12);
ctx.beginPath();
ctx.fillStyle = "red";
ctx.globalAlpha = "0.4";
ctx.arc(0, 0, 50, 0, Math.PI * 2, true);
ctx.closePath();
ctx.fill();
}
}
window.onload = function () {
draw();
}
</script>
06. Web大前端时代之:HTML5+CSS3入门系列~HTML5 画布的更多相关文章
- 04. Web大前端时代之:HTML5+CSS3入门系列~HTML5 表单
Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 一.input新增类型: 1.tel:输入类型用于应该包 ...
- Web大前端时代之:HTML5+CSS3入门系列
准备来一波新技术,待续.... Old: 联系源码:https://github.com/dunitian/LoTHTML5 文档下载:https://github.com/dunitian/LoTD ...
- 07. Web大前端时代之:HTML5+CSS3入门系列~H5 地理位置
Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 源码:https://github.com/duniti ...
- 01.Web大前端时代之:HTML5+CSS3入门系列~初识HTML5
Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 文档申明 <!--文档类型申明,html代表是ht ...
- 02.Web大前端时代之:HTML5+CSS3入门系列~H5结构元素
Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 1.结构元素 可以理解为语义话标记,比如:以前这么写&l ...
- 03.Web大前端时代之:HTML5+CSS3入门系列~H5功能元素
Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 2.功能元素 1.hgroup 对网页或区段(secti ...
- 05. Web大前端时代之:HTML5+CSS3入门系列~H5 多媒体系
Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 1.引入 概述 音频文件或视频文件都可以看做是一个容器文 ...
- 08. Web大前端时代之:HTML5+CSS3入门系列~H5 Web存储
Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html
- 08. Web大前端时代之:HTML5+CSS3入门系列 ~ QQ空间时间轴
Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 大前端系列,主要就是使用CSS3.0来实现,注释我已经打 ...
随机推荐
- 【每日一linux命令3】参数(或称选项)顺序
一般除了特殊情况,参数是没有顺序的.举例而言,输入"–a –v"与输入"–v –a"以及"–av" 的执行效果是相同的.但若该参数后指定了要 ...
- 踩石行动:ViewPager无限轮播的坑
2016-6-19 前言 View轮播效果在app中很常见,一想到左右滑动的效果就很容易想到使用ViewPager来实现.对于像我们常说的banner这样的效果,具备无限滑动的功能是可以用ViewPa ...
- 记一个mvn奇怪错误: Archive for required library: 'D:/mvn/repos/junit/junit/3.8.1/junit-3.8.1.jar' in project 'xxx' cannot be read or is not a valid ZIP file
我的maven 项目有一个红色感叹号, 而且Problems 存在 errors : Description Resource Path Location Type Archive for requi ...
- $.extend()的实现源码 --(源码学习1)
目标: $.extend({ add:function(a,b){ return a + b; } }) console.log($.a ...
- SQL Server-聚焦NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL性能分析(十八)
前言 本节我们来综合比较NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL的性能,简短的内容,深入的理解,Always to review the basics. ...
- UWP开发必备:常用数据列表控件汇总比较
今天是想通过实例将UWP开发常用的数据列表做汇总比较,作为以后项目开发参考.UWP开发必备知识点总结请参照[UWP开发必备以及常用知识点总结]. 本次主要讨论以下控件: GridView:用于显示数据 ...
- mac下安装及配置tomcat
mac下的软件不像windows下的程序那样写注册表,对于tomcat的安装来说,在mac下是名符其实的绿色软件,具体操作如下: 1.到 apache官方主页 下载完整 tar.gz文件包.(没有专门 ...
- MySQL加密
MySQL字段加密和解密 1.加密:aes_encrypt('admin','key') 解密:aes_decrypt(password,'key') 2.双向加密 通过密钥去加密,解密的时候的只有知 ...
- 第14章 Linux启动管理(2)_启动引导程序grub
2. 启动引导程序grub 2.1 Grub配置文件 (1)grub中分区的表示 硬盘 分区 Linux设备文件名 Grub中设备文件名 第1块SCSI硬盘 第1个主分区 /dev/sda1 hd(0 ...
- SpringMvc中的数据校验
SpringMvc中的数据校验 Hibernate校验框架中提供了很多注解的校验,如下: 注解 运行时检查 @AssertFalse 被注解的元素必须为false @AssertTrue 被注解的元素 ...