Office UI Fabric JS中Overlay无法覆盖Dropdown?是预期情况还是操作有误?
这其实是预期行为哦,我来给你拆解下背后的原因,以及可行的解决办法:
Office UI Fabric JS的Dropdown组件,它的下拉菜单面板默认是采用「portal 技术」渲染的——简单说就是下拉面板会被直接挂载到页面的<body>标签下,而不是嵌套在Dropdown自身的DOM结构里。
这种设计是为了避免下拉菜单被父容器的overflow:hidden之类的样式截断,但副作用就是:当你显示Overlay时,哪怕Overlay的层级设置得比较高,Dropdown的下拉面板因为在DOM树的最外层,它的z-index优先级很可能比Overlay更高,所以就会出现在Overlay上方。
你可以自己验证一下:打开浏览器开发者工具,展开Dropdown后查看下拉面板的DOM元素,就能看到它确实是直接挂在<body>下面的。
这里有几个实用的方案,你可以根据自己的场景选择:
方案一:强制提升Overlay的层级
给你的Overlay组件设置一个足够高的z-index,确保能覆盖Dropdown的下拉面板:.ms-Overlay { z-index: 10000 !important; }提示:尽量少用
!important,如果能通过调整样式选择器的优先级来实现(比如给Overlay加个自定义类,用更具体的选择器)会更优雅。方案二:让Dropdown菜单渲染在自身DOM内
部分版本的Fabric JS支持配置Dropdown,关闭portal渲染模式,让下拉菜单嵌套在Dropdown元素内部。初始化Dropdown时可以试试这个配置:for (var i = 0; i < DropdownHTMLElements.length; i++) { var Dropdown = new fabric['Dropdown'](DropdownHTMLElements[i], { renderToPortal: false // 注意:这个配置取决于你使用的Fabric JS版本,旧版本可能没有 }); }这样一来,Dropdown的菜单就会被Overlay的层级覆盖了。
方案三:显示Overlay时关闭所有Dropdown
在触发Overlay显示的同时,主动关闭所有已展开的Dropdown菜单,甚至可以暂时禁用Dropdown交互,等Overlay关闭后再恢复:OverlayExampleButton.onclick = function() { // 遍历所有Dropdown,关闭它们的菜单 for (var i = 0; i < DropdownHTMLElements.length; i++) { var dropdownInstance = fabric['Dropdown'].getComponentInstance(DropdownHTMLElements[i]); if (dropdownInstance) { dropdownInstance.hideMenu(); } } Overlay.show(); };
内容的提问来源于stack exchange,提问作者Leo

