玉渊潭赏樱花有感:从无到有写一个jQuery开源插件
“玉渊潭公园樱花节”是每年樱花绽放时,都会在玉渊潭公园樱举办樱花节,游客前往玉渊潭公园,可以欣赏到20个品种2000株樱花。2016玉渊潭樱花节时间:3月中旬-4月中旬观赏最佳,2016年3月23日开幕(具体开幕时间不详- -)6:00─20:30(21:30静园)。樱花的花期极短,从开花到凋谢只不过七日之期,而整棵樱树从开花到全谢也只有两个礼拜左右。
在北京好几年了,一直没有去看过樱花,主要是对那玩样不感冒。这次在好友的再三邀请下,终于来到了玉渊潭公园赏樱花,故事就这样开始了...
v1.0故事发展
女:来给我拍照给我拍照
男:已经拍了很多了
女:来,给我看看拍的怎么样
女:这张不错,樱花飘落的这种感觉好好哦,可惜樱花在照片上不动,不然会更美。
男:你用美图秀秀不就行了嘛。
女:美图秀秀?咦,对了,你不是做网站开发的吗,你帮我把这图片用网站做成花一直在那飘的效果呗?
... 男陷入了沉默,似乎明白了刚才不该提那个建议
对,故事中的男就是我,我就是我 是颜色不一样的烟火。哈哈~~~
作为一名"资深"工程师(ps:其实就一屌丝),生活中像这种狗血剧情还有很多,好像在外人看来,因为你是程序员,so,跟电脑相关的你就得全会。
因为是程序员,发生类似的狗血剧情(皆为亲身经历)
- 修电脑 or 装系统(相信这个应该每个程序员都经历过,不然就只能说明你的圈子里有硬件高手,不用你来做这些事情)
- 代买火车票/飞机票/订酒店(你在网上帮我订下票吧,你们对这个比较熟)
- 弄QQ空间(表哥,你是做网站开发的吗?那你帮我弄一下QQ空间咯。)
- ...
以上剧情如果有中枪的,请自觉右下举爪点赞,或者分享更多狗血剧情的,请跳到最下面评论!
v2.0正文开始
好了,赶紧开始正文吧,不然分割线都不够用了,再割就割没了。
这里是技术博客,咱只聊技术。既然答应了别人,就得开干。
v3.0技术剖析
position
,那么多花瓣就需要用到js克隆clone()
,花瓣是动态的就需要用到定时器setInterval
。v4.0代码开始
html部分
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>樱花节</title>
<style>
html, body {
font-family: Helvetica, Arial, sans-serif;
font-size: 12px;
line-height: 16px;
padding: 0;
margin: 0;
color: pink;
}
</style>
<script src="http://toutouge.github.io/Demo/carousel/jquery-1.10.2.js"></script>
<script src="jquery.nagareboshi.js"></script>
<script>
$(function () {
$.fn.nagareboshi({ minSize: 5, maxSize: 50, newOn: 1000, flakeColor: '#0099FF', flakeChar: '✿' });
})
</script>
</head>
<body style="background-color:black;"> </body>
</html>
html部分比较简单,没什么特别需要说明的地方。非要说两句的话,那就... 且行且珍惜吧~
JS部分
/**
* jquery.nagareboshi
*
*
* @version 1 (3/31/2016)
* @author 头头哥
* @requires jQuery
*
* @params flakeChar - 漂浮图标样式, 默认是雪花, 其它漂亮符号参考: ❥ღ❣♔♕♖♚♛♜☀☁☂☃☼☽☾♨❄❅❆★☆✦✪✫✿
* @params minSize - 默认size最小是10
* @params maxSize - 默认size最大是20
* @params newOn - 出现新图标的频率,默认是500
* @params flakeColors - 默认的图标颜色 , 默认是#FFFFFF
* @params durationMillis - 停止加载图标的时间,默认是一直加载
* @example $.fn.nagareboshi({ maxSize: 200, newOn: 1000 });
*/
; (function ($, window, document, undefined) { $.fn.nagareboshi = function (options) { var $flake = $('<div class="flake" />').css({ 'position': 'absolute', 'top': '-50px' }),
documentHeight = $(document).height(),
documentWidth = $(document).width(),
defaults = {
flakeChar: "❄",
minSize: 10,
maxSize: 20,
newOn: 500,
flakeColor: ["#ffffff"],
durationMillis: null
}, // 当给extend方法传递一个以上的参数时,它会将所有参数对象合并到第一个里。同时,如果对象中有同名属性时,合并的时候后面的会覆盖前面的。
// 所以如果传递进来的options参数有的值,将会覆盖defaults对象里对应的值
options = $.extend({}, defaults, options); $flake.html(options.flakeChar); var interval = setInterval(function () {
var startPositionLeft = Math.random() * documentWidth - 100,
startOpacity = 0.5 + Math.random(),
sizeFlake = options.minSize + Math.random() * options.maxSize,
endPositionTop = documentHeight - defaults.maxSize - 40,
endPositionLeft = startPositionLeft - 100 + Math.random() * 200,
durationFall = documentHeight * 10 + Math.random() * 5000;
$flake
.clone()
.appendTo('body')
.css(
{
left: startPositionLeft,
opacity: startOpacity,
'font-size': sizeFlake,
color: options.flakeColor[Math.floor((Math.random() * options.flakeColor.length))]
}
)
.animate(
{
top: endPositionTop,
left: endPositionLeft,
opacity: 0.2
},
durationFall,
'linear',
function () {
$(this).remove()
}
);
}, options.newOn);
console.log(options.durationMillis);
if (options.durationMillis) {
setTimeout(function () {
clearInterval(interval);
}, options.durationMillis);
}
}; })(jQuery, window, document);
JS部分讲解:
1.为什么代码开始; (function ($, window, document, undefined) {
是以一个分号开始? 其实这个分号是用来充当自调用匿名函数的第一对括号与其他代码定义的函数(一个项目中可能会引入很多插件)相连,避免其他人的代码中没有分号结尾而导致报错。
比如:
像上面这段代码就是典型的自调用匿名函数和其他插件代码没有分号分隔的,大家有兴趣可以试一试这段代码运行起来会不会报错?
ps: 这部分内容也是在刘哇勇的博客中学习到的。
2.关于$.extend();
在代码注释部分已经详细说明了,在自己写扩展插件的时候,extend()出场率还是很高的。
3.利用sizeFlake = options.minSize + Math.random() * options.maxSize
随机设置每个克隆出来的花瓣的大小
4.也没什么过多的讲解的了,关于参数如何使用代码中注释部分也说的很清楚了。
效果演示
为了保护个人隐私,演示效果图里已经将背景图片换成了黑色背景色,想用图片的可以自己在这改。
<body style="background-color:black;">
v博客总结
故事的由来和代码部分(其中代码实现有一些曾经在github看到一个开源插件上学习的,具体是哪个插件也记不得了)都介绍的差不多了,希望能借助这篇博客让大家对jquery插件有一个新的认识。
这里需要特别说明一下。其实写这篇博客真正的动机呢就是告诉大家玉渊潭樱花节已经开始了,再不去看就没的看了。
Are you ready? Let's go.
作 者:请叫我头头哥
出 处:http://www.cnblogs.com/toutou/
关于作者:专注于基础平台的项目开发。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!
玉渊潭赏樱花有感:从无到有写一个jQuery开源插件的更多相关文章
- 如何写一个Js上传图片插件。
项目里面需要一个上传图片的插件,找了半天没有找到满意的,算了 不找了,自己写一个吧,顺便复习一下js方面的知识.完成之后效果还不错,当然还要继续优化,源码在最后. 介绍一种常见的js插件的写法 ; ( ...
- 如何写一个jquery插件
本文总结整理一下如何写一个jquery插件?虽然现今各种mvvm框架异常火爆,但是jquery这个陪伴我们成长,给我们带来很多帮助的优秀的库不应该被我们抛弃,写此文章,作为对以往欠下的笔记的补充, ...
- 给Ionic写一个cordova(PhoneGap)插件
给Ionic写一个cordova(PhoneGap)插件 之前由javaWeb转html5开发,由于面临新技术,遂在适应的过程中极为挣扎,不过还好~,这个过程也极为短暂:现如今面临一些较为复杂的需求还 ...
- 用javascript写一个emoji表情插件
概述 以我们写的这个emoji插件为例,网上已经有一些相关的插件了,但你总感觉有些部分的需求不能被满足(如:可以自行添加新的表情包而不用去改源代码等等) 详细 代码下载:http://www.demo ...
- Skywalking-02:如何写一个Skywalking trace插件
如何写一个Skywalking trace插件 javaagent 原理 美团技术团队-Java 动态调试技术原理及实践 类图 实现 ConsumeMessageConcurrentlyInstrum ...
- 自己写一个 jQuery 插件
我知道这一天终将会到来,现在,它来了. 需求 开发 SharePoint 的 CSOM 应用时,经常需要在网页上输出一些信息. 这种需求和 alert 的弹窗.F12 的断点查看信息的场景是不一样的: ...
- 如何使用jQuery写一个jQuery插件
jQuery插件其实是前端框架的思维,构成一个框架,个人认为必须满足以下几个基础条件:1. 可重用,2. 兼容性,3. 维护方便,虽说现在有很多比较成熟的前端框架,但是也有部分存在配置麻烦,学习成本大 ...
- 自己diy一个jquery分页插件
js基础学习过程中,期间经历换工作的各种面试,很多面试官问过:有没有写过jquery插件?等类似问题. 就个人而言,关于jquery插件的文章确实看过不少,但是一直没有动手写一个,一是不想在目前学习j ...
- 写一个Vue loading 插件
什么是vue插件? 从功能上说,插件是为Vue添加全局功能的一种机制,比如给Vue添加一个全局组件,全局指令等: 从代码结构上说,插件就是一个必须拥有install方法的对象,这个方法的接收的第一个参 ...
随机推荐
- student表中创建触发器,实现student表和student _course表的级联删除
create trigger Delete_sc on student for delete as delete student_course where student_course.s_no in ...
- 【转】数据库无关的GO语言ORM - hood
项目地址:https://github.com/eaigner/hood 这是一个极具美感的ORM库. 特性 链式的api 事务支持 迁移和名字空间生成 模型变量 模型时间 数据库方言接口 没有含糊的 ...
- java servlet手机app访问接口(三)高德地图云存储及检索
这篇关于高德地图的随笔内容会多一点, 一.业务说明 对应APP业务中的成员有两类,一是服务人员,二是被服务人员, 主要实现功能, 对APP中的服务人员位置进行时时定位, 然后通过被服务人员登 ...
- 【Linux_Fedora_系统管理系列】_1_用户登录和系统初始配置
发现一个问题,在FC14 的Firefox浏览器中,编辑和排版好的博文,在windows下用chrome或者猎豹浏览器打开后,排版就变得阅读 不是很容易里,而且经常不经意的断行.不知道园子的管理人员时 ...
- 操作系统笔记系列 一 Linux
学习资料: 1.http://www.icoolxue.com/ 马士兵 1.Linux 服务器端,目前98%的服务器都是Linux. 2.
- tmpfs:一种基于内存的文件系统
tmpfs是一种基于内存的文件系统, tmpfs有时候使用rm(物理内存),有时候使用swap(磁盘一块区域).根据实际情况进行分配. rm:物理内存.real memery的简称? 真实内存就是电脑 ...
- Linux CentOS 6.6安装JDK1.7
Linux CentOS 6.6安装JDK1.7 目录 1.下载JDK 2.卸载JDK 3.安装JDK 3.1..rpm后缀格式JDK安装方式 3.2..tar.gz后缀格式JDK安装方式 4.验证安 ...
- ASP.NET MVC下使用文件上传
这里我通过使用uploadify组件来实现异步无刷新多文件上传功能. 1.首先下载组件包uploadify,我这里使用的版本是3.1 2.下载后解压,将组件包拷贝到MVC项目中 3. 根目录下添加新 ...
- java集合-HashMap
HashMap基于哈希表的 Map 接口的实现,以 key-value 的形式存在.在 HashMap 中,key-value 总是会当做一个整体来处理,系统会根据 hash 算法来来计算 key-v ...
- Twproject Gantt – 开源的 JavaScript 甘特图组件
Twproject Gantt 是一款基于 jQuery 开发的甘特图组件,也可以创建其它图表,例如任务树(Task Trees).内置编辑.缩放和 CSS 皮肤等功能.更重要的是,它是免费开源的. ...