分享一个插件实现水珠自动下落效果


Posted in Javascript onJune 01, 2016

分享一个水珠自动下落的插件,下载地址:https://github.com/foreverjiangting/rainyday.js

下面来看看如何使用它?添加下面代码即可运行它。

实现效果如下:

分享一个插件实现水珠自动下落效果

代码如下:

<!DOCTYPE HTML>
<html>
<head>
<style>
</style>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script type="text/javascript">
function runImage()
{
var image=document.getElementById("img");
image.src="4.jpg";
image.onload=function()
{
//设定一个rain对象
var engine=new RainyDay({image:this,}); //调用rain函数
engine.rain([[4,6,8000]]);//设定雨滴大小4,6 数量为8000 ||也可为 engine.rain([[6,8000]]),此时水珠的大小较小
engine.rain([[3,3,0.88],[5,5,0.9],[6,2,1]],100);//设定雨滴重复时间
}
// image.crossOrigin="jt"; 加载跨域图片 
}
</script>
</head>
<body onload="runImage();" >
<div class="rain">
<img src="4.jpg" id="img" alt="点击图片">
</div>
<script type="text/javascript" src="rainy.js"></script> 
</body>
</html>

下面来研究下rainy.js部分代码,源代码见上面的github里面的:

RainyDay.prototype.rain = function(presets, speed) {
// 准备canvas 进行下落映射
if (this.reflection !== this.REFLECTION_NONE) {
this.prepareReflections();
}
this.animateDrops();
// 动画
this.presets = presets;
this.PRIVATE_GRAVITY_FORCE_FACTOR_Y = (this.options.fps * 0.001) / 25;
this.PRIVATE_GRAVITY_FORCE_FACTOR_X = ((Math.PI / 2) - this.options.gravityAngle) * (this.options.fps * 0.001) / 50;
// 准备下落的模型
if (this.options.enableCollisions) {
// 计算最大的下落水珠圆角
var maxDropRadius = 0;
for (var i = 0; i < presets.length; i++) {
if (presets[i][0] + presets[i][1] > maxDropRadius) {
maxDropRadius = Math.floor(presets[i][0] + presets[i][1]);
}
}
if (maxDropRadius > 0) {
// 初始化下落的模型
var mwi = Math.ceil(this.canvas.width / maxDropRadius);
var mhi = Math.ceil(this.canvas.height / maxDropRadius);
this.matrix = new CollisionMatrix(mwi, mhi, maxDropRadius);
} else {
this.options.enableCollisions = false;
}
}
for (var i = 0; i < presets.length; i++) {
if (!presets[i][3]) {
presets[i][3] = -1;
}
}
var lastExecutionTime = 0;
this.addDropCallback = function() {
var timestamp = new Date().getTime();
if (timestamp - lastExecutionTime < speed) {
return;
}
lastExecutionTime = timestamp;
var context = this.canvas.getContext('2d');
context.clearRect(0, 0, this.canvas.width, this.canvas.height);
context.drawImage(this.background, 0, 0, this.canvas.width, this.canvas.height);
// 选择匹配的模型
var preset;
for (var i = 0; i < presets.length; i++) {
if (presets[i][2] > 1 || presets[i][3] === -1) {
if (presets[i][3] !== 0) {
presets[i][3]--;
for (var y = 0; y < presets[i][2]; ++y) {
this.putDrop(new Drop(this, Math.random() * this.canvas.width, Math.random() * this.canvas.height, presets[i][0], presets[i][1]));
}
}
} else if (Math.random() < presets[i][2]) {
preset = presets[i];
break;
}
}
if (preset) {
this.putDrop(new Drop(this, Math.random() * this.canvas.width, Math.random() * this.canvas.height, preset[0], preset[1]));
}
context.save();
context.globalAlpha = this.opacity;
context.drawImage(this.glass, 0, 0, this.canvas.width, this.canvas.height);
context.restore();
}
.bind(this);
};

这里我想提到关于跨域资源的问题,image.crossOrigin="jt"; 加载跨域图片。刚开始我用的是跨域的图片,但出现问题了,然后我就使用本地的图片加载,即 src="4.jpg" ,就没问题了。其实如果你要使用跨域的图片,只要加上image.crossOrigin="jt"; 这句代码就可以了。

(前提是服务器开了允许的权限)

这里涉及到CORS的问题,我们来看下: CORS全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器

发出xmlhttprequest请求从而克服了AJAX只能同源使用的限制。

我们还用上面的列子来看问题:

<!DOCTYPE HTML>
<html>
<head>
<style>
</style>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script type="text/javascript">
function runImage()
{
var image=document.getElementById("img");
image.onload=function()
{
//设定一个rain对象
var engine=new RainyDay({image:this,});
engine.rain([[4,6,8000]]);//设定雨滴大小4,6 数量为8000
engine.rain([[3,3,0.88],[5,5,0.9],[6,2,1]],100);//设定雨滴重复时间
}
// image.crossOrigin="jt"; //跨域图片
image.src="http://img0.imgtn.bdimg.com/it/u=938096994,3074232342&fm=21&gp=0.jpg"; 
}
</script>
</head>
<body onload="runImage();" >
<div class="rain">
<img src="http://img0.imgtn.bdimg.com/it/u=938096994,3074232342&fm=21&gp=0.jpg" id="img" alt="点击图片">
</div>
<script type="text/javascript" src="rainy.js"></script>
</body>
</html>

我们来看下调试控制台里面的信息:

Accept 
image/png,image/*;q=0.8,*/*;q=0.5
Accept-Encoding 
gzip, deflate
Accept-Language 
zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Connection 
keep-alive
Host 
img0.imgtn.bdimg.com
Origin null ---上面的头信息中,Origin字段用来说明,本次请求来自哪个源(协议 + 域名 + 端口)。服务器根据这个值决定是否同意这次请求.不在许可范围内。服务器会返回一个正常的HTTP回应。浏览器发现,这个回应的头信息没有包含Access-Control-Allow-Origin字段(详见下文),就知道出错了,从而抛出一个错误,被XMLHttpRequest的onerror回调函数捕获。注意,这种错误无法通过状态码识别,因为HTTP回应的状态码有可能是200。 GET /cors HTTP/1.1
Origin: http://api.bob.com
Host: api.alice.com
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0. User-Agent 
Mozilla/5.0 (Windows NT 6.1; rv:46.0) Gecko/20100101 Firefox/46.0

如果Origin指定的域名在许可范围内,服务器返回的响应,会多出几个头信息字段。

以上内容是小编给大家分享的一个插件实现水珠自动下落效果 ,希望大家喜欢!

Javascript 相关文章推荐
摘自百度的图片轮换效果代码
Nov 19 Javascript
使用新的消息弹出框blackbirdjs
Oct 16 Javascript
javascript json2 使用方法
Mar 16 Javascript
window.open()详解及浏览器兼容性问题示例探讨
May 29 Javascript
JQuery中Text方法用法实例分析
May 18 Javascript
详解VueJS 数据驱动和依赖追踪分析
Jul 26 Javascript
js 开发之autocomplete=&quot;off&quot;在chrom中失效的解决办法
Sep 28 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
Dec 07 Javascript
JS实现留言板功能[楼层效果展示]
Dec 27 Javascript
微信小程序实现元素渐入渐出动画效果封装方法
May 18 Javascript
js Array.slice的8种不同用法示例
Jul 10 Javascript
Javascript异步流程控制之串行执行详解
Sep 27 Javascript
js匿名函数作为函数参数详解
Jun 01 #Javascript
仅9张思维导图帮你轻松学习Javascript 就这么简单
Jun 01 #Javascript
JavaScript中匿名函数的用法及优缺点详解
Jun 01 #Javascript
Bootstrap 折叠(Collapse)插件用法实例详解
Jun 01 #Javascript
Bootstrap 附加导航(Affix)插件实例详解
Jun 01 #Javascript
JS未跨域操作iframe里的DOM
Jun 01 #Javascript
jQuery实现的简单分页示例
Jun 01 #Javascript
You might like
PHP常用函数和常见疑难问题解答
2014/03/05 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
2017/08/18 PHP
PHP设计模式之观察者模式定义与用法示例
2018/08/04 PHP
js 强制弹出窗口代码研究-又一款代码
2010/03/20 Javascript
jQuery timers计时器简单应用说明
2010/10/28 Javascript
jquery的flexigrid无法显示数据提示获取到数据
2013/07/19 Javascript
js 动态修改css文件的方法
2014/08/05 Javascript
js中的事件捕捉模型与冒泡模型实例分析
2015/01/10 Javascript
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
2015/08/04 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
JS简单实现无缝滚动效果实例
2016/08/24 Javascript
老生常谈Javascript中的原型和this指针
2016/10/09 Javascript
浅谈js中的变量名和函数名重名
2017/02/13 Javascript
jQuery+ajax实现局部刷新的两种方法
2017/06/08 jQuery
JavaScript事件对象深入详解
2018/12/30 Javascript
灵活使用console让js调试更简单的方法步骤
2019/04/23 Javascript
在vue中使用防抖和节流,防止重复点击或重复上拉加载实例
2019/11/13 Javascript
浅谈Vue.use到底是什么鬼
2020/01/21 Javascript
JavaScript中展开运算符及应用的实例代码
2021/01/14 Javascript
[01:34]完美“圣”典宣传片震撼发布,12.17与你不见不散
2016/12/16 DOTA
Python标准库与第三方库详解
2014/07/22 Python
用Python解决x的n次方问题
2019/02/08 Python
浅谈Python访问MySQL的正确姿势
2020/01/07 Python
tensorflow生成多个tfrecord文件实例
2020/02/17 Python
Django多数据库配置及逆向生成model教程
2020/03/28 Python
关于h5中的fetch方法解读(小结)
2017/11/15 HTML / CSS
日本食品网上商店:JaponShop.com
2017/11/28 全球购物
美国摩托车头盔、零件、齿轮及配件商店:Cycle Gear
2019/06/12 全球购物
大学生党员自我批评
2014/02/14 职场文书
免职证明样本
2014/10/23 职场文书
品德与社会教学反思
2016/02/24 职场文书
Pytorch中TensorBoard及torchsummary的使用详解
2021/05/12 Python
Flask搭建一个API服务器的步骤
2021/05/28 Python
解决mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)
2021/06/26 MySQL
MySQL系列之开篇 MySQL关系型数据库基础概念
2021/07/02 MySQL
PostgreSQL解析URL的方法
2021/08/02 PostgreSQL