分享一个插件-水珠自动下落效果
分享一个水珠自动下落的插件,下载地址: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 οnlοad="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 数量为8000engine.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 οnlοad="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
指定的域名在许可范围内,服务器返回的响应,会多出几个头信息字段。
作者:向婷风
出处:http://www.cnblogs.com/jtjds/p/5528497.html
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者
本人同意 转载文章之后必须在 文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
转载于:https://www.cnblogs.com/jtjds/p/5528497.html
分享一个插件-水珠自动下落效果相关推荐
- 做出的一个图片的自动展示效果(JS版本)
在国外的网站看到一个很不错的图片自动展示效果,于是就自己做了起来,在查看代码时发现是一个JavaScript爱好者自己写了一个库文件来调用,确实看的不太懂,但效果是做出来了,页面的调用代码只需引用固定 ...
- 分享一个一对一直播自动聊天脚本保护生态高山流水核心JS源码
分享一个最近很火的项目,一对一直播自动打招呼脚本,保护生态r9和高山流水小精灵的JS核心代码 该源码是Auto.js编写,可以二次重构.可以直接打包运行 function 首页ui() {import ...
- 分享一个grid布局自动生成器
比如你有一个这样的布局需求 那你可以进入这个网站: CSS Grid Generator 操作完成后点击"请给我示例中的代码"
- 确定不进来看看?分享一个插件,让敲代码不再枯燥,activate-power-mode
已经支持很多IDE了:https://github.com/codeinthedark/awesome-power-mode 因为我用的是IDEA,所以主要来介绍一下IDEA的安装流程: 打开这个网址 ...
- 分享一个樱花漫天飞舞的html效果
代码如下 <!doctype html> <html> <head><meta charset="utf-8"><title& ...
- android设计一个多线程和画图的程序小球,Android开发之多线程中实现利用自定义控件绘制小球并完成小球自动下落功能实例...
本文实例讲述了Android开发之多线程中实现利用自定义控件绘制小球并完成小球自动下落功能的方法.分享给大家供大家参考,具体如下: 1.布局界面 xmlns:tools="http://sc ...
- 想做自动驾驶技术的入,这回分享一个简单好用的开放平台
前言 自动驾驶已经是现在技术开发领域最热门的方向之一,作为程序员,很多人也都想来这个领域试试水.但是这个领域的门槛也挺高,不过想开始的话,其实可以从一些专门针对自动驾驶的开放平台开始入手,目前比较主流 ...
- 分享一个针对触摸设备优化的图片幻灯jQuery插件 - touchtouch
为什么80%的码农都做不了架构师?>>> 日期:2012-5-6 来源:GBin1.com 在线演示 本地下载 触摸设备越来越流行了,很多互联网用户都使用ipad等平板电脑 ...
- 分享一个HTML5画布实现的超酷文字弹跳球效果
日期:2012/03/05 在线演示 本地下载 今天我们分享一个来自于html5canvastutorials的超酷弹跳球效果,这里我们使用纯HTML5的画布来实现动画及其图形.整个效果使用小球来组 ...
- 实用常识 | 分享一个好用的插件解决浏览器图片下载问题(老白嫖怪了)
正值Yi情肆虐于我燕赵大地,时至年关Bing毒多处零散爆发.老弟今年12岁整,本命年,恰是小升初的关键时刻,学校见状提前开始了寒假生活,对他来说岂不快哉?可是于我而言假期多了一个辅导他功课的任务.这不 ...
最新文章
- 原创 | 从智慧交通、智慧安防、智能电网三大应用场景看我国智慧城市建设现状...
- 快速排序(Python实现)
- 首个获得FDA批准的脑机接口设备:“突破性”脑机接口设备用于造福人类
- P5021-赛道修建【平衡树,贪心,二分答案】
- php m grep event,php-如何杀死与30分钟以上的grep匹配的进程?
- 选中下拉列表显示全部数据_小白都能学会的多级下拉列表,让你的Excel效率提升百倍...
- 终端服务器安全层在协议流中检测到错误,终端服务器安全层在协议流中检测到错误,并已取消客户端连接...
- 解决Windows Server2008 R2中IE开网页时弹出阻止框(Windows Server2008网页无法打开的问题)...
- Seata多微服务互相调用_全局分布式事物使用案例_Storage-Module 仓储微服务说明---微服务升级_SpringCloud Alibaba工作笔记0063
- 高中英语计算机辅助教学例子,计算机辅助教学在英语听力中的运用
- php随机数怎么获取?一个简单的函数就能生成
- curl命令详解_命令行学习(一)基础命令
- 制作简单的GIF动图
- 人脸识别7-人脸图片相似度
- 编译OpenWRT LEDE 固件的一些说明
- SpringBoot项目报错:The field content exceeds its maximum permitted size of 1048576 bytes
- DAO包的作用设计和命名
- 【Kotlin-Room】 cannot pick a constructor since multiple constructors are suitable
- 〈四〉ElasticSearch的认识:基础原理的补充
- WC2020 打铁记