3d云標簽

好久沒發什么了 , 分享一個3d標簽。

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>3D云標簽JS特效</title>
<style type="text/css">
body {
        background: #24313d;
}
#tagsList {
        position: relative;
        width: 450px;
        height: 450px;
        margin: 150px auto 0;
}
#tagsList a {
        position: absolute;
        top: 0px;
        left: 0px;
        font-family: Microsoft YaHei;
        color: #fff;
        font-weight: bold;
        text-decoration: none;
        padding: 3px 6px;
}

#tagsList a:hover {
        color: #FF0000;
        letter-spacing: 2px;
}
</style>
<script type="text/javascript"> 
   var radius = 120,dtr = Math.PI / 180,d = 300,mcList = [],active = false,lasta = 1,lastb = 1, distr = true,tspeed = 10,size = 250,mouseX = 0, mouseY = 0,howElliptical = 1,aA = null,oDiv = null;
window.onload = function () {
    var i = 0,oTag = null;
    oDiv = document.getElementById('tagsList');
    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);
    }
</script>

</head>
<body>
<div id="tagsList">

    <a href="##" title="星級評分">星級評分</a>
    <a href="##" title="層特效">層特效</a>
    <a href="##" title="關鍵字">關鍵字</a>
    <a href="##" title="拖拽">拖拽</a>
    <a href="##" title="分頁插件">分頁插件</a>
    <a href="##" title="時間插件">時間插件</a>
    <a href="##" title="彈出層">彈出層</a>
    <a href="##" title="數據統計">數據統計</a>
    <a href="##" title="HTML5">HTML5</a>
    <a href="##" title="置頂特效">置頂特效</a>
    <a href="##" title="選項卡">選項卡</a>
    <a href="##" title="導航菜單">導航菜單</a>
    <a href="##" title="原創">原創</a>
    <a href="##" title="動畫插件">動畫插件</a>
    <a href="##" title="實用特效">實用特效</a>
    <a href="##" title="table插件">table插件</a>
    <a href="##" title="文字特效">文字特效</a>
    <a href="##" title="圖片特效">圖片特效</a>
    <a href="##" title="在線客服">在線客服</a>
    <a href="##" title="瀑布流">瀑布流</a>
    <a href="##" title="網友蘑菇">網友蘑菇</a>

</div>
</body>
</html>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容