requestAnimationFrame(callback)

一个用于制作逐帧动画的函数

//这个函数会在控制台无限输出"----"
(function animate() {
requestAnimationFrame(animate);
console.log("----");
})();
ctx.arc(100,100,40,0,Math.PI*2,false);
ctx.stroke();
(function animate() {
requestAnimationFrame(animate);
//在同一个坐标无限循环画一个圆
//重新定义开始坐标,试着注释掉这一行看看效果有何不同
ctx.beginPath();
ctx.arc(100,100,40,0,Math.PI*2,false);
ctx.stroke();
})();

很多圆叠加在一起,尝试修改位置:

//初始化坐标
let x = 100;
let y = 100;
(function animate() {
requestAnimationFrame(animate);
//重新定义开始坐标,试着注释掉这一行看看效果有何不同
ctx.beginPath();
ctx.arc(x,y,40,0,Math.PI*2,false);
ctx.stroke();
//动态修改坐标
x += 1;
y += 1;
})();

前面的圆没有清除,所以需要每次都清除画布,使用橡皮擦函数 clearRect(x坐标,y坐标,宽度,高度):

let x = 100;
let y = 100;
(function animate() {
requestAnimationFrame(animate);
//这是我们加入的橡皮擦函数
ctx.clearRect(0,0,innerWidth,innerHeight);
ctx.beginPath();
ctx.arc(x,y,40,0,Math.PI*2,false);
ctx.stroke();
x += 1;
y += 1;
})();

圆在动,但是超出范围就看不到了,制作弹性效果

//我把参数都设为变量
let x = Math.random()*innerWidth;// 横坐标
let y = Math.random()*innerHeight;// 纵坐标
let r = Math.random()*40; // 半径
let dx = Math.random()*6; // 横向平移距离
let dy = Math.random()*6; // 纵向平移距离
(function animate() {
requestAnimationFrame(animate);
ctx.clearRect(0,0,innerWidth,innerHeight);
ctx.beginPath();
ctx.arc(x,y,r,0,Math.PI*2,false);
ctx.stroke();
//当触及边界时进行反弹
// 当触及边界时
if(x+r>innerWidth || x-r<0) {
dx=-dx;
}
if(y+r>innerHeight || y-r<0) {
dy=-dy;
} x += dx;
y += dy;
})();

实现多个圆:

//圆的数组
let circleArray = [];
//循环制造不同的圆,存进数组
for(let i=0;i<100;i++){
let x = Math.random()*innerWidth;// 横坐标
let y = Math.random()*innerHeight;// 纵坐标
let r = Math.random()*40; // 半径
let dx = Math.random()*6; // 横向平移距离
let dy = Math.random()*6; // 纵向平移距离
circleArray.push(new Circle(x,y,r,dx,dy));
} // 创建一个Circle对象
function Circle(x,y,r,dx,dy) {
this.x = x;
this.y = y;
this.r = r;
this.dx = dx;
this.dy = dy; // 绘制圆
this.draw = function() {
ctx.beginPath();
ctx.arc(x,y,r,0,Math.PI*2,false);
ctx.stroke();
}
// 更新圆的位置
this.update = function() {
x+=dx;
y+=dy;
// 当触及边界时
if(x+r>innerWidth || x-r<0) {
dx=-dx;
}
if(y+r>innerHeight || y-r<0) {
dy=-dy;
}
// 每一次更新都要重新在一个新的地方绘制圆
this.draw();
}
} // 这个函数会在控制台无限输出"canvas"
function animate() {
requestAnimationFrame(animate);
// 橡皮擦函数 clearRect(x坐标,y坐标,宽度,高度)
ctx.clearRect(0,0,innerWidth,innerHeight);
// 循环刷新每个圆
for(let i=0;i<circleArray.length;i++){
circleArray[i].update();
}
}
animate();

canvas动画部分的更多相关文章

  1. 2015.4.23 贪吃蛇、canvas动画,各种上传工具,url信息匹配以及最全前端面试题等

    1.面向对象贪吃蛇   2.css中:hover 改变图片 页面加载完 第一次鼠标移入会闪一下 这是为啥? 解决方法:你把两张图合成一张图或者是先把图片加载到页面上,然后再hover出来. 解析:图片 ...

  2. HTML动画分类 HTML5动画 SVG库 SVG工具 Canvas动画工具

     1.js配合传统css属性控制,可以使用setTimeout或者高级的requestAnimationFrame 2.css3 3.svg 4.canvas(当然,这个还是要配合js)   也许这么 ...

  3. 7 个顶级的 HTML5 Canvas 动画赏析

    HTML5确实是一项改革浏览器乃至整个软件行业的新技术,它可以帮助我们Web开发者很方便地在网页上实现动画特效,而无需臃肿的Flash作为支撑.本文分享7个顶级的HTML5 Canvas 动画,都有非 ...

  4. 8个经典炫酷的HTML5 Canvas动画欣赏

    HTML5非常强大,尤其是Canvas技术的应用,让HTML5几乎可以完成所有Flash能完成的效果.本文精选了8个经典炫酷的HTML5 Canvas动画欣赏,每一个都提供全部的源代码,希望对你有所帮 ...

  5. 7个惊艳的HTML5 Canvas动画效果及源码

    HTML5非常强大,尤其是现在大部分浏览器都支持HTML5和CSS3,用HTML5制作的动画也多了起来.另外,Canvas上绘制图形非常简单,本文就分享了一些强大的HTML5 Cnavas动画,一起来 ...

  6. 《FLASH CC 2015 CANVAS 中文教程》——1、导出canvas动画,文件结构浅析

    注::如果你对 FLASH 这个软件操作不够熟悉,建议你可以先看看FLASH动画之类的书. :FLASH CC 在文中直接简称为CC. :以下所以文章中所说的快捷键 如果你按了不起作用,请检查是否有其 ...

  7. Html5 Canvas动画旋转的小方块;

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  8. 【原创】测试不同浏览器播放canvas动画的平滑程度

    Canvas无疑是HTML5开放式网络平台最激动人心的技术之一.目前,除了IE8以外,各类浏览器的新版本都支持HTML5 Canvas. 程序员需要通过Javascript调用Canvas API.基 ...

  9. HTML5 Canvas动画效果演示

    HTML5 Canvas动画效果演示 主要思想: 首先要准备一张有连续帧的图片,然后利用HTML5 Canvas的draw方法在不同的时间 间隔绘制不同的帧,这样看起来就像动画在播放. 关键技术点: ...

  10. HTML5 Canvas动画效果演示 - 流浪的鱼 - 博客频道 - CSDN.NET

    HTML5 Canvas动画效果演示 - 流浪的鱼 - 博客频道 - CSDN.NET HTML5 Canvas动画效果演示

随机推荐

  1. 剑指offer四十三之左旋转字符串

    一.题目 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”abc ...

  2. 使用json-lib-*.jar的JSON解析工具类

    使用json-lib-2.4-jdk15.jar JSON工具类: import java.util.List; import net.sf.json.JSONArray; import net.sf ...

  3. IntelliJ IDEA使用心得之快捷键篇

    关于IDEA快捷键的文章有很多,因此,我只对经常使用快捷键进行介绍. 因为我的第一款IDE是eclipse,因此我是根据eclipse的快捷键习惯来重置IDEA的快捷键. 点击进入IDE设置界面:

  4. libnetwork插件化网络功能

    Docker把网络跟存储这两部分的功能实现都以插件化形式剥离出来,允许用户通过指令来选择不同的后端实现.这也是Docker希望构建围绕着容器的强大生态系统的一些积极的尝试.剥离出来的独立容器网络项目叫 ...

  5. 下载Windows版本的Redis

    1.打开官网http://redis.io/点击Download 2.往下拉,找到Windows, 由图片中的文字可以看出Redis项目不正式支持Windows. 但是,Microsoft开放技术小组 ...

  6. 数据序列化导读(1)[JSON]

    所谓数据序列化(Data Serialization), 就是将某个对象的状态信息转换为可以存储或传输的形式的过程. 那么,为什么要进行序列化? 首先,为了方便数据存储: 其次,为了方便数据传递. 在 ...

  7. spring boot集成阿里云短信发送接收短信回复功能

    1.集成阿里云通信发送短信: 在pom.xml文件里添加依赖 <!--阿里短信服务--> <dependency> <groupId>com.aliyun</ ...

  8. JavaScript引用类型和值类型

    thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>t ...

  9. [转]ASP.NET cache缓存的用法

    本文转自:https://blog.csdn.net/mss359681091/article/details/51076712 本文导读:在.NET运用中经常用到缓存(Cache)对象.有HttpC ...

  10. HTML5中Access-Control-Allow-Origin解决跨域问题

    www.111cn.net 更新:2015-01-07 编辑:flyfox 来源:转载 跨域在开发中一些是一个比较常见的问题虽然有json或者xml来解决,现在html5开始流行了,我们可以通过Acc ...