• HTML5实现3D球效果


     效果图:

    1. DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta name="format-detection" content="telephone=yes"/>
    5. <title>3d球型标签云title>
    6. head>
    7. <style>
    8. body {
    9. background: #000
    10. }
    11. #main {
    12. margin: 20px auto;
    13. width: 450px;
    14. height: 450px;
    15. border: 1px solid green;
    16. position: relative;
    17. z-index: 10;
    18. }
    19. #main a {
    20. position: absolute;
    21. left: 0;
    22. top: 0;
    23. font-size: 15px;
    24. font-weight: bolder;
    25. text-decoration: none;
    26. z-index: 9;
    27. }
    28. a:hover {
    29. transform: scale(2);
    30. }
    31. .red {
    32. color: red;
    33. }
    34. .blue {
    35. color: blur;
    36. }
    37. .yellow {
    38. color: yellow;
    39. }
    40. style>
    41. <body>
    42. <div id="main">
    43. <a href="#">小仙女a>
    44. <a href="#" class="red">苹果a>
    45. <a href="#">香蕉a>
    46. <a href="#">西瓜a>
    47. <a href="#" class="blue">小仙女a>
    48. <a href="#">SEOa>
    49. <a href="#">小公主a>
    50. <a href="#" class="yellow">a>
    51. <a href="#">小泰迪a>
    52. <a href="#" class="red">CSSa>
    53. <a href="#">小猫咪a>
    54. <a href="#" class="blue">Javaa>
    55. <a href="#">小度熊a>
    56. <a href="#">C#a>
    57. <a href="#">语言类别a>
    58. <a href="#" class="blue">西红柿a>
    59. <a href="#">C++a>
    60. <a href="#">Ca>
    61. <a href="#">番茄a>
    62. <a href="#">demoa>
    63. div>
    64. body>
    65. html>
    66. <script type="text/javascript">
    67. document.getElementById('main').onclick=function() {
    68. window.location.hash = 'page';
    69. alert(11);
    70. }
    71. // 1.计算所有的标签在球面上的坐标
    72. var main = document.getElementById('main');
    73. var tagElement = document.getElementsByTagName('a');
    74. var tagLength = tagElement.length;
    75. var offsetList = [];
    76. var radius = 120;
    77. var tspeed = 10;
    78. var size = 250;
    79. var active = false;
    80. var d = 300;
    81. var lasta = 1;
    82. var lastb = 1;
    83. var mouseX = 0;
    84. var mouseY = 0;
    85. // 2.计算所有元素的offsetWidth,offsetHeight值
    86. for (var i = 0; i < tagElement.length; i++) {
    87. offsetList.push({
    88. offsetWidth: tagElement[i].offsetWidth,
    89. offsetHeight: tagElement[i].offsetHeight
    90. });
    91. };
    92. calcXYZ();
    93. // 鼠标移入事件
    94. main.onmouseover = function (){
    95. active = true;
    96. };
    97. // 鼠标移出事件
    98. main.onmouseout = function () {
    99. active = false;
    100. // clearInterval(t);
    101. };
    102. main.onmousemove = function (event) {
    103. var e = window.event || event; //兼容ie和其他浏览器的事件
    104. mouseX = (e.clientX - (main.offsetLeft + main.offsetWidth/2))/5;
    105. mouseY = (e.clientY - (main.offsetTop + main.offsetHeight/2))/5;
    106. }
    107. var t = setInterval(update, 30);
    108. // 设置元素在球形坐标系的位置
    109. function calcXYZ() {
    110. // var radomθ,radomΦ;
    111. for (var i = 0; i < tagElement.length; i++) {
    112. var radomθ = Math.acos(-1 + (2 * i)/tagLength); //θ = arccos(((2 * num)-1)/all - 1);
    113. var radomΦ = Math.sqrt(tagLength * Math.PI) * radomθ; //Φ = θ*sqrt(all * π);
    114. //x,y,z坐标的计算公式 x=r*sinθ*cosΦ y=r*sinθ*sinΦ z=r*cosθ;
    115. var x = radius * Math.sin(radomθ) * Math.cos(radomΦ);
    116. var y = radius * Math.sin(radomθ) * Math.sin(radomΦ);
    117. var z = radius * Math.cos(radomθ);
    118. offsetList[i].x = x;
    119. offsetList[i].y = y;
    120. offsetList[i].z = z;
    121. // 设置元素的位置
    122. tagElement[i].style.left = x + main.offsetWidth/2 - offsetList[i].offsetWidth/2 + 'px';
    123. tagElement[i].style.top = y + main.offsetHeight/2 - offsetList[i].offsetHeight/2 + 'px';
    124. }
    125. }
    126. // 计算中心点的sin,cos值
    127. function sineCosine( a, b, c) {
    128. sa = Math.sin(a * (Math.PI/180));
    129. ca = Math.cos(a * (Math.PI/180));
    130. sb = Math.sin(b * (Math.PI/180));
    131. cb = Math.cos(b * (Math.PI/180));
    132. sc = Math.sin(c * (Math.PI/180));
    133. cc = Math.cos(c * (Math.PI/180));
    134. }
    135. // 球运动算法
    136. function update() {
    137. var a, b;
    138. if(active) {
    139. a = (-Math.min( Math.max( -mouseY, -size ), size ) / radius ) * tspeed;
    140. b = (Math.min( Math.max( -mouseX, -size ), size ) / radius ) * tspeed;
    141. }
    142. else
    143. {
    144. a = lasta * 0.98;
    145. b = lastb * 0.98;
    146. }
    147. lasta = a;
    148. lastb = b;
    149. if(Math.abs(a) <= 0.01 && Math.abs(b) <= 0.01) {
    150. return;
    151. }
    152. var c = 0;
    153. sineCosine(a,b,c);
    154. // 计算球旋转后的坐标
    155. for(var j = 0; j < tagLength; j++) {
    156. var rx1 = offsetList[j].x;
    157. var ry1 = offsetList[j].y * ca + offsetList[j].z * (-sa);
    158. var rz1 = offsetList[j].y * sa + offsetList[j].z * ca;
    159. var rx2 = rx1 * cb + rz1 * sb;
    160. var ry2 = ry1;
    161. var rz2 = rx1 * (-sb) + rz1 * cb;
    162. var rx3 = rx2 * cc + ry2 * (-sc);
    163. var ry3 = rx2 * sc + ry2 * cc;
    164. var rz3 = rz2;
    165. offsetList[j].x = rx3;
    166. offsetList[j].y = ry3;
    167. offsetList[j].z = rz3;
    168. per = d / (d + rz3);
    169. // offsetList[j].x=(howElliptical*rx3*per)-(howElliptical*2);
    170. // offsetList[j].y=ry3*per;
    171. // offsetList[j].scale=per;
    172. offsetList[j].alpha = per;
    173. offsetList[j].alpha=(offsetList[j].alpha - 0.6)*(10/6);
    174. }
    175. doPosition();
    176. // depthSort();
    177. }
    178. function doPosition() {
    179. // console.log(11);
    180. var l = main.offsetWidth/2;
    181. var t = main.offsetHeight/2;
    182. for(var i = 0; i < tagLength; i++) {
    183. tagElement[i].style.left = offsetList[i].x + l - offsetList[i].offsetWidth/2 + 'px';
    184. tagElement[i].style.top = offsetList[i].y + t - offsetList[i].offsetHeight/2 + 'px';
    185. // console.log(tagElement[i].style.left, tagElement[i].style.top)
    186. // tagElement[i].style.fontSize=Math.ceil(12*mcList[i].scale/2)+8+'px';
    187. // tagElement[i].style.filter="alpha(opacity="+100*mcList[i].alpha+")";
    188. tagElement[i].style.opacity = offsetList[i].alpha;
    189. }
    190. }
    191. script>

  • 相关阅读:
    字节对齐(C++,C#)
    大数据开发是做什么的?怎样入门?
    Web服务器简介及HTTP协议
    【java学习—十四】java动态代理(6)
    【Git】Gui图形化管理、SSH协议私库集成IDEA使用
    Spring
    IgH详解十四、igh添加总线链路状态监测功能
    C语言典范编程
    【INTEL(ALTERA)】Nios II软件开发人员手册中设计位置的错误示例
    第八章——权限管理与备份
  • 原文地址:https://blog.csdn.net/m0_56416159/article/details/140276689