首页 > 语言 > JavaScript > 正文

JavaScript实现模仿桌面窗口的方法

2024-05-06 16:23:24
字体:
来源:转载
供稿:网友

这篇文章主要介绍了JavaScript实现模仿桌面窗口的方法,可实现模仿桌面窗口的打开、关闭、移动、缩放及最大化、最小化等功能,需要的朋友可以参考下

本文实例讲述了JavaScript实现模仿桌面窗口的方法。分享给大家供大家参考。具体如下:

这里使用JS模仿了桌面窗口的移动、八个方向的缩放、最小化、最大化和关闭,以及 双击缩小放大窗口、改变窗口大小的预览效果等功能。

 

 
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
  3. <html xmlns="http://www.w3.org/1999/xhtml"
  4. <head> 
  5. <title>JS山寨桌面窗口</title> 
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
  7. <style type="text/css" media="screen"
  8. html, body, div { 
  9. margin: 0; 
  10. padding: 0; 
  11. }  
  12. html, body { 
  13. background: #FFFFFF; 
  14. width: 100%; 
  15. height: 100%; 
  16. overflow: hidden; 
  17. #box { 
  18. position: absolute; 
  19. top: 30%; 
  20. left: 40%; 
  21. width: 250px; 
  22. height: 150px; 
  23. background: #EEE; 
  24. border: 1px solid #666; 
  25. border-radius: 8px; 
  26. box-shadow: 2px 2px 5px #777; 
  27. /*标题栏*/ 
  28. #boxHeader { 
  29. width: 100%; 
  30. height: 30px; 
  31. background: none!important; 
  32. background: #EEE; 
  33. border-bottom: 2px solid #AAA; 
  34. border-radius: 5px 5px 0 0; 
  35. #button { 
  36. float: right; 
  37. width: 79px; 
  38. height: 15px; 
  39. margin: 5px 5px 0 0!important; 
  40. margin: 5px 2px 0 0; 
  41. background: #CCC; 
  42. border-radius: 5px; 
  43. #button div { 
  44. float: left; 
  45. width: 25px; 
  46. height: 15px; 
  47. border-right: 2px #AAA solid; 
  48. #button .close { 
  49. border: none; 
  50. border-radius: 0px 5px 5px 0; 
  51. #button .minimize { 
  52. border-radius: 5px 0 0 5px; 
  53. /*八个方向*/ 
  54. /*用于显示变栏颜色,作为测试 
  55. #boxN, #boxE, #boxS, #boxW { 
  56. background: red; 
  57. } 
  58. #boxNE, #boxES, #boxSW, #boxWN { 
  59. background: green; 
  60. } 
  61. */ 
  62. #boxN{ 
  63. position: absolute; 
  64. top: 0; 
  65. left: 0; 
  66. width: 100%; 
  67. height: 5px; 
  68. overflow: hidden; 
  69. #boxE{ 
  70. position: absolute; 
  71. top: 0; 
  72. right: 0; 
  73. width: 5px; 
  74. height: 100%; 
  75. overflow: hidden; 
  76. #boxS{ 
  77. position: absolute; 
  78. bottom: 0; 
  79. left: 0; 
  80. width: 100%; 
  81. height: 5px; 
  82. overflow: hidden; 
  83. #boxW{ 
  84. position: absolute; 
  85. top: 0; 
  86. left: 0; 
  87. width: 5px; 
  88. height: 100%; 
  89. overflow: hidden; 
  90. #boxNE { 
  91. position: absolute; 
  92. right: 0; 
  93. top: 0; 
  94. width: 5px; 
  95. height: 5px; 
  96. overflow: hidden; 
  97. #boxES { 
  98. position: absolute; 
  99. right: 0; 
  100. bottom: 0; 
  101. width: 5px; 
  102. height: 5px; 
  103. overflow: hidden; 
  104. #boxSW { 
  105. position: absolute; 
  106. left: 0; 
  107. bottom: 0; 
  108. width: 5px; 
  109. height: 5px; 
  110. overflow: hidden; 
  111. #boxWN { 
  112. position: absolute; 
  113. left: 0; 
  114. top: 0; 
  115. width: 5px; 
  116. height: 5px; 
  117. overflow: hidden; 
  118. /*显示按钮*/ 
  119. #showButton { 
  120. display: none; 
  121. position: absolute; 
  122. top: 50%; 
  123. left: 50%; 
  124. margin: -75px 0 0 -75px;  
  125. width: 150px; 
  126. height: 150px; 
  127. #showButton span { 
  128. font: 50px bolder; 
  129. /*改变大小时的预览DIV*/ 
  130. #virtualBox { 
  131. position: absolute; 
  132. background: #8EC6FF; 
  133. border: 1px solid #147AFF; 
  134. border-radius: 8px; 
  135. opacity: 0.4; 
  136. filter: alpha(opacity = 40); 
  137. </style> 
  138. <script type="text/javascript"
  139. //拖扯box函数 
  140. var dragDiv = function() { 
  141. var box = document.getElementById("box"); 
  142. var boxHeader = document.getElementById("boxHeader"); 
  143. var bDraging = false
  144. var disX = disY = 0; 
  145. //记录鼠标按下时距离box左、上边框距离 
  146. boxHeader.onmousedown = function(event) { 
  147. bDraging = true
  148. document.body.style.cursor = "move"
  149. var event = event || window.event; 
  150. disX = event.clientX - box.offsetLeft; 
  151. disY = event.clientY - box.offsetTop; 
  152. //拖动box 
  153. document.onmousemove = function(event) { 
  154. if(!bDraging) return false
  155. document.body.style.cursor = "move"
  156. var event = event || window.event; 
  157. var boxX = event.clientX - disX; 
  158. var boxY = event.clientY - disY; 
  159. var maxX = document.body.scrollWidth - box.offsetWidth; 
  160. var maxY = document.body.offsetHeight - box.offsetHeight; 
  161. boxX = (boxX < 0) ? 0 : boxX; 
  162. boxY = (boxY < 0) ? 0 : boxY; 
  163. boxX = (boxX > maxX) ? maxX : boxX; 
  164. boxY = (boxY > maxY) ? maxY : boxY; 
  165. box.style.left = boxX + "px"
  166. box.style.top = boxY + "px"
  167. }; 
  168. document.onmouseup = function() { 
  169. bDraging = false
  170. document.body.style.cursor = ""
  171. }; 
  172. return false
  173. }; 
  174. }; 
  175. var changeSize = function() { 
  176. var box = document.getElementById("box"); 
  177. var virtualBox = document.getElementById("virtualBox"); 
  178. var boxSide = document.getElementById("boxSide").getElementsByTagName("div"); 
  179. var bSizeChanging = bMousedowning = false
  180. //box是否正在改变 & 鼠标是否正在按下 
  181. var originalWidth = box.offsetWidth; 
  182. //box最原始宽度 
  183. var originalHeight = box.offsetHeight; 
  184. //box最原始高度 
  185. for(var i = 0; i < boxSide.length; i++) { 
  186. //遍历boxside,监听鼠标 
  187. boxSide[i].index = i; 
  188. boxSide[i].onmouseover = function() { 
  189. if(bMousedowning) return false
  190. changeCursor(truethis.index); 
  191. }; 
  192. boxSide[i].onmouseout = function() { 
  193. if(bMousedowning) return false
  194. changeCursor(falsethis.index); 
  195. }; 
  196. boxSide[i].onmousedown = function(event) { 
  197. var event = event || window.event;  
  198. var index = this.index; 
  199. var aBoxPrevious = new Array(); 
  200. //记录box上一次的状态 
  201. aBoxPrevious["clientX"] = event.clientX; 
  202. aBoxPrevious["clientY"] = event.clientY; 
  203. aBoxPrevious["left"] = box.offsetLeft; 
  204. aBoxPrevious["top"]= box.offsetTop; 
  205. aBoxPrevious["width"] = box.offsetWidth; 
  206. aBoxPrevious["height"] = box.offsetHeight; 
  207. bMousedowning = true
  208. bSizeChanging = true
  209. showVirtualBox(virtualBox, aBoxPrevious); 
  210. document.onmousemove = function(event) { 
  211. if(!bSizeChanging) return false
  212. changeVirtualBoxSize(event, aBoxPrevious, index); 
  213. }; 
  214. document.onmouseup = function() { 
  215. changeBoxSize(virtualBox) 
  216. hideVirtualBox(virtualBox); 
  217. bSizeChanging = false
  218. bMousedowning = false
  219. changeCursor(false, index); 
  220. }; 
  221. return false
  222. }; 
  223. //改变鼠标指针样式 
  224. var changeCursor = function(bIsShowing, index) { 
  225. if(bIsShowing) { 
  226. var cursorStyle = ["n-resize","e-resize","s-resize","w-resize","ne-resize","se-resize","sw-resize","nw-resize"]; 
  227. document.body.style.cursor = cursorStyle[index]; 
  228. else { 
  229. document.body.style.cursor = ""
  230. }; 
  231. //显示预览DIV 
  232. var showVirtualBox = function(virtualBox, aBoxPrevious) { 
  233. with(virtualBox.style) { 
  234. display = "block"
  235. top = aBoxPrevious["top"] + "px"
  236. left = aBoxPrevious["left"] + "px"
  237. width = aBoxPrevious["width"] + "px"
  238. height = aBoxPrevious["height"] + "px"
  239. //隐藏预览DIV 
  240. var hideVirtualBox = function(virtualBox) { 
  241. virtualBox.style.display = "none"
  242. //改变box大小 
  243. var changeVirtualBoxSize = function(event, aBoxPrevious, index) { 
  244. var event = event || window.event; 
  245. var bTop = bRight = bBottom = bLeft = false
  246. //八个方向,分别为N、E、S、W、NE、SW、SW、NW 
  247. switch (index) { 
  248. case 0: 
  249. bTop = true
  250. break
  251. case 1: 
  252. bRight = true
  253. break
  254. case 2: 
  255. bBottom = true
  256. break
  257. case 3: 
  258. bLeft = true
  259. break
  260. case 4: 
  261. bTop = bRight = true;; 
  262. break
  263. case 5: 
  264. bRight = bBottom = true
  265. break
  266. case 6: 
  267. bBottom = bLeft = true
  268. break
  269. case 7: 
  270. bLeft = bTop = true
  271. break
  272. default
  273. break
  274. //向北改变高度 
  275. if(bTop) { 
  276. var newTopHeight = aBoxPrevious["height"] - (event.clientY - aBoxPrevious["clientY"]); 
  277. (newTopHeight < originalHeight) && (newTopHeight = originalHeight); 
  278. (newTopHeight > aBoxPrevious["top"] + aBoxPrevious["height"]) && (newTopHeight = aBoxPrevious["top"] + aBoxPrevious["height"]); 
  279. var newTop = aBoxPrevious["top"] + (event.clientY - aBoxPrevious["clientY"]); 
  280. (newTop > aBoxPrevious["top"] + aBoxPrevious["height"] - originalHeight) && (newTop = aBoxPrevious["top"] + aBoxPrevious["height"] - originalHeight); 
  281. (newTop < 0) && (newTop = 0); 
  282. virtualBox.style.top = newTop + "px"
  283. virtualBox.style.height = newTopHeight - box.clientTop * 2 + "px";  
  284. //不能忽略border-width 
  285. bTop = false
  286. //向东改变宽度 
  287. if(bRight) { 
  288. var newRightWidth = aBoxPrevious["width"] + (event.clientX - aBoxPrevious["clientX"]); 
  289. (newRightWidth < originalWidth) && (newRightWidth = originalWidth); 
  290. (newRightWidth > document.body.scrollWidth - aBoxPrevious["left"]) && (newRightWidth = document.body.scrollWidth - aBoxPrevious["left"]); 
  291. virtualBox.style.width = newRightWidth - box.clientTop * 2 + "px"
  292. bRight = false
  293. //向南改变高度 
  294. if(bBottom) { 
  295. var newBottomHeight = aBoxPrevious["height"] + (event.clientY - aBoxPrevious["clientY"]); 
  296. (newBottomHeight < originalHeight) && (newBottomHeight = originalHeight); 
  297. (newBottomHeight > document.body.scrollHeight - aBoxPrevious["top"]) && (newBottomHeight = document.body.scrollHeight - aBoxPrevious["top"]); 
  298. virtualBox.style.height = newBottomHeight - box.clientTop * 2 + "px"
  299. bBottom = false
  300. //向西改变宽度 
  301. if(bLeft) { 
  302. var newLeftWidth = aBoxPrevious["width"] - (event.clientX - aBoxPrevious["clientX"]); 
  303. (newLeftWidth < originalWidth) && (newLeftWidth = originalWidth); 
  304. (newLeftWidth > aBoxPrevious["left"] + aBoxPrevious["width"]) && (newLeftWidth = aBoxPrevious["left"] + aBoxPrevious["width"]); 
  305. var newLeft = aBoxPrevious["left"] + (event.clientX - aBoxPrevious["clientX"]); 
  306. (newLeft > aBoxPrevious["left"] + aBoxPrevious["width"] - originalWidth) && (newLeft = aBoxPrevious["left"] + aBoxPrevious["width"] - originalWidth); 
  307. (newLeft < 0) && (newLeft = 0); 
  308. virtualBox.style.left = newLeft + "px"
  309. virtualBox.style.width = newLeftWidth - box.clientLeft * 2 + "px"
  310. bLeft = false
  311. }; 
  312. var changeBoxSize = function(virtualBox) { 
  313. with(box.style) { 
  314. left = virtualBox.style.left; 
  315. top = virtualBox.style.top; 
  316. width = virtualBox.style.width; 
  317. height = virtualBox.style.height; 
  318. }; 
  319. //窗口按钮函数 
  320. boxButton = function() { 
  321. var box = document.getElementById("box"); 
  322. var boxHeader = document.getElementById("boxHeader"); 
  323. var aButton = document.getElementById("button").getElementsByTagName("div"); 
  324. var showButton = document.getElementById("showButton"); 
  325. var span = showButton.getElementsByTagName("span")[0]; 
  326. var bIsMin = bIsMax = false
  327. //目前状态是否最小 or 最大 
  328. boxHeader.ondblclick = function() { 
  329. maximize(); 
  330. for(var i = 0; i < aButton.length; i++) { 
  331. aButton[i].index = i; 
  332. aButton[i].onmouseover = function() { 
  333. aButton[this.index].style.background = "#AAA"
  334. document.body.style.cursor = "pointer"
  335. }; 
  336. aButton[i].onmouseout = function() { 
  337. aButton[this.index].style.background = ""
  338. document.body.style.cursor = "" 
  339. }; 
  340. aButton[i].onclick = function() { 
  341. switch(this.index) { 
  342. case 0: 
  343. minimize(); 
  344. break
  345. case 1: 
  346. maximize(); 
  347. break
  348. case 2: 
  349. close(); 
  350. break
  351. default
  352. break
  353. }; 
  354. var minimize = function() { 
  355. if(bIsMin) { 
  356. resumeBox(); 
  357. bIsMin = false
  358. else { 
  359. box.style.width = "89px"
  360. box.style.height = "32px"
  361. box.style.left = "2%"
  362. box.style.top = document.body.offsetHeight - box.offsetHeight - 15 + "px"
  363. bIsMin = true
  364. bIsMax = false
  365. }; 
  366. var maximize = function() { 
  367. if(bIsMax) { 
  368. resumeBox(); 
  369. bIsMax = false
  370. else { 
  371. box.style.width = document.body.scrollWidth - 10 + "px"
  372. box.style.height = document.body.scrollHeight - 10 + "px"
  373. box.style.left = "5px"
  374. box.style.top = "5px"
  375. bIsMax = true
  376. bIsMin = false
  377. }; 
  378. var close = function() { 
  379. box.style.display = "none"
  380. showButton.style.display = "block"
  381. }; 
  382. var resumeBox = function() { 
  383. box.style.top = "30%"
  384. box.style.left = "40%"
  385. box.style.width = "250px"
  386. box.style.height = "150px"
  387. }; 
  388. showButton.onmousedown = function() { 
  389. span.innerHTML = "^o^"
  390. }; 
  391. showButton.onclick = function() { 
  392. this.style.display = "none"
  393. span.innerHTML = ">_<"
  394. resumeBox(); 
  395. box.style.display = "block"
  396. }; 
  397. }; 
  398. window.onload = function() { 
  399. changeSize(); 
  400. dragDiv(); 
  401. boxButton(); 
  402. }; 
  403. </script> 
  404. </head> 
  405. <body> 
  406. <div id="box"
  407. <div id="boxHeader"
  408. <div id="button"
  409. <div class="minimize"></div> 
  410. <div class="maximize"></div> 
  411. <div class="close"></div> 
  412. </div> 
  413. </div> 
  414. <div id="boxSide"
  415. <div id="boxN"></div> 
  416. <div id="boxE"></div> 
  417. <div id="boxS"></div> 
  418. <div id="boxW"></div> 
  419. <div id="boxNE"></div> 
  420. <div id="boxES"></div> 
  421. <div id="boxSW"></div> 
  422. <div id="boxWN"></div> 
  423. </div> 
  424. </div> 
  425. <button id="showButton"><span>>_<</span><p>居然关掉人家,讨厌~</p><p>快打开</p></button> 
  426. <div id="virtualBox"></div> 
  427. </body> 
  428. </html> 

希望本文所述对大家的javascript程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选