splitbar.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. $(function () {
  2. var splitBar = {
  3. // 设置当前屏幕为 840px 时将分割条隐藏
  4. maxWidth: 840,
  5. // 父元素选择器
  6. parentSelector: '.manual-body',
  7. /**
  8. * 初始化分割条
  9. */
  10. init: function () {
  11. var self = this;
  12. $(self.parentSelector)
  13. .append(
  14. $('\
  15. <div id="manual-vsplitbar" unselectable="on"\
  16. style="\
  17. z-index:301;\
  18. position: absolute;\
  19. user-select: none;\
  20. cursor: col-resize;\
  21. left: 275px;\
  22. height: 100%;\
  23. display: block;\
  24. width: 3px;">\
  25. <a href="javascript:void(0)" accesskey="" tabindex="0" title="vsplitbar"></a>\
  26. </div>\
  27. ')
  28. .hover(
  29. function (event) {
  30. event.target.style.background = '#8f949ad8';
  31. },
  32. function (event) {
  33. event.target.style.background = '';
  34. }
  35. )
  36. );
  37. self.loadingHtml();
  38. // 设置媒体查询
  39. mediaMatcher.set();
  40. },
  41. /**
  42. * 加载页面时设置分割条是否显示
  43. */
  44. loadingHtml: function () {
  45. var self = this;
  46. var htmlWidth = document.body.clientWidth;
  47. if (htmlWidth <= self.maxWidth) $('#manual-vsplitbar').css('display', 'none');
  48. },
  49. /**
  50. * 在打开关闭菜单事初始化左右窗口和分割条
  51. */
  52. reset: function () {
  53. if (isFullScreen) {
  54. // 关闭菜单时,初始化左右窗口
  55. $('#manual-vsplitbar').css('display', 'none');
  56. splitBar.inMaxWidthReset();
  57. $('.manual-left').css('width', '0px');
  58. } else {
  59. // 打开菜单时,初始化左右窗口
  60. $('#manual-vsplitbar').css('display', 'block');
  61. splitBar.outMaxWidthReset();
  62. }
  63. },
  64. /**
  65. * 屏幕小于等于 840px,重置左右窗口
  66. */
  67. inMaxWidthReset: function () {
  68. $('#manual-vsplitbar').css('display', 'none');
  69. $('.m-manual.manual-reader .manual-right').css('left', '0');
  70. $('.manual-left').css('width', '280px');
  71. },
  72. /**
  73. * 屏幕大于 840px,重置左右窗口
  74. */
  75. outMaxWidthReset: function () {
  76. $('.manual-right').css('left', '279px');
  77. $('.manual-left').css('width', '279px');
  78. $('#manual-vsplitbar').css('left', '275px').css('display', 'block');
  79. }
  80. }
  81. /**
  82. * 设置媒体查询
  83. * 分割条隐藏
  84. */
  85. var mediaMatcher = {
  86. mql: window.matchMedia('(max-width:' + splitBar.maxWidth + 'px)'),
  87. /**
  88. * 添加媒体查询监听事件
  89. */
  90. set: function () {
  91. var self = this;
  92. self.mql.addListener(self.mqCallback);
  93. },
  94. /**
  95. * 删除媒体查询监听事件
  96. */
  97. remove: function () {
  98. var self = this;
  99. self.mql.removeListener(self.mqCallback);
  100. },
  101. /**
  102. * 媒体查询回调函数
  103. */
  104. mqCallback: function (event) {
  105. if (event.target.matches) { // 宽度小于等于 840 像素
  106. $(".m-manual").removeClass('manual-fullscreen-active');
  107. splitBar.inMaxWidthReset();
  108. } else { // 宽度大于 840 像素
  109. splitBar.outMaxWidthReset();
  110. }
  111. }
  112. }
  113. // 初始化分割条
  114. splitBar.init();
  115. /**
  116. * 控制菜单宽度
  117. * 最小为 140px
  118. */
  119. $('#manual-vsplitbar').on('mousedown', function (e) {
  120. var bodyEle = $('.manual-body')[0];
  121. var leftPane = $('.manual-left')[0];
  122. var splitBar = $('#manual-vsplitbar')[0];
  123. var rightPane = $('.manual-right')[0];
  124. var disX = (e || event).clientX;
  125. splitBar.left = splitBar.offsetLeft;
  126. var docMouseMove = document.onmousemove;
  127. var docMouseUp = document.onmouseup;
  128. document.onmousemove = function (e) {
  129. var curPos = splitBar.left + ((e || event).clientX - disX);
  130. var maxPos = bodyEle.clientWidth - splitBar.offsetWidth;
  131. curPos > maxPos && (curPos = maxPos);
  132. curPos < 140 && (curPos = 140);
  133. leftPane.style.width = curPos + "px";
  134. splitBar.style.left = curPos - 3 + "px";
  135. rightPane.style.left = curPos + 3 + "px";
  136. return false;
  137. }
  138. document.onmouseup = function () {
  139. document.onmousemove = docMouseMove;
  140. document.onmouseup = docMouseUp;
  141. splitBar.releaseCapture && splitBar.releaseCapture();
  142. };
  143. splitBar.setCapture && splitBar.setCapture();
  144. return false;
  145. });
  146. /**
  147. * 关闭侧边栏时,同步分割条;
  148. */
  149. $(".manual-fullscreen-switch").on("click", splitBar.reset);
  150. });