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 相关文章推荐
JS 文字符串转换unicode编码函数
May 30 Javascript
javascript new 需不需要继续使用
Jul 02 Javascript
比较搞笑的js陷阱题
Feb 07 Javascript
一个JS的日期格式化算法示例
Jul 31 Javascript
JS图片自动轮换效果实现思路附截图
Apr 30 Javascript
jQuery实现动态添加和删除一个div
Aug 12 Javascript
基于angularJS的表单验证指令介绍
Oct 21 Javascript
基于Phantomjs生成PDF的实现方法
Nov 07 Javascript
js获取指定时间的前几秒
Apr 05 Javascript
详解react-router4 异步加载路由两种方法
Sep 12 Javascript
vue-next/runtime-core 源码阅读指南详解
Oct 25 Javascript
Vue router配置与使用分析讲解
Dec 24 Vue.js
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
动态生成gif格式的图像要注意?
2006/10/09 PHP
php 一元分词算法
2009/11/30 PHP
PHP cURL获取微信公众号access_token的实例
2018/04/28 PHP
Yii框架引入coreseek分页功能示例
2019/02/08 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
2019/09/09 PHP
js表格分页实现代码
2009/09/18 Javascript
Javascript代码在页面加载时的执行顺序介绍
2013/05/03 Javascript
JS实现弹性菜单效果代码
2015/09/07 Javascript
jQuery插件ajaxFileUpload使用详解
2017/01/10 Javascript
解析NodeJS异步I/O的实现
2017/04/13 NodeJs
layui 表格的属性的显示转换方法
2018/08/14 Javascript
vue中axios的二次封装实例讲解
2019/10/14 Javascript
[00:28]DOTA2北京网鱼队选拔赛
2015/04/08 DOTA
python标准日志模块logging的使用方法
2013/11/01 Python
Python警察与小偷的实现之一客户端与服务端通信实例
2014/10/09 Python
Python中unittest模块做UT(单元测试)使用实例
2015/06/12 Python
Pyhton中单行和多行注释的使用方法及规范
2016/10/11 Python
Django实战之用户认证(用户登录与注销)
2018/07/16 Python
python的xpath获取div标签内html内容,实现innerhtml功能的方法
2019/01/02 Python
详解Python3中ceil()函数用法
2019/02/19 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
2019/12/02 Python
Python 读取 YUV(NV12) 视频文件实例
2019/12/09 Python
python如何导出微信公众号文章方法详解
2020/08/31 Python
兰芝美国网上商城:购买LANEIGE睡眠面膜等
2017/06/30 全球购物
英国领先的在线高尔夫商店:Gamola Golf
2019/11/16 全球购物
澳大利亚在线批发商:Simply Wholesale
2021/02/24 全球购物
中学劳技课教师的自我评价
2014/02/05 职场文书
优秀学生获奖感言
2014/02/15 职场文书
物业管理工作方案
2014/05/10 职场文书
德育标兵事迹材料
2014/08/24 职场文书
乡镇平安建设汇报材料
2014/08/25 职场文书
学校创先争优活动总结
2014/08/28 职场文书
学习优秀党务工作者先进事迹材料思想报告
2014/09/17 职场文书
会计人员岗位职责
2015/02/03 职场文书
幼儿园六一主持词
2015/06/30 职场文书
MySQL之高可用集群部署及故障切换实现
2021/04/22 MySQL