sidebar.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. //左侧层级是否包含示例
  2. var containExample = false;
  3. var sideBarIconConfig = sideBarIconConfig || {};
  4. function initSideBar() {
  5. var sideBar = $("ul#sidebar-menu");
  6. for (var key in conf) {
  7. sideBar.append(createSideBarMenuItem(key, conf[key], false));
  8. }
  9. }
  10. //侧边栏滚动支持
  11. function sidebarScrollFix() {
  12. $('ul#sidebar-menu>li').hover(function (evt) {
  13. if (!$('body').hasClass('sidebar-collapse')) {
  14. return;
  15. }
  16. //调整一级菜单li下标题的布局位置至右侧
  17. var $titleBar = $(this).children('a').children('.sidebar-title-bar');
  18. $titleBar.css({
  19. "top": ($(this).offset().top - $(window).scrollTop()) + "px",
  20. //fix由于侧边栏滚动条宽度引起的减少的宽度
  21. "width": "223px"
  22. });
  23. //如果底部空间不够,动态增加侧边栏高度
  24. var visibleOffsetTop = $(this).offset().top - $(window).scrollTop();
  25. var offsetBottom = $('.sidebar-menu').height() - visibleOffsetTop;
  26. var requireVisibleHeight = $(this).height() + $(this).children('ul').height();
  27. if (offsetBottom <= requireVisibleHeight) {
  28. $('.sidebar-menu').css({
  29. "height": (requireVisibleHeight + $(window).height()) + "px"
  30. })
  31. }
  32. //调整一级菜单li下子列表的布局位置至右侧
  33. var offsetTop = visibleOffsetTop + $(this).height();
  34. $(this).children('ul').css({
  35. "top": offsetTop + "px"
  36. });
  37. //fix小尺寸屏幕下二级菜单高度高于窗口高度时显示不全的情况
  38. var $activeList = $(this).children('ul');
  39. var activeListOffsetBottom = $(window).height() - visibleOffsetTop - $(this).height();
  40. var requireActiveListHeight = $activeList.height();
  41. if (activeListOffsetBottom < requireActiveListHeight) {
  42. $activeList.css({"height": activeListOffsetBottom});
  43. //滚动条样式
  44. $activeList.addClass('scroll-list');
  45. }
  46. }, function (evt) {
  47. if (!$('body').hasClass('sidebar-collapse')) {
  48. return;
  49. }
  50. //滚动条
  51. $(this).children('ul').removeClass('scroll-list');
  52. //恢复原来的高度
  53. $(this).children('ul').css({"height": "auto"});
  54. });
  55. $('.main-sidebar').on('scroll', function (evt) {
  56. evt.stopPropagation();
  57. });
  58. $(window).on('resize', function () {
  59. $('.sidebar-menu').css({"height": "100%"})
  60. })
  61. }
  62. //创建菜单项
  63. function createSideBarMenuItem(id, config, containAll) {
  64. containExample = containAll;
  65. if (!config) {
  66. return;
  67. }
  68. var title = utils.getLocalPairs(config, "name");
  69. var li = $("<li id='iclient_" + id + "' class='treeview ' title='" + title + "'></li>");
  70. if (config.content) {
  71. createSideBarMenuTitle(id, title, true).appendTo(li);
  72. createSideBarSecondMenu(config.content, id).appendTo(li);
  73. } else {
  74. createSideBarMenuTitle(id, title, false).appendTo(li);
  75. }
  76. return li;
  77. }
  78. //创建二级菜单
  79. function createSideBarSecondMenu(config, name) {
  80. var ul = $("<ul class='treeview-menu second-menu '></ul>");
  81. for (var key in config) {
  82. var configItem = config[key];
  83. var title = utils.getLocalPairs(configItem, "name") || "【empty title】";
  84. var li = $("<li class='menuTitle ' id='" + key + "' title='" + title + "'></li>");
  85. li.appendTo(ul);
  86. if (containExample && configItem.content) {
  87. createSideBarMenuSecondTitle(name + '-' + key, title, true).appendTo(li);
  88. createSideBarThirdMenu(configItem.content).appendTo(li);
  89. } else {
  90. createSideBarMenuSecondTitle(name + '-' + key, title, false).appendTo(li);
  91. }
  92. }
  93. return ul;
  94. }
  95. //创建三级菜单
  96. function createSideBarThirdMenu(examples) {
  97. var ul = $("<ul class='treeview-menu third-menu'></ul>");
  98. var len = (examples && examples.length) ? examples.length : 0;
  99. for (var i = 0; i < len; i++) {
  100. var example = examples[i];
  101. var title = utils.getLocalPairs(example, "name")|| "【empty title】";
  102. var li = $("<li class='menuTitle' id='" + example.fileName + "' title='" + title + "'></li>");
  103. li.appendTo(ul);
  104. if (example.fileName && title) {
  105. createSideBarMenuThirdTitle(example.fileName, title, false).appendTo(li);
  106. }
  107. }
  108. return ul;
  109. }
  110. function createSideBarMenuTitle(id, title, collapse) {
  111. id = id || "";
  112. var icon = "", iconName = sideBarIconConfig[id];
  113. if (iconName) {
  114. icon = "<i class='fa " + iconName + " iconName'></i>"
  115. }
  116. var div = $("<a href='#" + id + "'>" + icon + "</a>");
  117. var titleBar = $("<span class='sidebar-title-bar'></span>");
  118. var firstMenuTitle = $("<span class='firstMenuTitle'>" + title + "</span>");
  119. titleBar.append(firstMenuTitle);
  120. if (collapse) {
  121. titleBar.append(createCollapsedIcon());
  122. }
  123. div.append(titleBar);
  124. return div;
  125. }
  126. function createSideBarMenuSecondTitle(id, title, collapse) {
  127. id = id || "";
  128. var icon = "", iconName = sideBarIconConfig[id];
  129. if (iconName) {
  130. icon = "<i class='fa " + iconName + "'></i>"
  131. }
  132. var div = $(
  133. "<a href='#" + id + "' id='" + id + '-' + id + "'>" + icon +
  134. "<span class='secondMenuTitle'>" + title + "</span>" +
  135. "</a>");
  136. if (collapse) {
  137. div.append(createCollapsedIcon());
  138. }
  139. return div;
  140. }
  141. function createSideBarMenuThirdTitle(id, title, collapse) {
  142. id = id || "";
  143. var icon = "", iconName = sideBarIconConfig[id];
  144. if (iconName) {
  145. icon = "<i class='fa " + iconName + "'></i>"
  146. }
  147. var div = $(
  148. "<a href='#' id='" + id + "'>" + icon +
  149. "<span class='thirdMenuTitle'>" + title + "</span>" +
  150. "</a>");
  151. if (collapse) {
  152. div.append(createCollapsedIcon());
  153. }
  154. return div;
  155. }
  156. //创建右侧折叠菜单
  157. function createCollapsedIcon() {
  158. return $("<span class='pull-right-container'> <i class='fa fa-angle-left pull-right'></i> </span>");
  159. }
  160. //只处理三层节点,后续可优化
  161. function selectMenu(id, length) {
  162. var target = _getTarget(id, length);
  163. if (length !== 1) {
  164. //控制editor页面左侧导航栏一级菜单高亮
  165. _selectTarget(target.parent().parent().parent().parent());
  166. //控制示例页面左侧导航栏一级菜单高亮
  167. _selectTarget(target.parent().parent());
  168. //控制左侧导航栏最低级菜单高亮
  169. _selectTarget(target.parent());
  170. _selectTarget(target.find("ul"));
  171. }
  172. }
  173. function _getTarget(id, length) {
  174. var target;
  175. if (length) {
  176. if (length === 1) {
  177. $("section#sidebar li.active").removeClass("active");
  178. target = $("section#sidebar li#iclient_" + id);
  179. target.children('ul').show();
  180. }
  181. if (length === 2) {
  182. $("section#sidebar li.active ul.active li").removeClass("active");
  183. target = $("section#sidebar li.treeview").children('ul').children('li#' + id);
  184. }
  185. } else {
  186. $("section#sidebar #ul").addClass("active");
  187. $("section#sidebar li.active").removeClass("active");
  188. target = $("section#sidebar li#" + id);
  189. }
  190. target && target.addClass('active');
  191. return target;
  192. }
  193. function _selectTarget(target) {
  194. if (!target || target.length < 1) {
  195. return;
  196. }
  197. var className = target.attr("class");
  198. if (className && className.indexOf("treeview-menu") > -1 && className.indexOf("menu-open") === -1) {
  199. target.addClass("menu-open");
  200. target.css("display", "block");
  201. }
  202. if (className && className.indexOf("treeview") > -1) {
  203. target.addClass('active');
  204. }
  205. }