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


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 相关文章推荐
JavaScript 一道字符串分解的题目
Aug 03 Javascript
JSON 数字排序多字段排序介绍
Sep 18 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
Jun 05 Javascript
JS实现三个层重叠点击互相切换的方法
Oct 06 Javascript
jQuery实现的调整表格行tr上下顺序
Jan 10 Javascript
jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签
Mar 29 Javascript
javascript创建对象的几种模式介绍
May 06 Javascript
jquery删除table当前行的实例代码
Oct 07 Javascript
基于JavaScript实现瀑布流效果
Mar 29 Javascript
使用jquery DataTable和ajax向页面显示数据列表的方法
Aug 09 jQuery
JS实现可控制的进度条
Mar 25 Javascript
8个非常实用的Vue自定义指令
Dec 15 Vue.js
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伪静态页面函数附使用方法
2008/06/20 PHP
php实现中文字符截取防乱码方法汇总
2015/04/29 PHP
PHP中SESSION过期设置
2021/03/09 PHP
JQuery 常用操作代码
2010/03/14 Javascript
Ext.get() 和 Ext.query()组合使用实现最灵活的取元素方式
2011/09/26 Javascript
ejs v9 javascript模板系统
2012/03/21 Javascript
jquery 插件学习(六)
2012/08/06 Javascript
Javascript合并表格中具有相同内容单元格示例
2013/08/11 Javascript
jQuery使用getJSON方法获取json数据完整示例
2016/09/13 Javascript
通过bootstrap全面学习less
2016/11/09 Javascript
JS实现直接运行html代码的方法
2017/03/13 Javascript
详解基于webpack和vue.js搭建开发环境
2017/04/05 Javascript
vue组件间的参数传递实例详解
2019/04/26 Javascript
element-ui组件中input等的change事件中传递自定义参数
2019/05/22 Javascript
小程序的上传文件接口的注意要点解析
2019/09/17 Javascript
ES10的13个新特性示例(小结)
2019/09/23 Javascript
React+EggJs实现断点续传的示例代码
2020/07/07 Javascript
vue data变量相互赋值后被实时同步的解决步骤
2020/08/05 Javascript
通过实例解析jQ Ajax操作相关原理
2020/09/23 Javascript
uniapp实现横向滚动选择日期
2020/10/21 Javascript
解决vue scoped html样式无效的问题
2020/10/24 Javascript
python通过ElementTree操作XML获取结点读取属性美化XML
2013/12/02 Python
videocapture库制作python视频高速传输程序
2013/12/23 Python
Python存取XML的常见方法实例分析
2017/03/21 Python
Flask框架模板继承实现方法分析
2019/07/31 Python
Python如何合并多个字典或映射
2020/07/24 Python
python实现自动打卡的示例代码
2020/10/10 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
2020/12/11 Python
HTML5有哪些新特征
2015/12/01 HTML / CSS
网站域名和主机:Domain.com
2019/04/01 全球购物
班组长竞聘书
2014/03/31 职场文书
公司承诺函范文
2015/01/21 职场文书
2015年采购工作总结
2015/04/10 职场文书
生日宴会祝酒词
2015/08/10 职场文书
告诉你一个秘密:富人致富的五大优点
2019/07/11 职场文书
Alexa停服!网站排名将何去何从?目前还没有替代品。
2022/04/15 杂记