mirror of
https://gitee.com/ulthon/ulthon_admin.git
synced 2026-11-10 04:50:50 +08:00
新增头部模块菜单宽度自适应折叠与更多下拉
This commit is contained in:
@@ -226,9 +226,93 @@
|
|||||||
}).join("");
|
}).join("");
|
||||||
$('.layui-layout-body').addClass('layuimini-multi-module'); //多模块标识
|
$('.layui-layout-body').addClass('layuimini-multi-module'); //多模块标识
|
||||||
$('.layuimini-menu-header-pc').html(headerMenuHtml); //电脑
|
$('.layuimini-menu-header-pc').html(headerMenuHtml); //电脑
|
||||||
|
// 常驻「更多」li:PC 多模块路径专属;自身不带 data-menu(不参与折叠遍历),li 带 lay-unselect 防 clickThis 洗牌激活态;
|
||||||
|
// 不手写 span.layui-nav-more(2.10.1 中手写不可见且会抑制自动注入箭头),由下方 element.init() 自动注入 chevron icon
|
||||||
|
$('.layuimini-menu-header-pc').append('<li class="layui-nav-item layuimini-header-more" lay-unselect><a title="更多">更多</a><dl class="layui-nav-child"></dl></li>');
|
||||||
$('.layuimini-menu-left').html(leftMenuHtml);
|
$('.layuimini-menu-left').html(leftMenuHtml);
|
||||||
|
|
||||||
element.init();
|
element.init();
|
||||||
|
|
||||||
|
// 首次渲染后重算宽度折叠,并同步「更多」激活态
|
||||||
|
miniMenu.relayoutHeaderMenu();
|
||||||
|
miniMenu.syncHeaderActiveState();
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 头部模块宽度自适应折叠重算:累计宽度超出可用宽度的模块收纳进「更多」下拉
|
||||||
|
*/
|
||||||
|
relayoutHeaderMenu: function () {
|
||||||
|
var $headerMenu = $('.layuimini-menu-header-pc');
|
||||||
|
if (!$headerMenu.is(':visible')) { //可见性守卫:≤1024 时 pc-show 隐藏,测量隐藏容器得到全零宽度脏状态
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var $more = $headerMenu.children('.layuimini-header-more');
|
||||||
|
if (!$more.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 可用宽度 = 右侧功能区左边界 - 头部菜单容器左边界 - 安全边距 - 「更多」自身常驻占位
|
||||||
|
var availableWidth = $('.layui-layout-right').first().offset().left - $headerMenu.offset().left - 12 - $more.outerWidth(true);
|
||||||
|
var $items = $headerMenu.children('li[data-menu]'); //仅模块 li;「菜单」模板 li 无 data-menu 不会被触及
|
||||||
|
$items.removeClass('layui-hide'); //测量前先全部回填可见,保证变宽时能恢复
|
||||||
|
var usedWidth = 0,
|
||||||
|
hiddenMenus = [];
|
||||||
|
$items.each(function () {
|
||||||
|
var $item = $(this);
|
||||||
|
usedWidth += $item.outerWidth(true);
|
||||||
|
if (usedWidth > availableWidth) {
|
||||||
|
$item.addClass('layui-hide');
|
||||||
|
hiddenMenus.push($item.attr('data-menu'));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// 用被隐藏模块按显示顺序重建下拉:dd 带 lay-unselect 防 clickThis 洗牌、带 a 承接主题悬停/颜色样式、不带 id
|
||||||
|
var ddHtml = '';
|
||||||
|
miniMenu.each(hiddenMenus, function (index, menuId) {
|
||||||
|
var menuIndex = parseInt(menuId.replace('multi_module_', ''), 10);
|
||||||
|
var menu = (miniMenu.menuData || [])[menuIndex] || {};
|
||||||
|
var icon = menu.icon ? menu.icon : '';
|
||||||
|
ddHtml += '<dd lay-unselect data-menu="' + menuId + '"><a href="javascript:;"><i class="' + icon + '"></i> ' + (menu.title || '') + '</a></dd>';
|
||||||
|
});
|
||||||
|
$more.children('dl.layui-nav-child').html(ddHtml);
|
||||||
|
element.init(); //已核实安全:只重绑事件与 bar span,不重建 dd DOM,激活态得以保留
|
||||||
|
miniMenu.syncHeaderActiveState(); //折叠可能隐藏当前激活项,重算后立即同步
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 「更多」与下拉 dd 的激活态同步:激活态真源是头部模块 li(即使被折叠隐藏)
|
||||||
|
*/
|
||||||
|
syncHeaderActiveState: function () {
|
||||||
|
var $more = $('.layuimini-header-more');
|
||||||
|
if (!$more.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var $activeLi = $('.layuimini-header-menu li.layui-this').not('.layuimini-header-more').first();
|
||||||
|
var isActiveHidden = $activeLi.length > 0 && $activeLi.hasClass('layui-hide');
|
||||||
|
if (isActiveHidden) {
|
||||||
|
$more.addClass('layui-this');
|
||||||
|
} else {
|
||||||
|
$more.removeClass('layui-this');
|
||||||
|
}
|
||||||
|
// 下拉内对应 dd 与隐藏 li 的激活态对齐
|
||||||
|
var $dd = $more.find('dl.layui-nav-child dd');
|
||||||
|
$dd.removeClass('layui-this');
|
||||||
|
if (isActiveHidden) {
|
||||||
|
$dd.filter('[data-menu="' + $activeLi.attr('data-menu') + '"]').addClass('layui-this');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 轻量防抖:delay 内重复触发只执行最后一次
|
||||||
|
*/
|
||||||
|
debounce: function (fn, delay) {
|
||||||
|
var timer = null;
|
||||||
|
return function () {
|
||||||
|
var context = this,
|
||||||
|
args = arguments;
|
||||||
|
clearTimeout(timer);
|
||||||
|
timer = setTimeout(function () {
|
||||||
|
fn.apply(context, args);
|
||||||
|
}, delay);
|
||||||
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -242,17 +326,33 @@
|
|||||||
$('body').on('click', '[data-menu]', function () {
|
$('body').on('click', '[data-menu]', function () {
|
||||||
var loading = layer.load(0, { shade: false, time: 2 * 1000 });
|
var loading = layer.load(0, { shade: false, time: 2 * 1000 });
|
||||||
var menuId = $(this).attr('data-menu');
|
var menuId = $(this).attr('data-menu');
|
||||||
// header
|
var $headerLi = $("#" + menuId + "HeaderId");
|
||||||
$(".layuimini-header-menu .layui-nav-item.layui-this").removeClass('layui-this');
|
// header:清空范围含被折叠隐藏的 li;激活态真源始终是头部模块 li(即使隐藏),不依赖 $(this) 高亮
|
||||||
$(this).addClass('layui-this');
|
$(".layuimini-header-menu .layui-nav-item").removeClass('layui-this');
|
||||||
|
$headerLi.addClass('layui-this');
|
||||||
|
// 被点击元素不是头部模块 li 本身(即「更多」下拉 dd 等克隆载体)时,才给它视觉高亮
|
||||||
|
if (!$(this).is($headerLi)) {
|
||||||
|
$(this).addClass('layui-this');
|
||||||
|
}
|
||||||
// left
|
// left
|
||||||
$(".layuimini-menu-left .layui-nav.layui-nav-tree.layui-this").addClass('layui-hide');
|
$(".layuimini-menu-left .layui-nav.layui-nav-tree.layui-this").addClass('layui-hide');
|
||||||
$(".layuimini-menu-left .layui-nav.layui-nav-tree.layui-this.layui-hide").removeClass('layui-this');
|
$(".layuimini-menu-left .layui-nav.layui-nav-tree.layui-this.layui-hide").removeClass('layui-this');
|
||||||
$("#" + menuId).removeClass('layui-hide');
|
$("#" + menuId).removeClass('layui-hide');
|
||||||
$("#" + menuId).addClass('layui-this');
|
$("#" + menuId).addClass('layui-this');
|
||||||
|
miniMenu.syncHeaderActiveState();
|
||||||
layer.close(loading);
|
layer.close(loading);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 窗口尺寸变化时重算头部折叠(防抖,仅绑定一次,避免重渲染重复绑定)
|
||||||
|
*/
|
||||||
|
if (!miniMenu._resizeListenerBound) {
|
||||||
|
miniMenu._resizeListenerBound = true;
|
||||||
|
$(window).on('resize', miniMenu.debounce(function () {
|
||||||
|
miniMenu.relayoutHeaderMenu();
|
||||||
|
}, 150));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 菜单缩放
|
* 菜单缩放
|
||||||
*/
|
*/
|
||||||
@@ -272,6 +372,7 @@
|
|||||||
layer.close(window.openTips);
|
layer.close(window.openTips);
|
||||||
}
|
}
|
||||||
element.init();
|
element.init();
|
||||||
|
setTimeout(miniMenu.relayoutHeaderMenu, 260); //左侧布局带 .2s 过渡,同步测量会读到中间值,等过渡结束再重算
|
||||||
layer.close(loading);
|
layer.close(loading);
|
||||||
});
|
});
|
||||||
/**
|
/**
|
||||||
@@ -300,6 +401,7 @@
|
|||||||
layer.close(window.openTips);
|
layer.close(window.openTips);
|
||||||
}
|
}
|
||||||
element.init();
|
element.init();
|
||||||
|
setTimeout(miniMenu.relayoutHeaderMenu, 260); //左侧布局带 .2s 过渡,同步测量会读到中间值,等过渡结束再重算
|
||||||
layer.close(loading);
|
layer.close(loading);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user