No Description

tagcloud.js 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. // /*
  2. // * 3d标签云
  3. // * 功能:鼠标移入标签,当前标签静止放大
  4. // * 说明:
  5. // * */
  6. // var tagcloud = (function(win, doc) { // ns
  7. // // 判断对象
  8. // function isObject (obj) {
  9. // return Object.prototype.toString.call(obj) === '[object Object]';
  10. // }
  11. // // 构造函数
  12. // function TagCloud (options) {
  13. // var self = this;
  14. // self.config = TagCloud._getConfig(options);
  15. // self.box = self.config.element; //组件元素
  16. // self.fontsize = self.config.fontsize; //平均字体大小
  17. // self.radius = self.config.radius; //滚动半径
  18. // self.depth = 2 * self.radius; //滚动深度
  19. // self.size = 2 * self.radius; //随鼠标滚动变速作用区域
  20. // self.mspeed = TagCloud._getMsSpeed(self.config.mspeed);
  21. // self.ispeed = TagCloud._getIsSpeed(self.config.ispeed);
  22. // self.items = self._getItems();
  23. // self.direction = self.config.direction; //初始滚动方向
  24. // self.keep = self.config.keep; //鼠标移出后是否保持之前滚动
  25. // //初始化
  26. // self.active = false; //是否为激活状态
  27. // self.lasta = 1;
  28. // self.lastb = 1;
  29. // self.mouseX0 = self.ispeed * Math.sin(self.direction * Math.PI / 180); //鼠标与滚动圆心x轴初始距离
  30. // self.mouseY0 = -self.ispeed * Math.cos(self.direction * Math.PI / 180); //鼠标与滚动圆心y轴初始距离
  31. // self.mouseX = self.mouseX0; //鼠标与滚动圆心x轴距离
  32. // self.mouseY = self.mouseY0; //鼠标与滚动圆心y轴距离
  33. // self.index = -1;
  34. // //鼠标移入
  35. // TagCloud._on(self.box, 'mouseover', function () {
  36. // self.active = true;
  37. // });
  38. // //鼠标移出
  39. // TagCloud._on(self.box, 'mouseout', function () {
  40. // self.active = false;
  41. // });
  42. // //鼠标在内移动
  43. // TagCloud._on(self.keep ? win : self.box, 'mousemove', function (ev) {
  44. // var oEvent = win.event || ev;
  45. // var boxPosition = self.box.getBoundingClientRect();
  46. // self.mouseX = (oEvent.clientX - (boxPosition.left + self.box.offsetWidth / 2)) / 5;
  47. // self.mouseY = (oEvent.clientY - (boxPosition.top + self.box.offsetHeight / 2)) / 5;
  48. // });
  49. // for (var j = 0, len = self.items.length; j < len; j++) {
  50. // self.items[j].element.index=j;
  51. // //鼠标移出子元素,当前元素静止放大
  52. // self.items[j].element.onmouseover = function(){
  53. // self.index = this.index;
  54. // };
  55. // //鼠标移出子元素,当前元素继续滚动
  56. // self.items[j].element.onmouseout = function(){
  57. // self.index = -1;
  58. // };
  59. // }
  60. // //定时更新
  61. // TagCloud.boxs.push(self.box);
  62. // self.update(self); //初始更新
  63. // self.box.style.visibility = "visible";
  64. // self.box.style.position = "relative";
  65. // self.box.style.minHeight = 1.2 * self.size + "px";
  66. // self.box.style.minWidth = 1.5 * self.size + "px";
  67. // for (var j = 0, len = self.items.length; j < len; j++) {
  68. // self.items[j].element.style.position = "absolute";
  69. // self.items[j].element.style.zIndex = j + 1;
  70. // }
  71. // self.up = setInterval(function() {
  72. // self.update(self);
  73. // }, 30);
  74. // }
  75. // //实例
  76. // TagCloud.boxs = []; //实例元素数组
  77. // // 静态方法们
  78. // TagCloud._set = function (element) {
  79. // if (TagCloud.boxs.indexOf(element) == -1) {//ie8不支持数组的indexOf方法
  80. // return true;
  81. // }
  82. // };
  83. // //添加数组IndexOf方法
  84. // if (!Array.prototype.indexOf){
  85. // Array.prototype.indexOf = function(elt /*, from*/){
  86. // var len = this.length >>> 0;
  87. // var from = Number(arguments[1]) || 0;
  88. // from = (from < 0)
  89. // ? Math.ceil(from)
  90. // : Math.floor(from);
  91. // if (from < 0)
  92. // from += len;
  93. // for (; from < len; from++){
  94. // if (from in this && this[from] === elt)
  95. // return from;
  96. // }
  97. // return -1;
  98. // };
  99. // }
  100. // TagCloud._getConfig = function (config) {
  101. // var defaultConfig = { //默认值
  102. // fontsize: 16, //基本字体大小, 单位px
  103. // radius: 60, //滚动半径, 单位px
  104. // mspeed: "normal", //滚动最大速度, 取值: slow, normal(默认), fast
  105. // ispeed: "normal", //滚动初速度, 取值: slow, normal(默认), fast
  106. // direction: 135, //初始滚动方向, 取值角度(顺时针360): 0对应top, 90对应left, 135对应right-bottom(默认)...
  107. // keep: true //鼠标移出组件后是否继续随鼠标滚动, 取值: false, true(默认) 对应 减速至初速度滚动, 随鼠标滚动
  108. // };
  109. // if(isObject(config)) {
  110. // for(var i in config) {
  111. // if(config.hasOwnProperty(i)) {//hasOwnProperty()用来判断一个属性是定义在对象本身而不是继承自原型链
  112. // defaultConfig[i] = config[i]; //用户配置
  113. // }
  114. // }
  115. // }
  116. // return defaultConfig;// 配置 Merge
  117. // };
  118. // TagCloud._getMsSpeed = function (mspeed) { //滚动最大速度
  119. // var speedMap = {
  120. // slow: 1.5,
  121. // normal: 3,
  122. // fast: 5
  123. // };
  124. // return speedMap[mspeed] || 3;
  125. // };
  126. // TagCloud._getIsSpeed = function (ispeed) { //滚动初速度
  127. // var speedMap = {
  128. // slow: 10,
  129. // normal: 25,
  130. // fast: 50
  131. // };
  132. // return speedMap[ispeed] || 25;
  133. // };
  134. // TagCloud._getSc = function(a, b) {
  135. // var l = Math.PI / 180;
  136. // //数组顺序0,1,2,3表示asin,acos,bsin,bcos
  137. // return [
  138. // Math.sin(a * l),
  139. // Math.cos(a * l),
  140. // Math.sin(b * l),
  141. // Math.cos(b * l)
  142. // ];
  143. // };
  144. // TagCloud._on = function (ele, eve, handler, cap) {
  145. // if (ele.addEventListener) {
  146. // ele.addEventListener(eve, handler, cap);
  147. // } else if (ele.attachEvent) {
  148. // ele.attachEvent('on' + eve, handler);
  149. // } else {
  150. // ele['on' + eve] = handler;
  151. // }
  152. // };
  153. // // 原型方法
  154. // TagCloud.prototype = {
  155. // constructor: TagCloud, // 反向引用构造器
  156. // update: function () {
  157. // var self = this, a, b;
  158. // if (!self.active && !self.keep) {
  159. // self.mouseX = Math.abs(self.mouseX - self.mouseX0) < 1 ? self.mouseX0 : (self.mouseX + self.mouseX0) / 2; //重置鼠标与滚动圆心x轴距离
  160. // self.mouseY = Math.abs(self.mouseY - self.mouseY0) < 1 ? self.mouseY0 : (self.mouseY + self.mouseY0) / 2; //重置鼠标与滚动圆心y轴距离
  161. // }
  162. // a = -(Math.min(Math.max(-self.mouseY, -self.size), self.size) / self.radius ) * self.mspeed;
  163. // b = (Math.min(Math.max(-self.mouseX, -self.size), self.size) / self.radius ) * self.mspeed;
  164. // if (Math.abs(a) <= 0.01 && Math.abs(b) <= 0.01) { return; }
  165. // self.lasta = a;
  166. // self.lastb = b;
  167. // var sc = TagCloud._getSc(a, b);
  168. // for (var j = 0, len = self.items.length; j < len; j++) {
  169. // var rx1 = self.items[j].x,
  170. // ry1 = self.items[j].y*sc[1] + self.items[j].z*(-sc[0]),
  171. // rz1 = self.items[j].y*sc[0] + self.items[j].z*sc[1];
  172. // var rx2 = rx1 * sc[3] + rz1 * sc[2],
  173. // ry2 = ry1,
  174. // rz2 = rz1 * sc[3] - rx1 * sc[2];
  175. // if(self.index==j){
  176. // self.items[j].scale = 1; //取值范围0.6 ~ 3
  177. // self.items[j].fontsize = 16;
  178. // self.items[j].alpha = 1;
  179. // self.items[j].element.style.zIndex = 99;
  180. // }else{
  181. // var per = self.depth / (self.depth + rz2);
  182. // self.items[j].x = rx2;
  183. // self.items[j].y = ry2;
  184. // self.items[j].z = rz2;
  185. // self.items[j].scale = per; //取值范围0.6 ~ 3
  186. // self.items[j].fontsize = Math.ceil(per * 2) + self.fontsize - 6;
  187. // self.items[j].alpha = 1.5 * per - 0.5;
  188. // self.items[j].element.style.zIndex = Math.ceil(per*10-5);
  189. // }
  190. // self.items[j].element.style.fontSize = self.items[j].fontsize + "px";
  191. // // self.items[j].element.style.left = self.items[j].x + (self.box.offsetWidth - self.items[j].offsetWidth) / 2 + "px";
  192. // self.items[j].element.style.left = self.items[j].x / 1.2+self.box.offsetWidth/2.3-40 + "px";
  193. // // self.items[j].element.style.top = self.items[j].y + (self.box.offsetHeight - self.items[j].offsetHeight) / 2 + "px";
  194. // // self.items[j].element.style.top = self.items[j].y + (self.box.offsetWidth - self.items[j].offsetWidth )/ 3.4+ "px";
  195. // self.items[j].element.style.top = self.items[j].y/ 1.2+self.box.offsetWidth/3+20+ "px";
  196. // self.items[j].element.style.filter = "alpha(opacity=" + 100 * self.items[j].alpha + ")";
  197. // self.items[j].element.style.opacity = self.items[j].alpha;
  198. // }
  199. // },
  200. // _getItems: function () {
  201. // var self = this,
  202. // items = [],
  203. // element = self.box.children, // children 全部是Element
  204. // length = element.length,
  205. // item;
  206. // for (var i = 0; i < length; i++) {
  207. // item = {};
  208. // item.angle = {};
  209. // item.angle.phi = Math.acos(-1 + (2 * i + 1) / length);
  210. // item.angle.theta = Math.sqrt((length + 1) * Math.PI) * item.angle.phi;
  211. // item.element = element[i];
  212. // item.offsetWidth = item.element.offsetWidth;
  213. // item.offsetHeight = item.element.offsetHeight;
  214. // item.x = self.radius * 1.5 * Math.cos(item.angle.theta) * Math.sin(item.angle.phi);
  215. // item.y = self.radius * 1.5 * Math.sin(item.angle.theta) * Math.sin(item.angle.phi);
  216. // item.z = self.radius * 1.5 * Math.cos(item.angle.phi);
  217. // item.element.style.left = item.x + (self.box.offsetWidth - item.offsetWidth) / 2 + "px";
  218. // item.element.style.top = item.y + (self.box.offsetHeight - item.offsetHeight) / 2 + "px";
  219. // items.push(item);
  220. // }
  221. // return items; //单元素数组
  222. // }
  223. // };
  224. // if (!doc.querySelectorAll) {//ie7不支持querySelectorAll,所以要重新定义
  225. // doc.querySelectorAll = function (selectors) {
  226. // var style = doc.createElement('style'), elements = [], element;
  227. // doc.documentElement.firstChild.appendChild(style);
  228. // doc._qsa = [];
  229. // style.styleSheet.cssText = selectors + '{x-qsa:expression(document._qsa && document._qsa.push(this))}';
  230. // window.scrollBy(0, 0);
  231. // style.parentNode.removeChild(style);
  232. // while (doc._qsa.length) {
  233. // element = doc._qsa.shift();
  234. // element.style.removeAttribute('x-qsa');
  235. // elements.push(element);
  236. // }
  237. // doc._qsa = null;
  238. // return elements;
  239. // };
  240. // }
  241. // return function (options) { // factory
  242. // options = options || {}; // 短路语法
  243. // var selector = options.selector || '.tagcloud', //默认选择class为tagcloud的元素
  244. // elements = doc.querySelectorAll(selector),
  245. // instance = [];
  246. // for (var index = 0, len = elements.length; index < len; index++) {
  247. // options.element = elements[index];
  248. // // if (!!TagCloud._set(options.element)) {
  249. // instance.push(new TagCloud(options));
  250. // // }
  251. // }
  252. // console.log(instance);
  253. // return instance;
  254. // };
  255. // })(window, document);