rounded.js
上传用户:kimgenplus
上传日期:2016-06-05
资源大小:20877k
文件大小:16k
源码类别:

OA系统

开发平台:

Java

  1. /*
  2. Copyright (c) 2004-2006, The Dojo Foundation
  3. All Rights Reserved.
  4. Licensed under the Academic Free License version 2.1 or above OR the
  5. modified BSD license. For more information on Dojo licensing, see:
  6. http://dojotoolkit.org/community/licensing.shtml
  7. */
  8. dojo.provide("dojo.lfx.rounded");
  9. dojo.require("dojo.lang.common");
  10. dojo.require("dojo.html.common");
  11. dojo.require("dojo.html.style");
  12. dojo.require("dojo.html.display");
  13. dojo.require("dojo.html.layout");
  14. dojo.lfx.rounded = function (settings) {
  15. var options = {validTags:settings.validTags || ["div"], autoPad:settings.autoPad != null ? settings.autoPad : true, antiAlias:settings.antiAlias != null ? settings.antiAlias : true, radii:{tl:(settings.tl && settings.tl.radius != null) ? settings.tl.radius : 5, tr:(settings.tr && settings.tr.radius != null) ? settings.tr.radius : 5, bl:(settings.bl && settings.bl.radius != null) ? settings.bl.radius : 5, br:(settings.br && settings.br.radius != null) ? settings.br.radius : 5}};
  16. var nodes;
  17. if (typeof (arguments[1]) == "string") {
  18. nodes = dojo.html.getElementsByClass(arguments[1]);
  19. } else {
  20. if (dojo.lang.isArrayLike(arguments[1])) {
  21. nodes = arguments[1];
  22. for (var i = 0; i < nodes.length; i++) {
  23. nodes[i] = dojo.byId(nodes[i]);
  24. }
  25. }
  26. }
  27. if (nodes.length == 0) {
  28. return;
  29. }
  30. for (var i = 0; i < nodes.length; i++) {
  31. dojo.lfx.rounded.applyCorners(options, nodes[i]);
  32. }
  33. };
  34. dojo.lfx.rounded.applyCorners = function (options, node) {
  35. var top = null;
  36. var bottom = null;
  37. var contentNode = null;
  38. var fns = dojo.lfx.rounded._fns;
  39. var width = node.offsetWidth;
  40. var height = node.offsetHeight;
  41. var borderWidth = parseInt(dojo.html.getComputedStyle(node, "border-top-width"));
  42. var borderColor = dojo.html.getComputedStyle(node, "border-top-color");
  43. var color = dojo.html.getComputedStyle(node, "background-color");
  44. var bgImage = dojo.html.getComputedStyle(node, "background-image");
  45. var position = dojo.html.getComputedStyle(node, "position");
  46. var padding = parseInt(dojo.html.getComputedStyle(node, "padding-top"));
  47. var format = {height:height, width:width, borderWidth:borderWidth, color:fns.getRGB(color), padding:padding, borderColor:fns.getRGB(borderColor), borderString:borderWidth + "px" + " solid " + fns.getRGB(borderColor), bgImage:((bgImage != "none") ? bgImage : ""), content:node.innerHTML};
  48. if (!dojo.html.isPositionAbsolute(node)) {
  49. node.style.position = "relative";
  50. }
  51. node.style.padding = "0px";
  52. if (dojo.render.html.ie && width == "auto" && height == "auto") {
  53. node.style.width = "100%";
  54. }
  55. if (options.autoPad && format.padding > 0) {
  56. node.innerHTML = "";
  57. }
  58. var topHeight = Math.max(options.radii.tl, options.radii.tr);
  59. var bottomHeight = Math.max(options.radii.bl, options.radii.br);
  60. if (options.radii.tl || options.radii.tr) {
  61. top = document.createElement("div");
  62. top.style.width = "100%";
  63. top.style.fontSize = "1px";
  64. top.style.overflow = "hidden";
  65. top.style.position = "absolute";
  66. top.style.paddingLeft = format.borderWidth + "px";
  67. top.style.paddingRight = format.borderWidth + "px";
  68. top.style.height = topHeight + "px";
  69. top.style.top = (0 - topHeight) + "px";
  70. top.style.left = (0 - format.borderWidth) + "px";
  71. node.appendChild(top);
  72. }
  73. if (options.radii.bl || options.radii.br) {
  74. bottom = document.createElement("div");
  75. bottom.style.width = "100%";
  76. bottom.style.fontSize = "1px";
  77. bottom.style.overflow = "hidden";
  78. bottom.style.position = "absolute";
  79. bottom.style.paddingLeft = format.borderWidth + "px";
  80. bottom.style.paddingRight = format.borderWidth + "px";
  81. bottom.style.height = bottomHeight + "px";
  82. bottom.style.bottom = (0 - bottomHeight) + "px";
  83. bottom.style.left = (0 - format.borderWidth) + "px";
  84. node.appendChild(bottom);
  85. }
  86. if (top) {
  87. node.style.borderTopWidth = "0px";
  88. }
  89. if (bottom) {
  90. node.style.borderBottomWidth = "0px";
  91. }
  92. var corners = ["tr", "tl", "br", "bl"];
  93. for (var i = 0; i < corners.length; i++) {
  94. var cc = corners[i];
  95. if (options.radii[cc] == 0) {
  96. if ((cc.charAt(0) == "t" && top) || (cc.charAt(0) == "b" && bottom)) {
  97. var corner = document.createElement("div");
  98. corner.style.position = "relative";
  99. corner.style.fontSize = "1px;";
  100. corner.style.overflow = "hidden";
  101. if (format.bgImage == "") {
  102. corner.style.backgroundColor = format.color;
  103. } else {
  104. corner.style.backgroundImage = format.bgImage;
  105. }
  106. switch (cc) {
  107.   case "tl":
  108. corner.style.height = topHeight - format.borderWidth + "px";
  109. corner.style.marginRight = options.radii[cc] - (format.borderWidth * 2) + "px";
  110. corner.style.borderLeft = format.borderString;
  111. corner.style.borderTop = format.borderString;
  112. corner.style.left = -format.borderWidth + "px";
  113. break;
  114.   case "tr":
  115. corner.style.height = topHeight - format.borderWidth + "px";
  116. corner.style.marginLeft = options.radii[cc] - (format.borderWidth * 2) + "px";
  117. corner.style.borderRight = format.borderString;
  118. corner.style.borderTop = format.borderString;
  119. corner.style.backgroundPosition = "-" + (topHeight - format.borderWidth) + "px 0px";
  120. corner.style.left = format.borderWidth + "px";
  121. break;
  122.   case "bl":
  123. corner.style.height = bottomHeight - format.borderWidth + "px";
  124. corner.style.marginRight = options.radii[cc] - (format.borderWidth * 2) + "px";
  125. corner.style.borderLeft = format.borderString;
  126. corner.style.borderBottom = format.borderString;
  127. corner.style.left = format.borderWidth + "px";
  128. corner.style.backgroundPosition = "-" + format.borderWidth + "px -" + (format.height + (bottomHeight + format.borderWidth)) + "px";
  129. break;
  130.   case "br":
  131. corner.style.height = bottomHeight - format.borderWidth + "px";
  132. corner.style.marginLeft = options.radii[cc] - (format.borderWidth * 2) + "px";
  133. corner.style.borderRight = format.borderString;
  134. corner.style.borderBottom = format.borderString;
  135. corner.style.left = format.borderWidth + "px";
  136. corner.style.backgroundPosition = "-" + (bottomHeight + format.borderWidth) + "px -" + (format.height + (bottomHeight + format.borderWidth)) + "px";
  137. break;
  138. }
  139. }
  140. } else {
  141. var corner = document.createElement("div");
  142. corner.style.height = options.radii[cc] + "px";
  143. corner.style.width = options.radii[cc] + "px";
  144. corner.style.position = "absolute";
  145. corner.style.fontSize = "1px";
  146. corner.style.overflow = "hidden";
  147. var borderRadius = Math.floor(options.radii[cc] - format.borderWidth);
  148. for (var x = 0, j = options.radii[cc]; x < j; x++) {
  149. var y1 = Math.floor(Math.sqrt(Math.pow(borderRadius, 2) - Math.pow((x + 1), 2))) - 1;
  150. if ((x + 1) >= borderRadius) {
  151. var y1 = -1;
  152. }
  153. var y2 = Math.ceil(Math.sqrt(Math.pow(borderRadius, 2) - Math.pow(x, 2)));
  154. if (x >= borderRadius) {
  155. y2 = -1;
  156. }
  157. var y3 = Math.floor(Math.sqrt(Math.pow(j, 2) - Math.pow((x + 1), 2))) - 1;
  158. if ((x + 1) >= j) {
  159. y3 = -1;
  160. }
  161. var y4 = Math.ceil(Math.sqrt(Math.pow(j, 2) - Math.pow(x, 2)));
  162. if (x >= j) {
  163. y4 = -1;
  164. }
  165. if (y1 > -1) {
  166. fns.draw(x, 0, format.color, 100, (y1 + 1), corner, -1, j, topHeight, format);
  167. }
  168. for (var y = (y1 + 1); y < y2; y++) {
  169. if (options.antiAlias) {
  170. if (format.bgImage != "") {
  171. var fract = fns.fraction(x, y, borderRadius) * 100;
  172. if (fract < 30) {
  173. fns.draw(x, y, format.borderColor, 100, 1, corner, 0, options.radii[cc], topHeight, format);
  174. } else {
  175. fns.draw(x, y, format.borderColor, 100, 1, corner, -1, options.radii[cc], topHeight, format);
  176. }
  177. } else {
  178. var clr = fns.blend(format.color, format.borderColor, fns.fraction(x, y, borderRadius));
  179. fns.draw(x, y, clr, 100, 1, corner, 0, options.radii[cc], topHeight, format);
  180. }
  181. }
  182. }
  183. if (options.antiAlias) {
  184. if (y3 >= y2) {
  185. if (y2 == -1) {
  186. y2 = 0;
  187. }
  188. fns.draw(x, y2, format.borderColor, 100, (y3 - y2 + 1), corner, 0, 0, topHeight, format);
  189. } else {
  190. if (y3 >= y1) {
  191. fns.draw(x, (y1 + 1), format.borderColor, 100, (y3 - y1), corner, 0, 0, topHeight, format);
  192. }
  193. }
  194. for (var y = (y3 + 1); y < y4; y++) {
  195. fns.draw(x, y, format.borderColor, (fns.fraction(x, y, j) * 100), 1, corner, (format.borderWidth > 0 ? 0 : -1), options.radii[cc], topHeight, format);
  196. }
  197. } else {
  198. y3 = y1;
  199. }
  200. }
  201. if (cc != "br") {
  202. for (var t = 0, k = corner.childNodes.length; t < k; t++) {
  203. var bar = corner.childNodes[t];
  204. var barTop = parseInt(dojo.html.getComputedStyle(bar, "top"));
  205. var barLeft = parseInt(dojo.html.getComputedStyle(bar, "left"));
  206. var barHeight = parseInt(dojo.html.getComputedStyle(bar, "height"));
  207. if (cc.charAt(1) == "l") {
  208. bar.style.left = (options.radii[cc] - barLeft - 1) + "px";
  209. }
  210. if (cc == "tr") {
  211. bar.style.top = (options.radii[cc] - barHeight - barTop) + "px";
  212. bar.style.backgroundPosition = "-" + Math.abs((format.width - options.radii[cc] + format.borderWidth) + barLeft) + "px -" + Math.abs(options.radii[cc] - barHeight - barTop - format.borderWidth) + "px";
  213. } else {
  214. if (cc == "tl") {
  215. bar.style.top = (options.radii[cc] - barHeight - barTop) + "px";
  216. bar.style.backgroundPosition = "-" + Math.abs((options.radii[cc] - barLeft - 1) - format.borderWidth) + "px -" + Math.abs(options.radii[cc] - barHeight - barTop - format.borderWidth) + "px";
  217. } else {
  218. bar.style.backgroundPosition = "-" + Math.abs((options.radii[cc] + barLeft) + format.borderWidth) + "px -" + Math.abs((format.height + options.radii[cc] + barTop) - format.borderWidth) + "px";
  219. }
  220. }
  221. }
  222. }
  223. }
  224. if (corner) {
  225. var psn = [];
  226. if (cc.charAt(0) == "t") {
  227. psn.push("top");
  228. } else {
  229. psn.push("bottom");
  230. }
  231. if (cc.charAt(1) == "l") {
  232. psn.push("left");
  233. } else {
  234. psn.push("right");
  235. }
  236. if (corner.style.position == "absolute") {
  237. for (var z = 0; z < psn.length; z++) {
  238. corner.style[psn[z]] = "0px";
  239. }
  240. }
  241. if (psn[0] == "top") {
  242. if (top) {
  243. top.appendChild(corner);
  244. }
  245. } else {
  246. if (bottom) {
  247. bottom.appendChild(corner);
  248. }
  249. }
  250. }
  251. }
  252. var diff = {t:Math.abs(options.radii.tl - options.radii.tr), b:Math.abs(options.radii.bl - options.radii.br)};
  253. for (var z in diff) {
  254. var smaller = (options.radii[z + "l"] < options.radii[z + "r"] ? z + "l" : z + "r");
  255. var filler = document.createElement("div");
  256. filler.style.height = diff[z] + "px";
  257. filler.style.width = options.radii[smaller] + "px";
  258. filler.style.position = "absolute";
  259. filler.style.fontSize = "1px";
  260. filler.style.overflow = "hidden";
  261. filler.style.backgroundColor = format.color;
  262. switch (smaller) {
  263.   case "tl":
  264. filler.style.bottom = "0px";
  265. filler.style.left = "0px";
  266. filler.style.borderLeft = format.borderString;
  267. top.appendChild(filler);
  268. break;
  269.   case "tr":
  270. filler.style.bottom = "0px";
  271. filler.style.right = "0px";
  272. filler.style.borderRight = format.borderString;
  273. top.appendChild(filler);
  274. break;
  275.   case "bl":
  276. filler.style.top = "0px";
  277. filler.style.left = "0px";
  278. filler.style.borderLeft = format.borderString;
  279. bottom.appendChild(filler);
  280. break;
  281.   case "br":
  282. filler.style.top = "0px";
  283. filler.style.right = "0px";
  284. filler.style.borderRight = format.borderString;
  285. bottom.appendChild(filler);
  286. break;
  287. }
  288. var fillBar = document.createElement("div");
  289. fillBar.style.position = "relative";
  290. fillBar.style.fontSize = "1px";
  291. fillBar.style.overflow = "hidden";
  292. fillBar.style.backgroundColor = format.color;
  293. fillBar.style.backgroundImage = format.bgImage;
  294. if (z == "t") {
  295. if (top) {
  296. if (options.radii.tl && options.radii.tr) {
  297. fillBar.style.height = (topHeight - format.borderWidth) + "px";
  298. fillBar.style.marginLeft = (options.radii.tl - format.borderWidth) + "px";
  299. fillBar.style.marginRight = (options.radii.tr - format.borderWidth) + "px";
  300. fillBar.style.borderTop = format.borderString;
  301. if (format.bgImage != "") {
  302. fillBar.style.backgroundPosition = "-" + (topHeight + format.borderWidth) + "px 0px";
  303. }
  304. }
  305. top.appendChild(fillBar);
  306. }
  307. } else {
  308. if (bottom) {
  309. if (options.radii.bl && options.radii.br) {
  310. fillBar.style.height = (bottomHeight - format.borderWidth) + "px";
  311. fillBar.style.marginLeft = (options.radii.bl - format.borderWidth) + "px";
  312. fillBar.style.marginRight = (options.radii.br - format.borderWidth) + "px";
  313. fillBar.style.borderBottom = format.borderString;
  314. if (format.bgImage != "") {
  315. fillBar.style.backgroundPosition = "-" + (bottomHeight + format.borderWidth) + "px -" + (format.height + (topHeight + format.borderWidth)) + "px";
  316. }
  317. }
  318. bottom.appendChild(fillBar);
  319. }
  320. }
  321. }
  322. if (options.autoPad && format.padding > 0) {
  323. var content = document.createElement("div");
  324. content.style.position = "relative";
  325. content.innerHTML = format.content;
  326. content.className = "autoPadDiv";
  327. if (topHeight < format.padding) {
  328. content.style.paddingTop = Math.abs(topHeight - format.padding) + "px";
  329. }
  330. if (bottomHeight < format.padding) {
  331. content.style.paddingBottom = Math.abs(bottomHeight - format.padding) + "px";
  332. }
  333. content.style.paddingLeft = format.padding + "px";
  334. content.style.paddingRight = format.padding + "px";
  335. node.appendChild(content);
  336. }
  337. };
  338. var count = 0;
  339. dojo.lfx.rounded._fns = {blend:function (clr1, clr2, frac) {
  340. var c1 = {r:parseInt(clr1.substr(1, 2), 16), g:parseInt(clr1.substr(3, 2), 16), b:parseInt(clr1.substr(5, 2), 16)};
  341. var c2 = {r:parseInt(clr2.substr(1, 2), 16), g:parseInt(clr2.substr(3, 2), 16), b:parseInt(clr2.substr(5, 2), 16)};
  342. if (frac > 1 || frac < 0) {
  343. frac = 1;
  344. }
  345. var ret = [Math.min(Math.max(Math.round((c1.r * frac) + (c2.r * (1 - frac))), 0), 255), Math.min(Math.max(Math.round((c1.g * frac) + (c2.g * (1 - frac))), 0), 255), Math.min(Math.max(Math.round((c1.b * frac) + (c2.b * (1 - frac))), 0), 255)];
  346. for (var i = 0; i < ret.length; i++) {
  347. var n = ret[i].toString(16);
  348. if (n.length < 2) {
  349. n = "0" + n;
  350. }
  351. ret[i] = n;
  352. }
  353. return "#" + ret.join("");
  354. }, fraction:function (x, y, r) {
  355. var frac = 0;
  356. var xval = [];
  357. var yval = [];
  358. var point = 0;
  359. var whatsides = "";
  360. var intersect = Math.sqrt((Math.pow(r, 2) - Math.pow(x, 2)));
  361. if (intersect >= y && intersect < (y + 1)) {
  362. whatsides = "Left";
  363. xval[point] = 0;
  364. yval[point++] = intersect - y;
  365. }
  366. intersect = Math.sqrt((Math.pow(r, 2) - Math.pow(y + 1, 2)));
  367. if (intersect >= x && intersect < (x + 1)) {
  368. whatsides += "Top";
  369. xval[point] = intersect - x;
  370. yval[point++] = 1;
  371. }
  372. intersect = Math.sqrt((Math.pow(r, 2) - Math.pow(x + 1, 2)));
  373. if (intersect >= y && intersect < (y + 1)) {
  374. whatsides += "Right";
  375. xval[point] = 1;
  376. yval[point++] = intersect - y;
  377. }
  378. intersect = Math.sqrt((Math.pow(r, 2) - Math.pow(y, 2)));
  379. if (intersect >= x && intersect < (x + 1)) {
  380. whatsides += "Bottom";
  381. xval[point] = intersect - x;
  382. yval[point] = 1;
  383. }
  384. switch (whatsides) {
  385.   case "LeftRight":
  386. return Math.min(yval[0], yval[1]) + ((Math.max(yval[0], yval[1]) - Math.min(yval[0], yval[1])) / 2);
  387.   case "TopRight":
  388. return 1 - (((1 - xval[0]) * (1 - yval[1])) / 2);
  389.   case "TopBottom":
  390. return Math.min(xval[0], xval[1]) + ((Math.max(xval[0], xval[1]) - Math.min(xval[0], xval[1])) / 2);
  391.   case "LeftBottom":
  392. return (yval[0] * xval[1]) / 2;
  393.   default:
  394. return 1;
  395. }
  396. }, draw:function (x, y, color, opac, height, corner, image, radius, top, format) {
  397. var px = document.createElement("div");
  398. px.style.height = height + "px";
  399. px.style.width = "1px";
  400. px.style.position = "absolute";
  401. px.style.fontSize = "1px";
  402. px.style.overflow = "hidden";
  403. if (image == -1 && format.bgImage != "") {
  404. px.style.backgroundImage = format.bgImage;
  405. px.style.backgroundPosition = "-" + (format.width - (radius - x) + format.borderWidth) + "px -" + ((format.height + top + y) - format.borderWidth) + "px";
  406. } else {
  407. px.style.backgroundColor = color;
  408. }
  409. if (opac != 100) {
  410. dojo.html.setOpacity(px, (opac / 100));
  411. }
  412. px.style.top = y + "px";
  413. px.style.left = x + "px";
  414. corner.appendChild(px);
  415. }, getRGB:function (clr) {
  416. var ret = "#ffffff";
  417. if (clr != "" && clr != "transparent") {
  418. if (clr.substr(0, 3) == "rgb") {
  419. var t = clr.substring(4, clr.indexOf(")"));
  420. t = t.split(",");
  421. for (var i = 0; i < t.length; i++) {
  422. var n = parseInt(t[i]).toString(16);
  423. if (n.length < 2) {
  424. n = "0" + n;
  425. }
  426. t[i] = n;
  427. }
  428. ret = "#" + t.join("");
  429. } else {
  430. if (clr.length == 4) {
  431. ret = "#" + clr.substring(1, 2) + clr.substring(1, 2) + clr.substring(2, 3) + clr.substring(2, 3) + clr.substring(3, 4) + clr.substring(3, 4);
  432. } else {
  433. ret = clr;
  434. }
  435. }
  436. }
  437. return ret;
  438. }};