javascript实现动态标签云


Posted in Javascript onOctober 16, 2015

今天上学校的图书馆,看到了一个好玩的东西,特意百度了下,发现叫做“标签球”,效果图为:

javascript实现动态标签云

直接代码如下:

CSS:

#div1 {position:relative; width:350px; height:350px; border:1px solid #000; margin: 20px auto 0; }
#div1 a {position:absolute; top:0px; left:0px; font-family: Microsoft YaHei; color:#000; font-weight:bold; text-decoration:none; padding: 3px 6px; }
#div1 a:hover {border: 1px solid #eee; background: #FFF; }
#div1 .blue {color:blue;}
#div1 .red {color:red;}
#div1 .green {color:green;}

HTML:

<div id="div1">
  <a href="#">标签云</a>
  <a href="#" class="red">PHP</a>
  <a href="#">瀑布流</a>
  <a href="#">Tab</a>
  <a href="#" class="blue">流体布局</a>
  <a href="#">SEO</a>
  <a href="#" class="red">彩蛋</a>
  <a href="#" class="green">JavaScript</a>
  <a href="#">miaov</a>
  <a href="#" class="red">CSS</a>
  <a href="#">asp.net</a>
  <a href="#" class="blue">蓝色经典</a>
  <a href="#">OOP</a>
  <a href="#" class="red">Android</a>
  <a href="#" class="blue">妙味茶馆</a>
  <a href="#">dialog</a>
  <a href="#" class="blue">淘客</a>
  <a href="#">Pin</a>
  <a href="#">微博</a>
  <a href="#" class="green">IPhone</a>
</div>

JS

$(document).ready(function() {
  $("#div1").windstagball({
      radius:120,
      speed:10
    });
  });

首先得写好布局,最外层div样式position设置为relative

内层元素position为absolute,这样才能形成效果,top为0,left为0
先导入jquery文件,再导入相应的插件文件
获取$("#xxx")元素,并调用windstagball()函数,radius是标签球的变径大小,speed顾名思义就是运动的速度。

附上js插件

var radius = 120;
var dtr = Math.PI/180;
var d=300;

var mcList = [];
var active = false;
var lasta = 1;
var lastb = 1;
var distr = true;
var tspeed=10;
var size=250;

var mouseX=0;
var mouseY=0;

var howElliptical=1;

var aA=null;
var oDiv=null;

window.onload=function ()
{
	var i=0;
	var oTag=null;
	
	oDiv=document.getElementById('div1');
	
	aA=oDiv.getElementsByTagName('a');
	
	for(i=0;i<aA.length;i++)
	{
		oTag={};
		
		oTag.offsetWidth=aA[i].offsetWidth;
		oTag.offsetHeight=aA[i].offsetHeight;
		
		mcList.push(oTag);
	}
	
	sineCosine( 0,0,0 );
	
	positionAll();
	
	oDiv.onmouseover=function ()
	{
		active=true;
	};
	
	oDiv.onmouseout=function ()
	{
		active=false;
	};
	
	oDiv.onmousemove=function (ev)
	{
		var oEvent=window.event || ev;
		
		mouseX=oEvent.clientX-(oDiv.offsetLeft+oDiv.offsetWidth/2);
		mouseY=oEvent.clientY-(oDiv.offsetTop+oDiv.offsetHeight/2);
		
		mouseX/=5;
		mouseY/=5;
	};
	
	setInterval(update, 30);
};

function update()
{
	var a;
	var b;
	
	if(active)
	{
		a = (-Math.min( Math.max( -mouseY, -size ), size ) / radius ) * tspeed;
		b = (Math.min( Math.max( -mouseX, -size ), size ) / radius ) * tspeed;
	}
	else
	{
		a = lasta * 0.98;
		b = lastb * 0.98;
	}
	
	lasta=a;
	lastb=b;
	
	if(Math.abs(a)<=0.01 && Math.abs(b)<=0.01)
	{
		return;
	}
	
	var c=0;
	sineCosine(a,b,c);
	for(var j=0;j<mcList.length;j++)
	{
		var rx1=mcList[j].cx;
		var ry1=mcList[j].cy*ca+mcList[j].cz*(-sa);
		var rz1=mcList[j].cy*sa+mcList[j].cz*ca;
		
		var rx2=rx1*cb+rz1*sb;
		var ry2=ry1;
		var rz2=rx1*(-sb)+rz1*cb;
		
		var rx3=rx2*cc+ry2*(-sc);
		var ry3=rx2*sc+ry2*cc;
		var rz3=rz2;
		
		mcList[j].cx=rx3;
		mcList[j].cy=ry3;
		mcList[j].cz=rz3;
		
		per=d/(d+rz3);
		
		mcList[j].x=(howElliptical*rx3*per)-(howElliptical*2);
		mcList[j].y=ry3*per;
		mcList[j].scale=per;
		mcList[j].alpha=per;
		
		mcList[j].alpha=(mcList[j].alpha-0.6)*(10/6);
	}
	
	doPosition();
	depthSort();
}

function depthSort()
{
	var i=0;
	var aTmp=[];
	
	for(i=0;i<aA.length;i++)
	{
		aTmp.push(aA[i]);
	}
	
	aTmp.sort
	(
		function (vItem1, vItem2)
		{
			if(vItem1.cz>vItem2.cz)
			{
				return -1;
			}
			else if(vItem1.cz<vItem2.cz)
			{
				return 1;
			}
			else
			{
				return 0;
			}
		}
	);
	
	for(i=0;i<aTmp.length;i++)
	{
		aTmp[i].style.zIndex=i;
	}
}

function positionAll()
{
	var phi=0;
	var theta=0;
	var max=mcList.length;
	var i=0;
	
	var aTmp=[];
	var oFragment=document.createDocumentFragment();
	
	//随机排序
	for(i=0;i<aA.length;i++)
	{
		aTmp.push(aA[i]);
	}
	
	aTmp.sort
	(
		function ()
		{
			return Math.random()<0.5?1:-1;
		}
	);
	
	for(i=0;i<aTmp.length;i++)
	{
		oFragment.appendChild(aTmp[i]);
	}
	
	oDiv.appendChild(oFragment);
	
	for( var i=1; i<max+1; i++){
		if( distr )
		{
			phi = Math.acos(-1+(2*i-1)/max);
			theta = Math.sqrt(max*Math.PI)*phi;
		}
		else
		{
			phi = Math.random()*(Math.PI);
			theta = Math.random()*(2*Math.PI);
		}
		//坐标变换
		mcList[i-1].cx = radius * Math.cos(theta)*Math.sin(phi);
		mcList[i-1].cy = radius * Math.sin(theta)*Math.sin(phi);
		mcList[i-1].cz = radius * Math.cos(phi);
		
		aA[i-1].style.left=mcList[i-1].cx+oDiv.offsetWidth/2-mcList[i-1].offsetWidth/2+'px';
		aA[i-1].style.top=mcList[i-1].cy+oDiv.offsetHeight/2-mcList[i-1].offsetHeight/2+'px';
	}
}

function doPosition()
{
	var l=oDiv.offsetWidth/2;
	var t=oDiv.offsetHeight/2;
	for(var i=0;i<mcList.length;i++)
	{
		aA[i].style.left=mcList[i].cx+l-mcList[i].offsetWidth/2+'px';
		aA[i].style.top=mcList[i].cy+t-mcList[i].offsetHeight/2+'px';
		
		aA[i].style.fontSize=Math.ceil(12*mcList[i].scale/2)+8+'px';
		
		aA[i].style.filter="alpha(opacity="+100*mcList[i].alpha+")";
		aA[i].style.opacity=mcList[i].alpha;
	}
}

function sineCosine( a, b, c)
{
	sa = Math.sin(a * dtr);
	ca = Math.cos(a * dtr);
	sb = Math.sin(b * dtr);
	cb = Math.cos(b * dtr);
	sc = Math.sin(c * dtr);
	cc = Math.cos(c * dtr);
}
Javascript 相关文章推荐
在浏览器窗口上添加遮罩层的方法
Nov 12 Javascript
jquery实现tr元素的上下移动示例代码
Dec 20 Javascript
AspNet中使用JQuery boxy插件的确认框
May 20 Javascript
详解JavaScript中Date.UTC()方法的使用
Jun 12 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
Sep 24 Javascript
DeviceOne 让你一见钟情的App快速开发平台
Feb 17 Javascript
jQuery Easyui datagrid editor为combobox时指定数据源实例
Dec 19 Javascript
手机注册发送验证码倒计时的简单实例
Nov 15 Javascript
JS 使用 window对象的print方法实现分页打印功能
May 16 Javascript
JavaScript中.min.js和.js文件的区别讲解
Feb 13 Javascript
微信小程序学习笔记之获取位置信息操作图文详解
Mar 29 Javascript
详解vue微信网页授权最终解决方案
Jun 16 Javascript
在Ubuntu系统上安装Node.JS的教程
Oct 15 #Javascript
jquery实现简单实用的弹出层效果代码
Oct 15 #Javascript
简单谈谈node.js 版本控制 nvm和 n
Oct 15 #Javascript
jQuery实现仿QQ在线客服效果的滚动层代码
Oct 15 #Javascript
JS实现选中当前菜单后高亮显示的导航条效果
Oct 15 #Javascript
JS+CSS实现另类带提示效果的竖向导航菜单
Oct 15 #Javascript
JS利用cookie记忆当前位置的防刷新导航效果
Oct 15 #Javascript
You might like
PHP新手入门学习方法
2011/05/08 PHP
php计算两个整数的最大公约数常用算法小结
2015/03/05 PHP
CodeIgniter整合Smarty的方法详解
2017/08/25 PHP
laravel5实现微信第三方登录功能
2018/12/06 PHP
JQuery this 和 $(this) 的区别
2009/08/23 Javascript
jQuery AjaxQueue改进步骤
2011/10/06 Javascript
javascript之bind使用介绍
2011/10/09 Javascript
jquery动画1.加载指示器
2012/08/24 Javascript
基于JQuery实现的图片自动进行缩放和裁剪处理
2014/01/31 Javascript
jquery提示效果实例分析
2014/11/25 Javascript
javascript实现无限级select联动菜单
2015/01/02 Javascript
JavaScript中this详解
2015/09/01 Javascript
基于javascript实现句子翻牌网页版小游戏
2016/03/23 Javascript
微信小程序之拖拽排序(代码分享)
2017/01/21 Javascript
图解Javascript——作用域、作用域链、闭包
2017/03/21 Javascript
iscroll动态加载数据完美解决方法
2017/07/18 Javascript
vue中锚点的三种方法
2018/07/06 Javascript
vue.js+element-ui动态配置菜单的实例
2018/09/07 Javascript
详解离线安装npm包的几种方法
2018/11/25 Javascript
nodejs使用async模块同步执行的方法
2019/03/02 NodeJs
简单介绍Python中的floor()方法
2015/05/15 Python
浅谈Pandas 排序之后索引的问题
2018/06/07 Python
python实现一个函数版的名片管理系统过程解析
2019/08/27 Python
Python从文件中读取指定的行以及在文件指定位置写入
2019/09/06 Python
Python中断多重循环的思路总结
2019/10/04 Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
2019/12/10 Python
pytorch forward两个参数实例
2020/01/17 Python
python 函数中的参数类型
2020/02/11 Python
一篇文章搞懂python的转义字符及用法
2020/09/03 Python
SmartBuyGlasses比利时:购买品牌太阳镜和眼镜
2019/08/09 全球购物
abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?
2012/10/15 面试题
护理专科毕业生自荐书范文
2014/02/19 职场文书
做人民满意的公务员活动方案
2014/08/25 职场文书
2015年医德考评自我评价
2015/03/03 职场文书
关于flex 上下文中自动 margin的问题(完整例子)
2021/05/20 HTML / CSS
html+css实现滚动到元素位置显示加载动画效果
2021/08/02 HTML / CSS