首页 > 语言 > JavaScript > 正文

jQuery实现仿Google首页拖动效果的方法

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

这篇文章主要介绍了jQuery实现仿Google首页拖动效果的方法,涉及jQuery操作鼠标事件及div层的相关技巧,非常具有实用价值,需要的朋友可以参考下

本文实例讲述了jQuery实现仿Google首页拖动效果的方法。分享给大家供大家参考。具体如下:

这里用jQuery.js库写了一个仿Google首页拖动的特效代码

 

 
  1. <!DOCTYPE html> 
  2. <html> 
  3. <head> 
  4. <meta http-equiv="content-type" content="text/html; charset=utf-8"/> 
  5. <title>用JQUERY实现的仿Google首页拖动特效</title> 
  6. <style type="text/css"
  7. #div_width{ 
  8. width:98%; 
  9. margin:0 auto; 
  10. *{ 
  11. margin:0px; 
  12. padding:0px; 
  13. #div_left,#div_right,#div_center{ 
  14. float:left; 
  15. width:28%; 
  16. height:900px; 
  17. margin:0 3px; 
  18. #div_center{ 
  19. width:38%; 
  20. .can_move{ 
  21. border:1px solid blue; 
  22. width:100%; 
  23. margin:5px 0; 
  24. min-height:150px; 
  25. .center_width{ 
  26. height:200px; 
  27. p{ 
  28. height:30px; 
  29. color:#fff; 
  30. line-height:30px; 
  31. background:#000; 
  32. cursor:move; 
  33. #xuxian{ /*虚线框*/ 
  34. border:1px dashed #000; 
  35. margin:5px 0; 
  36. </style> 
  37. <script src="js/jquery.js"></script> 
  38. <script> 
  39. //<![CDATA[ 
  40. window.onload=function(){ 
  41. var mouse_down=false//鼠标时候按下 
  42. var x_old=null//按下鼠标时鼠标的坐标 
  43. var y_old=null
  44. var div_move=null//正在移动的div 
  45. var div_move_width=null//正在移动的div的宽 
  46. var div_move_height=null//正在移动的div的高 
  47. var xuxian="<div id='xuxian'></div>"//虚线框 
  48. document.oncontextmenu=new Function('event.returnValue=false;'); 
  49. //禁止右键 
  50. document.onselectstart=new Function('event.returnValue=false;'); 
  51. //禁止选中 
  52. //当鼠标按下的时候 
  53. $("p").mousedown(function(e){ 
  54. mouse_down=true//鼠标按下 
  55. div_move=$(this).parent(); //指定当前div为正在移动的div 
  56. div_move_width=div_move.width(); 
  57. div_move_height=div_move.height(); 
  58. x_old=e.pageX-$(this).offset().left; //获取鼠标坐标 
  59. y_old=e.pageY-$(this).offset().top; 
  60. //把当前div的position改成absolute 
  61. div_move.css({ 
  62. position:'absolute'
  63. zIndex:'10'
  64. width:div_move_width, 
  65. height:div_move_height, 
  66. top:div_move.offset().top, 
  67. left:div_move.offset().left 
  68. }); 
  69. //将虚线框添加到正在移动的div之前的位置 
  70. div_move.before(xuxian); 
  71. $("#xuxian").css({ 
  72. width:'100%'
  73. height:div_move_height 
  74. }); 
  75. }); 
  76. //移动鼠标 
  77. $(document).mousemove(function(e){ 
  78. if(!mouse_down) return false
  79. var _x=e.pageX; 
  80. var _y=e.pageY; 
  81. var div_right_div=$("#div_right>div").not(div_move).not("#xuxian"); 
  82. div_move.css({ //改变正在移动div的top和left 
  83. top:_y-y_old, 
  84. left:_x-x_old 
  85. }); 
  86. /*注意,因为鼠标当前始终在正在移动的div上面, 
  87. 所以,鼠标移动不会触发其他元素的mouseenter,mouseleave,mouseover 
  88. 和mouseout事件,要想达到同样的效果, 
  89. 只能根据鼠标的坐标来判断鼠标是否进入其他元素*/ 
  90. var left_left=$("#div_left").offset().left; 
  91. //确定左边div_left容器的位置 
  92. var left_width=$("#div_left").width(); 
  93. var right_left=$("#div_right").offset().left; 
  94. //确定右边div_right容器的位置 
  95. var right_width=$("#div_right").width(); 
  96. var center_left=$("#div_center").offset().left; 
  97. //确定中间div_center容器的位置 
  98. var center_width=$("#div_center").width(); 
  99. //判断鼠标坐标是否进入左边div_left容器 
  100. if(_x>left_left&&_x<(left_left+left_width)){ 
  101. /*选定左边div_left容器下的最后一个可移动div, 
  102. 不包含当前正在移动的div元素和虚线框*/ 
  103. var div_left_last=$("#div_left>div").not(div_move).not("#xuxian").filter(":last"); 
  104. if(div_left_last.length>=1){ 
  105. //判断时候左边div_left容器下时候有可移动div元素 
  106. if(_y>(div_left_last.offset().top+div_left_last.height())){ 
  107. //判断鼠标是否在左边div_left容器最后一个元素的下边 
  108. $("#xuxian").remove(); //如果是,移除之前添加的虚线框 
  109. div_left_last.after(xuxian); 
  110. //把虚线框添加为左边div_left容器的最后一个子元素 
  111. $("#xuxian").css({ //设定虚线框的高和宽 
  112. width:'100%'
  113. height:div_move_height 
  114. }); 
  115. }else
  116. //如果鼠标不在左边div_left容器最后一个元素的下边, 
  117. //那么,循环判定鼠标是否进入左边div_left容器下的可移动div元素里面 
  118. var div_left_div=$("#div_left>div").not(div_move).not("#xuxian"); 
  119. for(var i=0;i<div_left_div.length;i++){ 
  120. if(_y>div_left_div.eq(i).offset().top&&(_y<div_left_div.eq(i).offset().top+div_left_div.eq(i).height())){ 
  121. $("#xuxian").remove(); 
  122. //如果是,删除之前添加的虚线框 
  123. div_left_div.eq(i).before(xuxian); 
  124. //把虚线框添加到当前鼠标进入的div元素的前面 
  125. $("#xuxian").css({ //设定虚线框的高和宽 
  126. width:'100%'
  127. height:div_move_height 
  128. }); 
  129. break//退出循环 
  130. }else{//如果左边div_left容器下面没有任何可移动div元素 
  131. var div_left_div=$("#div_left>div").not(div_move).not("#xuxian"); 
  132. if(div_left_div.length==0){ 
  133. $("#xuxian").remove(); //移除之前添加的虚线框 
  134. $("#div_left").append(xuxian); 
  135. //把虚线框添加为左边div_left容器的子元素 
  136. $("#xuxian").css({ 
  137. width:'100%'
  138. height:div_move_height 
  139. }); 
  140. }else if(_x>center_left&&_x<(center_left+center_width)){ 
  141. //判断鼠标是否进入中间div_center容器 
  142. /*选定中间div_center容器下的最后一个可移动div, 
  143. 不包含当前正在移动的div元素和虚线框*/ 
  144. var div_center_last=$("#div_center>div").not(div_move).not("#xuxian").filter(":last"); 
  145. if(div_center_last.length>=1){ 
  146. //判断中间div_center容器的下面时候有可移动div子元素 
  147. if(_y>(div_center_last.offset().top+div_center_last.height())){ 
  148. //判断鼠标是否在中间div_center容器的最后一个可移动div子元素的下边 
  149. $("#xuxian").remove(); 
  150. //如果是,删除之前添加的虚线框 
  151. div_center_last.after(xuxian); 
  152. //把虚线框添加为中间div_center容器的最后一个div子元素 
  153. $("#xuxian").css({ //设定虚线框的宽和高 
  154. width:'100%'
  155. height:div_move_height 
  156. }); 
  157. }else
  158. //如果鼠标不在中间div_center容器最后一个可移动div子元素的下边, 
  159. //则循环判断鼠标进入的是哪一个iv子元素 
  160. var div_center_div=$("#div_center>div").not(div_move).not("#xuxian"); 
  161. for(var i=0;i<div_center_div.length;i++){ 
  162. if(_y>div_center_div.eq(i).offset().top&&(_y<div_center_div.eq(i).offset().top+div_center_div.eq(i).height())){ 
  163. $("#xuxian").remove(); 
  164. //找到鼠标进入的div子元素,删除之前添加的虚线框 
  165. div_center_div.eq(i).before(xuxian); 
  166. //把虚线框添加到当前鼠标进入的div子元素的前面 
  167. $("#xuxian").css({ 
  168. //设定虚线框的宽度和高度 
  169. width:'100%'
  170. height:div_move_height 
  171. }); 
  172. break//退出循环 
  173. }else
  174. //如果中间div_center容器的中间没有可移动的div子元素 
  175. var div_center_div=$("#div_center>div").not(div_move).not("#xuxian");  
  176. if(div_center_div.length==0){ 
  177. $("#xuxian").remove(); 
  178. //删除之前添加的虚线框 
  179. $("#div_center").append(xuxian); 
  180. //把虚线框添加为中间div_center的最后一个div元素 
  181. $("#xuxian").css({ 
  182. width:'100%'
  183. height:div_move_height 
  184. }); 
  185. }else if(_x>right_left&&_x<(right_left+right_width)){ 
  186. //判断鼠标是否进入右边div_right容器 
  187. /*选定右边div_right容器下的最后一个可移动div, 
  188. 不包含当前正在移动的div元素和虚线框*/ 
  189. var div_right_last=$("#div_right>div").not(div_move).not("#xuxian").filter(":last"); 
  190. if(div_right_last.length>=1){ 
  191. //判断右边div_right容器下边是否有可移动的div子元素 
  192. if(_y>(div_right_last.offset().top+div_right_last.height())){ 
  193. //判断鼠标时候在右边div_right容器最后一个可移动div元素的下边 
  194. $("#xuxian").remove(); 
  195. //如果是,删除之前添加的虚线框 
  196. div_right_last.after(xuxian); 
  197. //添加虚线框为右边div_right容器的最后一个元素 
  198. $("#xuxian").css({ 
  199. //设定虚线框的宽和高 
  200. width:'100%'
  201. height:div_move_height 
  202. }); 
  203. }else
  204. //如果鼠标不在右边div_right容器最后一个可移动div元素的下边, 
  205. //则循环判断鼠标进入到右边div_right容器下哪个可移动div元素里面 
  206. for(var i=0;i<div_right_div.length;i++){ 
  207. if(_y>div_right_div.eq(i).offset().top&&(_y<div_right_div.eq(i).offset().top+div_right_div.eq(i).height())){ 
  208. $("#xuxian").remove(); 
  209. //找到鼠标进入的div元素,删除之前添加的虚线框 
  210. div_right_div.eq(i).before(xuxian); 
  211. //把虚线框添加到鼠标进入的div元素的前面 
  212. $("#xuxian").css({ 
  213. //设定宽和高 
  214. width:'100%'
  215. height:div_move_height 
  216. }); 
  217. break
  218. //退出循环 
  219. }else
  220. //如果右边div_right元素的下边没有可移动的div子元素 
  221. if(div_right_div.length==0){ 
  222. $("#xuxian").remove(); 
  223. //删除之前添加的虚线框 
  224. $("#div_right").append(xuxian); 
  225. //把虚线框添加为右边div_right容器的子元素 
  226. $("#xuxian").css({ 
  227. //设定虚线框的宽和高 
  228. width:'100%'
  229. height:div_move_height 
  230. }); 
  231. }).mouseup(function(){ 
  232. mouse_down=false//鼠标松开 
  233. $("#xuxian").before(div_move); 
  234. //将当前正在移动的div元素添加到虚线框的前面 
  235. div_move.css({ 
  236. //更改正在移动div元素的position和宽 
  237. position:'static'
  238. width:'100%' 
  239. }); 
  240. $("#xuxian").remove(); 
  241. //删除虚线框 
  242. return false
  243. }); 
  244. //]]> 
  245. </script> 
  246. </head> 
  247. <body> 
  248. <div id="div_width"
  249. <div id="div_left"
  250. <div class="can_move"
  251. <p>音乐</p> 
  252. </div> 
  253. <div class="can_move"
  254. <p>活动</p> 
  255. </div> 
  256. </div> 
  257. <div id="div_center"
  258. <div class="can_move center_width"
  259. <p>科技</p> 
  260. </div> 
  261. </div> 
  262. <div id="div_right"
  263. <div class="can_move"
  264. <p>新闻</p> 
  265. </div> 
  266. <div class="can_move"
  267. <p>元素</p> 
  268. </div> 
  269. </div> 
  270. </div> 
  271. </body> 
  272. </html> 

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

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

图片精选