前言:

  最近对js的插件封装特别感兴趣,无耐就目前的技术想做到js的完全封装,还是有一定困难,就基于jQuery封装了一个小的插件,而且是基于对象级开发的,不是添加全局方法。高深的语法几乎没有,就有一个return:foreach()方法来返回对象实例本身,还有一个extend()函数,用来扩展参数对象的属性,这也是为了对象在调完我这个方法后方便链式操作。

  插件打包下载地址点我下载


插件名动态云标签

插件特点

  • 在指定块级元素内动态生成a标签
  • a标签的高度、宽度、位置、层数、背景颜色随机可控
  • a标签渐隐显示和渐隐消失,可改变初始化的透明度
  • a标签创建的速度和移动速度可控(计时器)
  • a标签移动的步长可控制(每次循环移动的距离)
  • 鼠标悬浮停止动画且透明度最大,层数最高,鼠标离开,恢复之前状态

遇到问题:

  目前插件是可以正常运行,但如果切换浏览器标签,不把插件页显示,过一会再切换回来,会有卡顿的现象,这个现在还不知道什么情况,请了解的给予指点,里面也有很多需要优化的地方,有好的点子希望提出来,我好及时给予更正。

动画效果:

汗:gif图片可能有点大,稍等会就动了。耐心哦


JS代码片段:

(function($){
$.fn.activiTag = function(opts) {
opts = $.extend({
move_step:2, // 元素移动步长--px
move_speed:40, // 元素移动速度--ms
init_speed:1000,// 元素创建速度--ms
min_opacity:0, // 元素最低透明度--0-1小数
max_grain: 10, // 最大粒度
// a标签数组
a_List: ["<a href='#'>请添加元素哦</a>","<a href='#'>Spring Jpa详解</a>","<a href='#'>javamail邮箱</a>"], // a标签字符串数组
// 背景颜色数组
color_List: ['#CD2626','#8b4513','#696969','#ff8c00','#6495ED'] // 标签颜色数组
},opts||{}); var aTag = $(this); // 当前容器对象
var T_width = aTag.width(), T_height = aTag.height(); // 容器高度、宽度 return this.each(function(){ function setATagCss() { // 设置容器相应css
aTag.css({position:'relative',overflow:'hidden'});
} function getRandomNum(Min, Max){ // 获取两个区间之内随机数
Min = new Number(Min);Max = new Number(Max);
var Range = Max - Min + 1;
var Rand = Math.random();
return Min + Math.floor(Rand * Range);
} function getRandomXY(num) { // 随机返回一个 正/负参数
num = new Number(num);
if(Math.random()<=0.5)
num = -num;
return num;
} /**
* 随机创建a标签,宽度为容器宽度的三分之一,然后在自身基础上+-五分之一宽度
* 高度自身宽度的三分之一,然后+-三分之一
*/
function createATag() {
var i = getRandomNum(0,opts.a_List.length-1);
var a = $(opts.a_List[i]); // 每个标签元素
aTag.append(a);
return a;
} /** 设置a标签css样式 **/
function setCss(a) {
var w = Math.ceil(T_width/3) + getRandomXY(T_width/60);
var h = Math.ceil(w/3) + getRandomXY(w/36); // 行高
var zIndex = Math.ceil(Math.random()*400); // 层数
var rdmOpcy = getRandomNum(new Number(opts.min_opacity),0);
// 行高、层数、透明度
a.css({
opacity:rdmOpcy,
zIndex: zIndex,
lineHeight:h+'px',
position: 'absolute',
textDecoration:'none',
textAlign:'center',
borderRadius: '3px',
color:'#FFFFFF',
whiteSpace: 'nowrap',
});
return a;
} /** 计算标签相对于容器的初始化位置(X_Y 坐标) **/
function setXY(a) {
var x = getRandomNum(0,(T_width-a.width()));
var y = getRandomNum(0,T_height/10);
a.css({left:x+'px', bottom:y+'px'});
return a;
} /** 设置随机背景颜色 **/
function setColor(a) {
var i = Math.ceil(Math.random()*opts.color_List.length -1);
a.css({backgroundColor:opts.color_List[i]})
} /** 构造函数入口 **/
function construct() {
var a = createATag();
setCss(a); // css
setColor(a); // color
setXY(a); // 坐标位置
return a;
} /** 动画定时器函数 **/
function interVal(a,s_opcy,botm,n,space,s) {
var opcy = a.css('opacity'); // 透明度
var botm_ = a.css('bottom').replace('px',''); // 实时底部距离
var opcy_ = parseFloat(new Number(a.css('opacity'))) + s_opcy; // ++透明度
var _opcy_ = parseFloat(new Number(a.css('opacity'))) - s_opcy; // --透明度
var fall = botm_ - botm; // 已移动的距离
botm_ = new Number(botm_) + new Number(opts.move_step);
a.css({
display: 'block',
bottom: botm_,
}); if(fall < n)
{ a.css({opacity: opcy_}) }
else if(2*n < fall)
{ a.css({opacity: _opcy_}) } if (botm_ >= space)
{
clearInterval(s);
a.remove();
}
} function init() {
if(aTag.children('a').length >= new Number(opts.max_grain))
return;
var a = construct();
var opcy = a.css('opacity'); // 透明度
var zInx = a.css('zIndex'); // 层数
var botm = a.css('bottom').replace('px',''); // 初始到底部距离
var space = T_height - a.height() - a.css('bottom').replace('px',''); // 要移动的距离 var n = space/3; // 变换透明度距离
var step = 1-opcy; // 要变化透明度值
var sec = n/opts.move_step*opts.move_speed/1000; // 距离/单步长 * 单步长秒数 = 需要秒数
var s_opcy = opts.move_speed/1000/sec * step; // 每次循环需要变换的透明度值
var speed_ = getRandomNum(new Number(opts.move_speed)-30,new Number(opts.move_speed)+30);
var currOpcy; // 记录鼠标移入时透明度
// console.log(opts.move_speed+'....'+speed_)
/** 元素移动循环 **/
var s = setInterval(function(){
interVal(a,s_opcy,botm,n,space,s);
}, speed_) a.mouseover(function(){ // 鼠标移入
currOpcy = a.css('opacity');
clearInterval(s);
$(this).css({
zIndex: 401,
opacity: 1
});
}); a.mouseout(function(){ // 鼠标移出
$(this).css({
zIndex: zInx,
opacity: currOpcy
});
s= setInterval(function(){
interVal(a,s_opcy,botm,n,space,s);
},speed_);
});
}
setATagCss();
setInterval(init,opts.init_speed);
});
}
})(jQuery)

HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>云动态标签生成插件</title>
<script src="jquery.min.js"type="text/javascript" charset="utf-8"></script>
<script src="jquery-tag.js"/>"type="text/javascript" charset="utf-8"></script>
<script>
$(function(){
$('#tag').activiTag({});
});
</script>
<style>
#tag{
border:1px dashed gray;
width:250px;
height:250px;
top: 50px;
left: 300px;
}
a{
padding:0px 3px;
font-size:12px;
white-space: nowrap;
display:none;
}
</style>
</head>
<body>
<div id='tag'></div>
</body>
</html>

  打包下载地址:点我下载

  如有好的建议请哆哆指正,多谢多谢。

  ps:欢迎转载,转载请注明出处:http://www.cnblogs.com/liuyitian/p/4086476.html

                          写作不易,难免有疏漏和错误,还请慷慨指正,不错请推荐


                                         每天多学一点点     代码少敲一点点      

jQuery 动态标签生成插件的更多相关文章

  1. 分享一个jQuery动态网格布局插件:Masonry(转)

    在线演示 Masonry是 一款非常强大的jQuery动态网格布局插件,可以帮助开发人员快速开发类似剪贴画的界面效果.和CSS中float的效果不太一样的地方在 于,float先水平排列,然后再垂直排 ...

  2. jQuery动态网格瀑布流插件Masonry

    Masonry是一款非常强大的jQuery动态网格布局插件,可以帮助开发人员快速开发瀑布流界面效果.和CSS中float的效果不太一样的地方在于,float先水平排列,然后再垂直排列,使用Masonr ...

  3. jQuery Masonry-让你的网页更自然的强大的动态不规则布局插件!

    Masonry是 一款非常强大的jQuery动态网格布局插件,可以帮助开发人员快速开发类似剪贴画的界面效果.和CSS中float的效果不太一样的地方在 于,float先水平排列,然后再垂直排列,使用M ...

  4. TaggingJS – 可以灵活定制的 jQuery 标签系统插件

    TaggingJS 是一款 jQuery 插件,用来创建高度可定制的前端标签系统.这款插件不到3KB ,支持主流浏览器.有几种方法来定制 TaggingJS 的默认行为:一是使用  custom_op ...

  5. 使用jQuery开发tab选项卡插件(可以右键关闭多个标签)

    在前一篇“使用jQuery开发tab选项卡插件”的基础上添加了tab标签右键关闭菜单功能,菜单主要包括:关闭当前标签.关闭左侧标签.关闭右侧标签.关闭其他.关闭全部. 一.插件效果 二.实现思路 为w ...

  6. jQuery插件 -- 动态事件绑定插件jquery.livequery.js

    http://blog.csdn.net/zzq58157383/article/details/7721974 动态事件绑定插件livequery, 可以利用它给相应的DOM元素注册事件或者触发回调 ...

  7. jQuery 浮动标签插件,帮助你提升表单用户体验

    浮动标签模式(Float Label Pattern)是最新流行的一种表单输入域的内容提示方式,当用户在输入框输入内容的时候,原先占位符的内容向上移动,显示在输入的内容的上面.这里推荐的这款 jQue ...

  8. Jquery 动态生成表单 并将表单数据 批量通过Ajax插入到数据库

    利用Jquery 动态生成 Table 表单 之后利用each 方法来遍历所有文本框获取文本的value值  并通过Ajax 将数据 提交到Web服务里把数据插入数据库 Html页面 <!DOC ...

  9. 页面滚动图片等元素动态加载插件jquery.scrollLoading.js

    如果一个网页很长,那么该页面的加载时间也会相应的较长.而这里给大家介绍的这个jQuery插件scrollLoading的作用则是,对页面元素进行动态加载,通俗的说就是滚到哪就加载到哪,屏幕以下看不见的 ...

随机推荐

  1. Java中的常见异常

    非检查异常:Error 和 RuntimeException 以及他们的子类.0错误ArithmeticException,错误的强制类型转换错误ClassCastException,数组索引越界Ar ...

  2. Genymotion-ARM-Translation_v1.1安装报“an error occured while deploying the file”

    如上图,在将Genymotion-ARM-Translation_v1.1.zip拖动Genymotion虚拟机中报了图中错误,在百度后找到了解决办法,下面是我的操作步骤 1.下载re管理器之类的ap ...

  3. 热部署在Eclipse和IDE里面的使用

    热部署在Eclipse和IDE里面的使用 简介:讲解热部署的好处及使用注意事项,在eclipse里面默认开启,在IDE里面默认关闭 .增加依赖 <dependency> <group ...

  4. office2013 激活方法

    1.秘钥码激活 可以淘宝上买一个. 2.KMS激活软件激活 帖子地址 http://tieba.baidu.com/p/3855281630 Office 2013 Professional Plus ...

  5. override toString() function for TreeNode to output OJ's Binary Tree Serialization

    class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } @Override publ ...

  6. [细品java]ThreadLocal源码学习

    ThreadLocal是线程局部变量,其中保存了特定于该线程的值.每个线程都拥有一份独立的副本值,即每个线程修改变量值不影响其他线程该变量的副本值.这些特定于线程的值保存在Thread对象中,当线程终 ...

  7. LINQ to SQL和Entity Framework

    LINQ to SQL和Entity Framework都是一种包含LINQ功能的对象关系映射技术. 那么为什么会有LINQ这个东西的出现呢. 简单来说LINQ是为了满足不知道怎么操作数据库的程序员开 ...

  8. 概率主题模型简介 Introduction to Probabilistic Topic Models

    此文为David M. Blei所写的<Introduction to Probabilistic Topic Models>的译文,供大家参考. 摘要:概率主题模型是一系列旨在发现隐藏在 ...

  9. selenium实战之斗鱼弹幕

    python3.6.selenium.chromedriver 先上代码 from selenium import webdriver from time import sleep driver=we ...

  10. 【转】每个 Linux 新手都应该知道的 10 个命令

    你可能认为你是 Linux 新手,但实际上并不是.全球互联网用户有 3.74 亿,他们都以某种方式使用 Linux,因为 Linux 服务器占据了互联网的 90%.大多数现代路由器运行 Linux 或 ...