slideResize.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. 'use strict';
  2. /**
  3. *
  4. *
  5. * @author Zhong
  6. * @date 2018/11/7
  7. * @version
  8. */
  9. /*
  10. * 拖动相关公共接口
  11. * 前台使用此接口时,注意在恢复系统默认设置时,
  12. * 清除相关缓存数据: project_view.js--->$('#property_default').click(callback)
  13. * */
  14. const SlideResize = (function() {
  15. //设置水平拖动条的宽度
  16. //@param {Object dom}resize滚动条
  17. function setResizeWidth (resize) {
  18. const fixedWidth = 10;
  19. //滚动条节点 及 同层非滚动条节点的索引
  20. let bros = resize.parent().children();
  21. let index = bros.index(resize),
  22. otherIndex = index ? 0 : 1;
  23. const other = resize.parent().children(`:eq(${otherIndex})`);
  24. let resizeParentWidth = resize.parent().width();
  25. let resizeDecimalWidth = fixedWidth / resizeParentWidth,
  26. otherDecimalWidth = 1 - resizeDecimalWidth;
  27. if(bros.length > 2){ //当同层有多个子元素时,other 的宽度要排除其余的宽度
  28. for(let i = 2; i< bros.length;i++){
  29. otherDecimalWidth = otherDecimalWidth - $(bros[i]).width()/resizeParentWidth
  30. }
  31. }
  32. let resizePercentWidth = resizeDecimalWidth * 100 + '%',
  33. otherPercentWidth = otherDecimalWidth * 100 + '%';
  34. resize.css('width', resizePercentWidth);
  35. other.css('width', otherPercentWidth);
  36. }
  37. let mouseMoveCount = 0;
  38. /*
  39. * div之间的水平拖动,适应各种情况
  40. * @param {Object}eleObj: module所属模块,防止不同页面相同id导致localstorage数据被覆盖(放在对象里,因为可能有的地方要实时改这个module)
  41. * resize, parent, left, right
  42. * @param {Object}limit: min, max
  43. * @param {Function}callback 回调
  44. * */
  45. function horizontalSlide(eleObj, limit, callback) {
  46. const triggerCBSize = 5;
  47. let drag = false,
  48. startPoint = 0,
  49. leftWidth = 0,
  50. rightWidth = 0,
  51. leftChange = 0,
  52. rightChange = 0,
  53. limitMax = 0;
  54. eleObj.resize.mousedown(function (e) {
  55. drag = true;
  56. startPoint = e.clientX;
  57. leftWidth = eleObj.left.width();
  58. rightWidth = eleObj.right.width();
  59. limitMax = eval(limit.max);
  60. });
  61. $('body').mousemove(function (e) {
  62. if (drag) {
  63. let moveSize = e.clientX - startPoint;
  64. leftChange = leftWidth + moveSize;
  65. leftChange = leftChange < limit.min ? limit.min : leftChange;
  66. leftChange = leftChange > limitMax ? limitMax - 5 : leftChange;
  67. rightChange = rightWidth - moveSize;
  68. rightChange = rightChange < limit.min ? limit.min : rightChange;
  69. rightChange = rightChange > limitMax ? limitMax - 5 : rightChange;
  70. let leftPercentWidth = leftChange / eleObj.parent.width() * 100 + '%',
  71. rightPercentWidth = rightChange / eleObj.parent.width() * 100 + '%';
  72. eleObj.left.css('width', leftPercentWidth);
  73. eleObj.right.css('width', rightPercentWidth);
  74. setResizeWidth(eleObj.resize);
  75. mouseMoveCount += Math.abs(moveSize);
  76. if (mouseMoveCount > triggerCBSize && callback) {
  77. callback();
  78. mouseMoveCount = 0;
  79. }
  80. }
  81. });
  82. $('body').mouseup(function (e) {
  83. if (drag) {
  84. drag = false;
  85. mouseMoveCount = 0;
  86. //将宽度信息存储到localstorage
  87. let leftWidthInfo = eleObj.left[0].style.width;
  88. setLocalCache(`${eleObj.module}${eleObj.left.attr('id')}Width`, leftWidthInfo);
  89. let rightWidthInfo = eleObj.right[0].style.width;
  90. setLocalCache(`${eleObj.module}${eleObj.right.attr('id')}Width`, rightWidthInfo);
  91. }
  92. });
  93. }
  94. function loadHorizonWidth(module, resizes, eles, callback) {
  95. for (let ele of eles) {
  96. let cache = getLocalCache(`${module}${ele.attr('id')}Width`);
  97. if (cache) {
  98. ele.css('width', cache);
  99. }
  100. }
  101. for (let resize of resizes) {
  102. setResizeWidth(resize);
  103. }
  104. if (callback) {
  105. callback();
  106. }
  107. }
  108. /*
  109. * div上下拖动
  110. * @param {Object} eleObj: module所属模块,防止不同页面相同id导致localstorage数据被覆盖(放在对象里,因为可能有的地方要实时改这个module)
  111. * resize, top, topSpread, bottom, bottomSpread
  112. * @param {Object}limit: min, max, notTopSpread(上部分非spread部分的高度) notBottomSpread(下部分非spread部分的高度)
  113. * @param {Function}callback 回调
  114. * */
  115. function verticalSlide(eleObj, limit, callback) {
  116. const triggerCBSize = 5;
  117. let drag = false,
  118. startPoint = 0,
  119. topHeight = 0,
  120. bottomHeight = 0,
  121. topChange = 0,
  122. bottomChange = 0,
  123. limitMax = 0;
  124. eleObj.resize.mousedown(function (e) {
  125. drag = true;
  126. startPoint = e.clientY;
  127. topHeight = eleObj.top.height();
  128. bottomHeight = eleObj.bottom.height();
  129. limitMax = eval(limit.max);
  130. });
  131. $('body').mousemove(function (e) {
  132. if (drag) {
  133. let moveSize = e.clientY - startPoint;
  134. topChange = topHeight + moveSize;
  135. topChange = topChange < limit.min ? limit.min : topChange;
  136. topChange = topChange > limitMax ? limitMax : topChange;
  137. bottomChange = bottomHeight - moveSize;
  138. bottomChange = bottomChange < limit.min ? limit.min : bottomChange;
  139. bottomChange = bottomChange > limitMax ? limitMax : bottomChange;
  140. //设置上部分div高度
  141. eleObj.top.height(topChange);
  142. //设置上部分div内spread高度
  143. eleObj.topSpread.height(topChange - limit.notTopSpread);
  144. //设置下部分div高度
  145. eleObj.bottom.height(bottomChange);
  146. console.log(eleObj.bottom);
  147. console.log(bottomChange);
  148. //设置下部分div内spread高度
  149. eleObj.bottomSpread.height(bottomChange - limit.notBottomSpread);
  150. mouseMoveCount += Math.abs(moveSize);
  151. if (mouseMoveCount > triggerCBSize && callback) {
  152. callback();
  153. mouseMoveCount = 0;
  154. }
  155. }
  156. });
  157. $('body').mouseup(function (e) {
  158. if (drag) {
  159. drag = false;
  160. mouseMoveCount = 0;
  161. //将高度信息存储到localstorage
  162. let topHeightInfo = eleObj.top.height();
  163. setLocalCache(`${eleObj.module}${eleObj.top.attr('id')}Height`, topHeightInfo);
  164. let bottomHeightInfo = eleObj.bottom.height();
  165. setLocalCache(`${eleObj.module}${eleObj.bottom.attr('id')}Height`, bottomHeightInfo);
  166. }
  167. });
  168. }
  169. /*
  170. * 加载上下高度
  171. * @param {String}module 所属模块,防止不同页面相同id导致localstorage数据被覆盖
  172. * @param {Object}eleObj: module所属模块,防止不同页面相同id导致localstorage数据被覆盖(放在对象里,因为可能有的地方要实时改这个module) top, topSpread, bottom, bottomSpread
  173. * @param {Object}limit: totalHeight(实时的上下部分总高度) notTopSpread(上部分非spread部分的高度) notBottomSpread(下部分非spread部分的高度)
  174. * @param {Function}callback 回调
  175. * */
  176. function loadVerticalHeight(module, eleObj, limit, callback) {
  177. let topHeight = getLocalCache(`${module}${eleObj.top.attr('id')}Height`),
  178. bottomHeight = getLocalCache(`${module}${eleObj.bottom.attr('id')}Height`);
  179. //默认上下比例
  180. const topProp = 5;
  181. const bottomProp = 2;
  182. let topProportion = topProp / (topProp + bottomProp);
  183. if (topHeight !== null && bottomHeight !== null) {
  184. topHeight = parseFloat(topHeight);
  185. bottomHeight = parseFloat(bottomHeight);
  186. topProportion = topHeight / (topHeight + bottomHeight);
  187. }
  188. //设置当前窗口下的的上下部分高度
  189. let totalHeight = eval(limit.totalHeight);
  190. let curTopHeight = totalHeight * topProportion,
  191. curBottomHeight = totalHeight - curTopHeight;
  192. eleObj.top.height(curTopHeight);
  193. eleObj.topSpread.height(curTopHeight - limit.notTopSpread);
  194. eleObj.bottom.height(curBottomHeight);
  195. eleObj.bottomSpread.height(curBottomHeight - limit.notBottomSpread);
  196. if (callback) {
  197. callback();
  198. }
  199. }
  200. /*
  201. * 包含多个上下结构的拖动(n>= 2,只包含上下结构的地方可以用loadVerticalHeight)
  202. * 加载多个结构高度
  203. * @param {String}module所属模块,防止不同页面相同id导致localstorage数据被覆盖
  204. * @param {Array}eles 元素为结构对象 内部: {container: 外部div, spread: 该div的Spread, notSpread: 该div不含Spread的高度, defaultProportion: 默认高度比例0.6}
  205. * @param {String}totalHeight 各个结构div总高度-可编译字符串
  206. * @param {Function}callback 回调
  207. * */
  208. function loadMultiVerticalHeight(module, eles, totalHeight, callback) {
  209. //当前窗口拖动区域总高度
  210. totalHeight = eval(totalHeight);
  211. let cacheHeight = 0,//缓存中设置了高度的div总高度
  212. notCacheProportion = 0;//缓存中没设置高度的div占用的总高度比例(每个div都有默认的高度比例) (有了缓存高度的div就是被拖动过的,被拖动过的div,其默认高度比例就没用了)
  213. //获取缓存的总高度、未被拖动过的所有div的默认比例之和notCacheProportion (1-notCacheProportion)就是缓存高度的占总的比例
  214. for (let ele of eles) {
  215. let eleHeight = getLocalCache(`${module}${ele.container.attr('id')}Height`);
  216. if (eleHeight !== null) {
  217. eleHeight = parseFloat(eleHeight);
  218. cacheHeight += eleHeight;
  219. } else {
  220. notCacheProportion += ele.defaultProportion;
  221. }
  222. }
  223. //缓存高度占总的比例
  224. let cacheProportion = 1 - notCacheProportion;
  225. for (let ele of eles) {
  226. let eleHeight = getLocalCache(`${module}${ele.container.attr('id')}Height`),
  227. curHeight = 0;
  228. if (eleHeight !== null) {
  229. eleHeight = parseFloat(eleHeight);
  230. //ele在当前窗口大小中的高度
  231. curHeight = eleHeight / cacheHeight * cacheProportion * totalHeight;
  232. } else {
  233. curHeight = ele.defaultProportion * totalHeight;
  234. }
  235. ele.container.height(curHeight);
  236. ele.spread.height(curHeight - ele.notSpread);
  237. }
  238. if (callback) {
  239. callback();
  240. }
  241. }
  242. return {setResizeWidth, horizontalSlide, loadHorizonWidth, verticalSlide, loadVerticalHeight, loadMultiVerticalHeight}
  243. })();