jQuery 动态云标签插件


Posted in Javascript onNovember 11, 2014

前言:

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

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

插件名:动态云标签

插件特点:

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

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

动画效果:

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

 jQuery 动态云标签插件

 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>
Javascript 相关文章推荐
Javascript调试工具(下载)
Jan 09 Javascript
JQuery 插件模板 制作jquery插件的朋友可以参考下
Mar 17 Javascript
JavaScript检查某个function是否是原生代码的方法
Aug 20 Javascript
JavaScript实现在标题栏上显示当前日期的方法
Mar 19 Javascript
JavaScript中闭包的写法和作用详解
Jun 29 Javascript
bootstrap为水平排列的表单和内联表单设置可选的图标
Feb 15 Javascript
Vue.js仿微信聊天窗口展示组件功能
Aug 11 Javascript
jQuery实现可兼容IE6的淡入淡出效果告警提示功能示例
Sep 20 jQuery
原生js调用json方法总结
Feb 22 Javascript
vue如何通过id从列表页跳转到对应的详情页
May 01 Javascript
layui之数据表格--与后台交互获取数据的方法
Sep 29 Javascript
uni-app使用微信小程序云函数的步骤示例
May 22 Javascript
javascript 回调函数详解
Nov 11 #Javascript
JSON格式化输出
Nov 10 #Javascript
再谈javascript原型继承
Nov 10 #Javascript
让angularjs支持浏览器自动填表
Nov 10 #Javascript
使用cluster 将自己的Node服务器扩展为多线程服务器
Nov 10 #Javascript
前端必备神器 Snap.svg 弹动效果
Nov 10 #Javascript
浅谈JavaScript 框架分类
Nov 10 #Javascript
You might like
成为好程序员必须避免的5个坏习惯
2014/07/04 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
PHP的imageTtfText()函数深入详解
2021/03/03 PHP
表单内同名元素的控制
2006/11/22 Javascript
页面实时更新时间的JS实例代码
2013/12/18 Javascript
获取鼠标在div中的相对位置的实现代码
2013/12/30 Javascript
js 数值转换为3位逗号分隔的示例代码
2014/02/19 Javascript
调用DOM对象的focus使文本框获得焦点
2014/02/19 Javascript
利用jquery动画特效和css打造的侧边弹出垂直导航
2014/04/04 Javascript
Android中的jQuery:AQuery简介
2014/05/06 Javascript
JS实现动态生成表格并提交表格数据向后端
2020/11/25 Javascript
jQuery ztree实现动态树形多选菜单
2016/08/12 Javascript
jQuery过滤选择器经典应用
2016/08/18 Javascript
微信小程序 小程序制作及动画(animation样式)详解
2017/01/06 Javascript
浅谈键盘上回车按钮的js触发事件
2017/02/13 Javascript
JavaScript Date对象应用实例分享
2017/10/30 Javascript
JS交互点击WKWebView中的图片实现预览效果
2018/01/05 Javascript
vue组件系列之TagsInput详解
2020/05/14 Javascript
如何使用python爬取csdn博客访问量
2016/02/14 Python
Python可变参数*args和**kwargs用法实例小结
2018/04/27 Python
详解python itertools功能
2020/02/07 Python
基于Python计算圆周率pi代码实例
2020/03/25 Python
Python虚拟环境的创建和使用详解
2020/09/07 Python
Python实现一个论文下载器的过程
2021/01/18 Python
德国最大的网上足球商店:11teamsports
2019/09/11 全球购物
商场活动策划方案
2014/01/24 职场文书
个人近期表现材料
2014/02/11 职场文书
医院合作协议书
2014/08/19 职场文书
师德师风个人整改措施
2014/10/27 职场文书
神龙架导游词
2015/02/11 职场文书
贷款担保书范本
2015/09/22 职场文书
《夹竹桃》教学反思
2016/02/23 职场文书
2019年二手房买卖合同范本
2019/10/14 职场文书
南阳市白酒市场的调查报告
2019/11/08 职场文书
《天使的翅膀》读后感3篇
2019/12/20 职场文书
Python-typing: 类型标注与支持 Any类型详解
2021/05/10 Python