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 相关文章推荐
ajaxFileUpload.js插件支持多文件上传的方法
Sep 02 Javascript
javascript弹出拖动窗口
Aug 11 Javascript
jQuery+PHP+MySQL二级联动下拉菜单实例讲解
Oct 27 Javascript
基于Bootstrap的Metronic框架实现页面链接收藏夹功能
Aug 29 Javascript
Javascript基础回顾之(三) js面向对象
Jan 31 Javascript
JavaScript实现翻页功能(附效果图)
Feb 16 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
Aug 08 Javascript
JavaScript常用数组操作方法,包含ES6方法
May 10 Javascript
Vuejs监听vuex中值的变化的方法示例
Dec 02 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
Dec 13 Javascript
详解搭建一个vue-cli的移动端H5开发模板
Jan 17 Javascript
使用Cargo工具高效创建Rust项目
Aug 14 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
PHP调用三种数据库的方法(2)
2006/10/09 PHP
PHP企业级应用之常见缓存技术篇
2011/01/27 PHP
PHP实现取得HTTP请求的原文
2014/08/18 PHP
php实现随机显示图片方法汇总
2015/05/21 PHP
php 数据结构之链表队列
2017/10/17 PHP
js跨域和ajax 跨域问题的实现思路
2009/09/05 Javascript
javascript是怎么继承的介绍
2012/01/05 Javascript
js验证电话号码与手机支持+86的正则表达式
2014/01/23 Javascript
fckeditor粘贴Word时弹出窗口取消的方法
2014/10/30 Javascript
浅谈jQuery中的事件
2015/03/23 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
2015/05/16 Javascript
Bootstrap 粘页脚效果
2016/03/28 Javascript
Bootstrap布局组件教程之Bootstrap下拉菜单
2016/06/12 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(三)
2016/09/14 Javascript
Angular2实现自定义双向绑定属性
2017/03/22 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【圆形情况】
2018/12/13 Javascript
JS多个表单数据提交下的serialize()应用实例分析
2019/08/27 Javascript
javascript canvas实现简易时钟例子
2020/09/05 Javascript
对python中return和print的一些理解
2017/08/18 Python
python中reduce()函数的使用方法示例
2017/09/29 Python
python使用PyCharm进行远程开发和调试
2017/11/02 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
Linux安装Python3如何和系统自带的Python2并存
2020/07/23 Python
CSS3 渐变(Gradients)之CSS3 径向渐变
2016/07/08 HTML / CSS
介绍一下Linux文件的记录形式
2013/09/29 面试题
计算机专业自荐信范文
2014/05/28 职场文书
奶茶店创业计划书
2014/08/14 职场文书
2014年营业员工作总结
2014/11/18 职场文书
三十年同学聚会致辞
2015/07/28 职场文书
土木工程生产实习心得体会
2016/01/22 职场文书
培训心得体会怎么写
2016/01/25 职场文书
2016年保险公众宣传日活动总结
2016/04/05 职场文书
什么是创业计划书?什么是商业计划书?这里一一解答
2019/07/12 职场文书
我国拿下天问一号火星着陆区附近 22 个地理实体命名:平乐、西柏坡、古田、漠河等
2022/04/29 数码科技
关于windows server 2012 DC 环境 重启后蓝屏代码:0xc00002e2的问题
2022/05/25 Servers
springboot为异步任务规划自定义线程池的实现
2022/06/14 Java/Android