splitbar.js 5.3 KB

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