jQuery 动态云标签插件_jquery

前言:

  最近对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>

时间: 2024-08-03 20:14:21

jQuery 动态云标签插件_jquery的相关文章

jquery动态创建标签问题,请求帮助

问题描述 jquery动态创建标签问题,请求帮助 jQuery动态添加DIV,刷新后添加的DIV依然保存在原来的位置,怎么实现?HELP~~ 解决方案 js动态设置的内容刷新后是不存在的,你一定要实现刷新后还保留在原来的位置,需要在你的操作后用hash记录操作步骤,然后window.onload中获取hash对象执行还原操作.

分享一个jQuery动态网格布局插件:Masonry

在线演示 Masonry是 一款非常强大的jQuery动态网格布局插件,可以帮助开发人员快速开发类似剪贴画的界面效果.和CSS中float的效果不太一样的地方在 于,float先水平排列,然后再垂直排列,使用Masonry则垂直排列元素,然后将下一个元素放置到网格中的下一个开发区域.这种效果可以最小化处理 不同高度的元素在垂直方向的间隙.如下: 在上图中大家可以看到,在网格布局中使用float来处理不同高度的元素会使得垂直方向的元素间间隔比较大,而使用Masonry处理后,间隔变小. Javas

推荐8款jQuery轻量级树形Tree插件_jquery

由于其拥有庞大,实用的插件库,使得jQuery变得越来越流行.今天将介绍一些最好的jQuery树形视图插件,具有扩展和可折叠的树视图.这些都是轻量级的,灵活的jQuery插件,它将一个无序列表转换为可展开和折叠的树. Treeview – Expandable and Collapsible Tree jQuery Plugin jQuery Treeview是一个轻巧和灵活的jQuery插件.它将一个无序列表转换成一个可扩展和可折叠的树,非常适合导航增强. 示例 jsTree – jQuery

基于jQuery的表格操作插件_jquery

大多数前端er都把网页中的table标签替换为div,主要就是因为div要比table更容易添加CSS样式.但是我们在日常应用中仍然要用到table表格,其中最好的例子就是对照表.今天彬Go将向大家推荐15个jQuery表格插件让你对数据表格进行显示.排序.筛选和操控.如jQuery表格排序插件.jQuery表格拖拽插件.jQuery树形表格插件.设置颜色.点击.替换等效果. 1.DataTables-强大的jQuery表格插件 DataTables是提供了大量特性的强大jQuery表格插件.例

如何使用jquery easyui创建标签组件_jquery

jQuery EasyUI v1.4.4 下载网址:http://www.jb51.net/codes/70218.html 本教程将展示如何使用easyui创建一个标签组件.标签可以动态地添加或删除多个面板,你可以使用标签在同一个页面上显示不同的实体. 标签一次只能显示一个面板,每个面板都有标题.图表和关闭按钮.当标签被选中之后,会显示相应面板的内容. 使用HTML标记创建标签,其中包括一个DIV容器和一些DIV面板. < div class="easyui-tabs" sty

易操作的jQuery表单提示插件_jquery

本文实例讲述了一款轻量级的表单提示插件---jQuery Form Toolltip.分享给大家供大家参考.具体如下: jQuery Form Toolltip 特点: 你可以单独自定义提示信息的CSS样式. 你可以指定淡入淡出的方向,当前支持Top, Bottom, Right 和 Left 运行效果截图如下: 具体代码如下: jquery实例:jQuery Form Toolltip使用方法引入核心文件 <script src="js/jquery/2.1.1/jquery.min.j

自定义刻度jQuery进度条及插件_jquery

简要教程 progressdots是一款可自定义刻度动画的jQuery进度条插件.通过该jQuery进度条插件你可以自定义进度条刻度圆点的数量,大小,颜色等属性,并且可以通过CSS来控制圆点的外观样式. 请看下面效果图了解相关插件. 使用该jQuery进度条插件需要引入jquery,jquery.progressdots.js和jquery.progressdots.css文件. <script src="jquery.min.js"></script> <

jquery动态添加option示例_jquery

jquery动态添加option js动态添加option 复制代码 代码如下: var sel= document.getElementById("Selected1"); sel.options.add(new Option("请选择",""));sel.options.add(new Option("name","id")); jquery动态添加option 复制代码 代码如下: $("#

基于jquery打造的百分比动态色彩条插件_jquery

以前没写过jquery插件,在开发这个时,写一下代码,又看一下jquery插件的定义(如何开发之类的东东),来来去去的. 之所以要写这个插件,主要是为了往后的项目中方便实现这类型的功能,在之前做问卷调查那个应用中,就用到这个来显示结果,但当时开发时并不用是插件的,一大堆代码,看也烦,用起来很麻烦(当时就调了一个上午). 还好,这个功能比较简单,正好合适新手写插件. 具体的效果如图: 这个也算是简单的比例图吧. 插件的具体的代码如下: 复制代码 代码如下: ; (function ($) { $.