4-1 综合挑战题
本节编程练习不计算学习进度,请电脑登录imooc.com操作

综合挑战题

小伙伴们,根据所学知识,修案例实现网格化拖拽,拖拽的时候以50个像素为网格,没有超过50个像素面板大小不变.超过50个像素才变动。

任务

一、重新计算网格化(50像素)后的面板宽度和高度

提示:
  可以使用取余运算符,获得x%50的余数,再用x减去它。

注意:右下角的控制元素和右边、底边的宽高不一样.

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.  
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6.  
  7. <title>慕课网-Resizable</title>
  8.  
  9. <style type="text/css">
  10. body{margin:0px;padding:50px;font-size:14px;color:#333}
  11.  
  12. .panel{width:400px;height:240px;border:1px solid #ccc;position:relative;min-width:40px;min-height:24px;}
  13. .panel .title{background:#eee;text-align:center;line-height:30px;border:1px solid #fff;font-weight:bold}
  14.  
  15. .ui-Resizable-r{position:absolute;right:0px;top:0px;width:10px;height:100%;cursor: e-resize;}
  16. .ui-Resizable-b{position:absolute;right:0px;bottom:0px;width:100%;height:10px;cursor: s-resize;}
  17. .ui-Resizable-rb{position:absolute;right:0px;bottom:0px;width:20px;height:20px;cursor: nw-resize;}
  18.  
  19. </style>
  20. </head>
  21. <body onselectstart="return false;">
  22.  
  23. <h1>慕课网案例特效:Resizable — 可调大小面板</h1>
  24.  
  25. <div class="panel" id="ui-Resizable" onselectstart="return false;" >
  26. <div class="title" >Resizable Panel</div>
  27.  
  28. </div>
  29.  
  30. <script type="text/javascript">
  31.  
  32. // ctrl :控制元素,panel :面板 , type 类型
  33. var m_panel , m_ctrl , m_type ;
  34.  
  35. // move: 是否侦听鼠标移动,
  36. // m_start_x: 鼠标相对ctrl元素的left、right
  37. // m_to_x: 鼠标的新位置
  38. var moving = 0 ,m_start_x = 0 , m_start_y = 0 , m_to_x = 0 , m_to_y = 0 ;
  39.  
  40. // 面板最小尺寸
  41. var m_min_w = 100,m_min_h = 40;
  42.  
  43. // 在控制元素中按下
  44. function on_mousedown( e , panel ,ctrl , type ){
  45. var e = e || window.event;
  46.  
  47. // 计算出鼠标页面位置 和 当前元素位置的差 = 鼠标相对元素的位置
  48. m_start_x = e.pageX - ctrl.offsetLeft;
  49. m_start_y = e.pageY - ctrl.offsetTop;
  50.  
  51. m_panel = panel;
  52. m_ctrl = ctrl;
  53. m_type = type;
  54.  
  55. // 开始处理移动事件
  56. moving = setInterval(on_move,10);
  57.  
  58. }
  59. // 页面鼠标移动侦听处理
  60. document.onmousemove = function( e ){
  61. var e = window.event || e;
  62. m_to_x = e.pageX;
  63. m_to_y = e.pageY;
  64. }
  65. // 鼠标移动处理
  66. function on_move(){
  67.  
  68. if(moving){
  69.  
  70. // 计算最小的 left 和 top (使panel的新大小不能小于自身的位置)
  71. var min_left = m_panel.offsetLeft
  72. var min_top = m_panel.offsetTop
  73.  
  74. var to_x = Math.max(min_left+ m_min_w,m_to_x - m_start_x) ;
  75. var to_y = Math.max(min_top + m_min_h,m_to_y - m_start_y) ;
  76.  
  77. // 元素的新位置 = 鼠标新位置 - 鼠标相对元素的位置
  78.  
  79.  
  80.  
  81. switch( m_type ){
  82. case 'r' :
  83. m_ctrl.style.left = to_x + "px";
  84. m_panel.style.width=grid_w+'px';
  85. break;
  86. case 'b' :
  87. m_ctrl.style.top = to_y+ "px";
  88. m_panel.style.height=grid_h+'px';
  89. break;
  90. case 'rb' :
  91. m_ctrl.style.left =to_x + "px";
  92. m_ctrl.style.top =to_y+ "px";
  93.  
  94. m_panel.style.width=grid_w+'px';
  95. m_panel.style.height=grid_h+'px';
  96. break;
  97. }
  98. }
  99.  
  100. }
  101.  
  102. // 鼠标弹起处理
  103. document.onkeyup = document.onmouseup = function(e){
  104. clearInterval(moving);
  105. var cls = document.getElementsByClassName('ui-Resizable-ctrl');
  106. for(var i=0;i<cls.length;i++){
  107. cls[i].style.left = '';
  108. cls[i].style.top = '';
  109. }
  110. }
  111.  
  112. // 设置某个面板支持调整大小
  113. function Resizable( panelId ){
  114.  
  115. var panel = document.getElementById(panelId);
  116. // 插入调整控制元素
  117. var r = document.createElement("div");
  118. var b = document.createElement("div");
  119. var rb = document.createElement("div");
  120.  
  121. r.class = r.className = 'ui-Resizable-r ui-Resizable-ctrl';
  122. b.class = b.className = 'ui-Resizable-b ui-Resizable-ctrl';
  123. rb.class = rb.className = 'ui-Resizable-rb ui-Resizable-ctrl';
  124.  
  125. panel.appendChild(r);
  126. panel.appendChild(b);
  127. panel.appendChild(rb);
  128.  
  129. // 为调整控制元素设置拖拽处理
  130. r.addEventListener('mousedown',function(e){
  131. on_mousedown(e,panel,r,'r');
  132. })
  133. b.addEventListener('mousedown',function(e){
  134. on_mousedown(e,panel,b,'b');
  135. })
  136. rb.addEventListener('mousedown',function(e){
  137. on_mousedown(e,panel,rb,'rb');
  138. })
  139. }
  140. Resizable('ui-Resizable');
  141.  
  142.  
  143.  
  144. </script>
  145. </body>
  146. </html>
返回课程