<script>
window.onload = function () {
draw('canvas1');
draw('canvas2');
draw('canvas3');
draw('canvas4');
draw('canvas5');
draw('canvas6');
draw('canvas7');
draw('canvas8');
draw('canvas9');
}; function draw(id) {
var canvas = document.getElementById(id);
if (canvas == null) {
return false;
}
var context = canvas.getContext('2d');
context.fillStyle = "#eeeeef";
context.fillRect(, , , );
//形状渐变
if (id == "canvas1") {
for (var i = ; i <= ; i++) {
context.beginPath();
context.arc(i * , i * , i * , , Math.PI * , true);
          //一定要关闭路径
context.closePath();
context.fillStyle = "rgba(255,0,0,0.25)";
context.fill();
}
}
//莲花形
else if (id == "canvas2") {
var dx = ;
var dy = ;
var s = ;
context.beginPath();
context.fillStyle = "rgb(100,255,100)";
context.strokeStyle = "rgb(0,0,100)";
var x = Math.sin();
var y = Math.cos();
var dig = Math.PI / * ;
for (var i = ; i < ; i++) {
var x = Math.sin(i * dig);
var y = Math.cos(i * dig);
context.lineTo(dx + x * s, dy + y * s);
}
context.closePath();
context.fill();
context.stroke();
}
//贝塞尔曲线,从中心圆引出的线都是曲线
else if (id == "canvas3") {
var dx = ;
var dy = ;
var s = ;
context.beginPath();
context.fillStyle = "rgb(100,255,100)";
var x = Math.sin();
var y = Math.cos();
var dig = Math.PI / * ;
for (var i = ; i < ; i++) {
var x = Math.sin(i * dig);
var y = Math.cos(i * dig);
context.bezierCurveTo(dx + x * s, dy + y * s - , dx + x * s + , dy + y * s, dx + x * s, dy + y * s);
}
context.closePath();
context.fill();
context.stroke();
}
//颜色渐变
else if (id == "canvas4") {
var g1 = context.createLinearGradient(, , , );
g1.addColorStop(, "rgb(255,255,0)");
g1.addColorStop(, "rgb(0,255,255)");
context.fillStyle = g1;
context.fillRect(, , , );
var g2 = context.createLinearGradient(, , , );
g2.addColorStop(, "rgba(0,0,255,0.5)");
g2.addColorStop(, "rgba(255,0,0,0.5)");
for (var i = ; i < ; i++) {
context.beginPath();
context.fillStyle = g2;
context.arc(i * , i * , i * , , Math.PI * , true);
context.closePath();
context.fill();
}
}
//径向渐变
else if (id == "canvas5") {
var g1 = context.createRadialGradient(, , , , , );
g1.addColorStop(0.1, "rgb(255,255,0)");
g1.addColorStop(0.3, "rgb(255,0,255)");
g1.addColorStop(, "rgb(0,255,255)");
context.fillStyle = g1;
context.fillRect(, , , );
}
//变形
else if (id == "canvas6") {
var canvas = document.getElementById(id);
if (canvas == null) {
return false;
}
var context = canvas.getContext("2d");
context.fillStyle = "#eeeeef";
context.fillRect(, , , );
context.translate(, );
context.fillStyle = "rgba(255,0,0,0.25)";
for (var i = ; i < ; i++) {
context.translate(, );
context.scale(0.95, 0.95);
         //旋转
context.rotate(Math.PI / );
context.fillRect(, , , );
}
}
//组合图形
else if (id == "canvas7") {
var oprtns = new Array(
"source-atop",//只绘制原有图层中被新图层所覆盖的部分与新图层的其他部分,原有图层中的其他部分变成透明
"source-in",//只显示重叠的部分,其他部分透明
"source-out",//只显示不重叠的部分,其他部分透明
"source-over",//表示新图层在原有图层之上
"destination-atop",
"destination-in",
"destination-out",
"destination-over",
"lighter",//原图层和新图层均绘制,重叠部分做加色处理
"copy",//只绘制新图层,原图层中未与新图层重叠的部分变成透明
"xor"//只绘制不重叠部分
);
i = ;
context.fillStyle = "blue";
context.fillRect(, , , );
context.globalCompositeOperation = oprtns[i];
context.beginPath();
context.fillStyle = "red";
context.arc(, , , Math.PI * , false);
context.fill();
}
//阴影图形
else if (id == "canvas8") {
context.fillStyle = "#eeeeef";
context.fillRect(, , , );
context.shadowOffsetX = ;
context.shadowOffsetY = ;
context.shadowColor = "rgba(100,100,100,0.5)";
context.shadowBlur = 3.5;
for (var i = ; i < ; i++) {
context.translate(, )
Create5Star(context);
context.fill();
}
}
//复制图片
else if (id == "canvas9") {
context.fillStyle = "#ffffff";
context.fillRect(, , , );
var image = new Image();
image.src = "/images/1.jpg";
image.onload = function () {
drawImage(context, image);
}
}
} //绘制图片
function drawImage(context, image) {
//从(0,0)开始绘制
//context.drawImage(image, 0, 0); //从(0,0)开始绘制,大小为200*200
context.drawImage(image, , , , ); //drawImage(img,sx,sy,sw,sh,dx,dy,dw,dh)
//drawImage(img对象,原图被复制区域的起始坐标和宽高,复制区域在画布上的起始坐标和宽高)
context.drawImage(image, ,,,,,,,);
} //创建五角星
function Create5Star(context) {
var dx = ;
var dy = ;
var s = ;
context.beginPath();
context.fillStyle = "rgba(255,0,0,0.5)";
var x = Math.sin();
var y = Math.cos();
var dig = Math.PI / * ;
for (var i = ; i < ; i++) {
var x = Math.sin(i * dig);
var y = Math.cos(i * dig);
context.lineTo(dx + x * s, dy + y * s);
}
context.closePath();
}
</script>

以上是用Canvas的getContext("2d")方法实现的简单图形。

下面实现当鼠标点击和移动时流星雨效果,利用createjs中的Easeljs:

    <script src="easeljs-0.8.1.min.js"></script>
<script>
var canvas;
var stage;
var sprite; window.onload = function () {
canvas = document.getElementById("canvas");
stage = new createjs.Stage(canvas); stage.addEventListener("stagemousedown", clickCanvas);
stage.addEventListener("stagemousemove", moveCanvas); var data = {
images: ["1.jpg"],
frames: { width: , height: , regX: , regY: }
}; sprite = new createjs.Sprite(new createjs.SpriteSheet(data));
createjs.Ticker.setFPS();
createjs.Ticker.addEventListener("tick", tick);
} function tick(e) {
var t = stage.getNumChildren();
for (var i = t-; i > ; i--) {
var s = stage.getChildAt(i);
debugger;
s.vY += ;
s.vX += ;
s.x += s.vX;
s.y += s.vY; s.scaleX = s.scaleY = s.scaleX + s.vS;
s.alpha += s.vA; if (s.alpha<=||s.y>canvas.height) {
stage.removeChildAt(i);
}
}
stage.update(e);
} //点击鼠标
function clickCanvas(e) {
debugger;
addS(Math.random() * + , stage.mouseX, stage.mouseY, );
} //移动鼠标
function moveCanvas(e) {
debugger;
addS(Math.random() * + , stage.mouseX, stage.mouseY, );
} function addS(count, x, y, speed) {
debugger;
for (var i = ; i < count; i++) {
var s = sprite.clone();
s.x = x;
s.y = y;
s.alpha = Math.random() * 0.5 + 0.5;
s.scaleX = s.scaleY = Math.random() + 0.3; var a = Math.PI * * Math.random();
var v = (Math.random() - 0.5) * * speed;
s.vX = Math.cos(a) * v;
s.vY = Math.sin(a) * v;
s.vS = (Math.random() - 0.5) * 0.2;//scale 缩放
s.vA = -Math.random()*0.05 - 0.01;//alpha 透明度
stage.addChild(s);
}
}
</script>

Createjs:http://createjs.com/

Canvas的APIhttps://developer.mozilla.org/zh-CN/docs/Web/API/CanvasRenderingContext2D

Canvas 画布小案例的更多相关文章

  1. 微信小程序--canvas画布实现图片的编辑

    技术:微信小程序   概述 上传图片,编辑图片大小,添加文字,改变文字颜色等 详细 代码下载:http://www.demodashi.com/demo/14789.html 概述 微信小程序--ca ...

  2. 微信小程序 在canvas画布上划动,页面禁止滑动

    要实现微信小程序 在canvas画布上划动,页面禁止滑动,不仅要设置disable-scroll="true",还要要给canvas绑定一个触摸事件才能生效. <canvas ...

  3. [技术博客]海报图片生成——小程序canvas画布

    目录 背景介绍 canvas简介 代码实现 难点讲解 圆角矩形裁剪失败之PS的妙用 编码不要过硬 对过长的文字进行截取 真机首次生成时字体不对 drawImage只能使用本地图片 背景介绍 目标:利用 ...

  4. 微信小程序_(组件)canvas画布

    canvas画布效果 官方文档:传送门 Page({ canvasIdErrorCallback: function (e) { console.error(e.detail.errMsg) }, o ...

  5. 小程序开发-Canvas画布组件

    Canvas画布 基本使用方法: 在wxml中添加canvas组件 <canvas canvas-id='canvasDemo' class='demo'></canvas> ...

  6. canvas实践小实例一 —— 画板工具

    前面讲了一部分的canvasAPI的基础知识,光看API的介绍确实是很无趣乏味,需要一点可以激发内心的激情的东西来激励自己来学习,于是就了伴随canvasAPI学习的小实例,这样通过API的知识,结合 ...

  7. “canvas画布仿window系统自带画图软件"项目的思考

    "canvas画布仿window系统自带画图软件"项目的思考 首先贴上DEMO图,并没有美化效果.对UI有要求的,请自带补脑技术. 思考一 在做项目的过程中,我发现"工具 ...

  8. 更新——Canvas画布动画效果之实现倒计时

    Hello,大家好! 小W复活啦!继续欢乐的给大家更博,输送新知识~~ 不开玩笑啦!秒进正题~~~ 上次更博,小W给大家介绍了Canvas画布的基础部分,以及实现了一个由7*10点阵图显示的倒计时的基 ...

  9. CANVAS画布与SVG的区别

    CANVAS是html5提供的新元素<canvas>,而svg存在的历史要比canvas久远,svg并不是html5专有的标签,最初svg是用xml技术(超文本扩展语言,可以自定义标签或属 ...

随机推荐

  1. [学习Vulkan之一] 初识Vulkan

    Vulkan是Khronos组织制定的"下一代"开放的图形显示API,是与DirectX12可以匹敌的GPU API标准.Vulkan是基于AMD的Mantle API演化而来,目 ...

  2. 郑轻校赛题目 问题 G: 多少个0

    问题 G: 多少个0 时间限制: 1 Sec  内存限制: 128 MB提交: 192  解决: 40 题目描述 一个n*n的方格,每个格子中间有一个数字是2或者5,现在从方格的左上角走到右下角,每次 ...

  3. VS 解决方案管理器和 编辑窗口同步 联动

    对于题目的解释就是   当我点击一下解决方案管理器中的 某一个文档时, 编辑窗口会联动的   同步到对应的窗口。之前好像被我无意中关掉了,今天重新建立一个项目无意中发现怎么设置了 如果想点击右边的文档 ...

  4. 关于华擎X99+5820K

    受到之前Intel  I7-5775C的困扰,于是直接整套平台换掉. 把Z97+I7-5775C+DDR3换成了X99+5820K+DDR4. 但是依然不理想,又是另外一个坑. 组装好后安装系统的过程 ...

  5. Spark实战4:异常检测算法Scala语言

    异常检测原理是根据训练数据的高斯分布,计算均值和方差,若测试数据样本点带入高斯公式计算的概率低于某个阈值(0.1),判定为异常点. 1 创建数据集转化工具类,把csv数据集转化为RDD数据结构 imp ...

  6. LINQ查询操作符之First、FirstOrDefault、Last、LastOrDefault、ElementAt、ElementAtOrDefault、Contains、Any、All、Coun

    ·First - 返回集合中的第一个元素:不延迟 ·FirstOrDefault - 返回集合中的第一个元素(如果没有则返回默认值):不延迟 ·Last - 返回集合中的最后一个元素:不延迟 ·Las ...

  7. 一个Json结构对比的Python小工具兼谈编程求解问题

    先上代码. jsondiff.py #!/usr/bin/python #_*_encoding:utf-8_*_ import argparse import json import sys rel ...

  8. python urllib2 支持 自定义cookie

    先是在GOOGLE 上找了下, 发现就是只有2种方法,试了下,果然不行. 1, MozillaCookieJar 自定义保存到文件中 加载的时候不行,保存没问题. 2,opener.addheader ...

  9. Java虚拟机学习(2):垃圾收集算法

    跟踪收集器 跟踪收集器采用的为集中式的管理方式,全局记录对象之间的引用状态,执行时从一些列GC  Roots的对象做为起点,从这些节点向下开始进行搜索所有的引用链,当一个对象到GC  Roots 没有 ...

  10. SerialChat与Arduino的配合使用

    最近在开发过程中,用到了Arduino开发板以及其IDE:Arduino,这个IDE使用起来很方便,编码也很简单,但有一点美中不足的是Arduino只能输出数值,不能绘图,所以就用到了另外一款串口调试 ...