Teknologian jakaminen

HTML5 toteuttaa 3D-pallotehosteen

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Renderöinti:

  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="#">SEO</a>
  49. <a href="#">小公主</a>
  50. <a href="#" class="yellow"></a>
  51. <a href="#">小泰迪</a>
  52. <a href="#" class="red">CSS</a>
  53. <a href="#">小猫咪</a>
  54. <a href="#" class="blue">Java</a>
  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="#">C</a>
  61. <a href="#">番茄</a>
  62. <a href="#">demo</a>
  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>