JS关键字球状旋转效果的实例代码


Posted in Javascript onNovember 29, 2013

有时上网查资料,看到别人的博客上有关键字旋转的效果,觉得蛮不错的。于是网上搜索了一下它的实现,好吧,自己动手写写。

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=gb2312" />
<title></title>
<link rel="stylesheet" href="css/style.css" />
<script type="text/javascript" src="js/lrtk.js"></script>
</head>
<body>
<!-- 代码开始 --> 
<div id="div1">
<a >Asp.net webform</a>
<a >Asp.net mvc</a>
<a >EF</a>
<a >Castle</a>
<a >Spring.net</a>
<a >NHibernate</a>
<a >WCF</a>
<a >WPF</a>
<a >AOP</a>
<a >IoC</a>
<a >SQL</a>
<a >Javascript</a>
<a >Jquery</a>
<a >KendoUI</a>
</div>
</body>
</html>

CSS:
 #div1{height:400px;width:450px; position:relative; margin:10px auto;}
 #div1 a{position:absolute;top:0px;left:0px;font-weight:bold;padding:3px 6px; color:black; text-decoration: none;}
 #div1 a:hover{border:1px solid #eee;background:#ccc;border-radius:5px;}

既然是关键字,我觉得给他们加上不同的颜色才够酷。初始化一个数组存放颜色值,然后再随机分配给各个标签。
var colors = ["#FF60AF","#9F35FF","#FF2D2D","#6C6C6C","#003D79","#00AEAE","#019858"];
         var rand = Math.ceil(Math.random()*6);
         aA[i].style.color=colors[rand];

JS:
var radius = 100;
var dtr = Math.PI/180;
var d=300;
var mcList = [];
var active = false;
var lasta = 1;
var lastb = 1;
var distr = true;
var tspeed=2;
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++)
    {
        var colors = ["#FF60AF","#9F35FF","#FF2D2D","#6C6C6C","#003D79","#00AEAE","#019858"];
        var rand = Math.ceil(Math.random()*6);
        aA[i].style.color=colors[rand];
        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, 10);
};
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);
}

最后看下效果:

JS关键字球状旋转效果的实例代码

Javascript 相关文章推荐
jquery 中ajax执行的优先级
Jun 22 Javascript
JS及PHP代码编写八大排序算法
Jul 12 Javascript
jQuery实现的简单在线计算器功能
May 11 jQuery
JavaScript实现滑动导航栏效果
Aug 30 Javascript
vue.js默认路由不加载linkActiveClass问题的解决方法
Dec 11 Javascript
vuex state及mapState的基础用法详解
Apr 19 Javascript
Vue引入sass并配置全局变量的方法
Jun 27 Javascript
微信小程序实现选项卡效果
Nov 06 Javascript
js仿360开机效果
Dec 26 Javascript
element-ui树形控件后台返回的数据+生成组织树的工具类
Mar 05 Javascript
Vue使用Proxy代理后仍无法生效的解决
Nov 13 Javascript
JavaScript组合继承详解
Nov 07 Javascript
JS Loading功能的简单实现
Nov 29 #Javascript
分享Javascript中最常用的55个经典小技巧
Nov 29 #Javascript
浅析JavaScript中的类型和对象
Nov 29 #Javascript
JavaScript中创建类/对象的几种方法总结
Nov 29 #Javascript
转换字符串为json对象的方法详解
Nov 29 #Javascript
javascript对下拉列表框(select)的操作实例讲解
Nov 29 #Javascript
js 定时器setTimeout无法调用局部变量的解决办法
Nov 28 #Javascript
You might like
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
JAVASCRIPT 对象的创建与使用
2021/03/09 Javascript
js 在定义的时候立即执行的函数表达式(function)写法
2013/01/16 Javascript
jQuery写的日历(包括日历的样式及功能)
2013/04/23 Javascript
jquery简单实现外部链接用新窗口打开的方法
2015/05/30 Javascript
js实现select下拉框菜单
2015/12/08 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
jquery获取input type=text中的值的各种方式(总结)
2016/12/02 Javascript
jQuery实现倒计时重新发送短信验证码功能示例
2017/01/12 Javascript
利用Jquery实现几款漂亮实用的时间轴(附示例代码)
2017/02/15 Javascript
详解react使用react-bootstrap当轮子造车
2017/08/15 Javascript
react-native 完整实现登录功能的示例代码
2017/09/11 Javascript
NodeJs form-data格式传输文件的方法
2017/12/13 NodeJs
Vue.js 动态为img的src赋值方法
2018/03/14 Javascript
微信小程序开发实现消息推送
2020/11/18 Javascript
js笔试题-接收get请求参数
2019/06/15 Javascript
js实现头像上传并且可预览提交
2020/12/25 Javascript
Python实现竖排打印传单手机号码易撕条
2015/03/16 Python
Python的Flask框架标配模板引擎Jinja2的使用教程
2016/07/12 Python
Python实现字符串逆序输出功能示例
2017/06/24 Python
python执行使用shell命令方法分享
2017/11/08 Python
Python爬取qq空间说说的实例代码
2018/08/17 Python
使用python生成杨辉三角形的示例代码
2018/08/29 Python
解读python如何实现决策树算法
2018/10/11 Python
Python Selenium截图功能实现代码
2020/04/26 Python
python自定义函数def的应用详解
2020/06/03 Python
ROSEFIELD手表荷兰官方网上商店:北欧极简设计女士腕表品牌
2018/01/24 全球购物
请解释接口的显式实现有什么意义
2012/05/26 面试题
汽车技术服务与营销专业在籍生自荐信
2013/09/28 职场文书
父亲八十大寿答谢词
2014/01/23 职场文书
JAVA程序员自荐书
2014/01/30 职场文书
社会工作专业求职信
2014/07/15 职场文书
2015年采购工作总结
2015/04/10 职场文书
Win11怎样将锁屏账户头像图片改成动画视频
2021/11/21 数码科技
JS轻量级函数式编程实现XDM二
2022/06/16 Javascript
Win11 KB5015814遇安装失败 影响开始菜单性能解决方法
2022/07/15 数码科技