slideResize.js 11 KB

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