为何jQuery Mmenu在PC端响应式模式下溢出,iPhone真机却正常?
嘿,我看到你在用mmenu搭建移动端过滤器时遇到了菜单溢出的问题——而且只在浏览器响应式模式下出现,真实iPhone上反而正常,这确实有点让人困惑!结合你的代码和场景,给你几个针对性的排查和解决思路:
1. 优先检查视口配置与mmenu初始化选项
浏览器的响应式模式有时候会和真实移动设备的视口处理逻辑有差异,先确认页面的视口meta标签是否正确设置:
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
同时在mmenu初始化时,添加视口相关的配置项,确保菜单能正确适配响应式视口:
const menu = new Mmenu("#clinicFilter", { // 其他选项... viewport: { width: "device-width" }, // 其他选项... });
2. 约束菜单面板的溢出行为
从你的HTML结构来看,过滤器包含了多个子面板(比如#locations、#radius),可能是这些子面板的内容没有被正确约束导致溢出。尝试给mmenu的面板添加强制溢出控制的CSS:
.mm-panel { max-height: 100vh; overflow-y: auto; width: 100%; }
这样当子面板内容过长时,会自动出现内部滚动条,而不会撑破菜单容器。
3. 排查两个mmenu实例的样式冲突
你提到站点有两个mmenu实例(导航和过滤器),虽然导航正常,但过滤器可能继承了冲突的样式或配置。可以给过滤器的mmenu设置独立的类名,避免样式污染:
const menu = new Mmenu("#clinicFilter", { // 其他选项... classNames: { menu: "filter-menu", panel: "filter-panel" }, // 其他选项... });
然后针对这个独立类写专属样式:
.filter-menu { width: 100vw !important; overflow: hidden; } .filter-panel { max-height: 100vh; overflow-y: auto; }
4. 调试响应式模式下的元素尺寸
打开浏览器开发者工具,在响应式模式下触发菜单溢出后,检查#clinicFilter对应的mmenu容器(通常是.mm-menu类的元素)的尺寸和定位:
- 查看是否有元素的宽度超过了视口宽度
- 检查
transform属性的计算值是否异常 - 确认菜单的
position属性是否为fixed或absolute且正确约束在视口内
如果发现某个元素导致溢出,可以针对性地调整其宽度或溢出属性。
附:你的代码整理
HTML结构
<div id="filterHolder"> <nav id="clinicFilter"> <div id="settings"> <ul> <li class="Divider"> </li> <li id="setting-location"> <span> <em class="Counter">Alla</em> Stad </span> <div id="locations"> <ul> <li class="searchresult Divider">Searchresults (fake)</li> <li class="searchresult"><span>Amsterdam</span></li> <li class="searchresult"><span>Athens</span></li> <li class="Divider"> </li> <li><span>Current location</span></li> <li class="Divider"> </li> <li class="Divider">Recently searched</li> <li><span>Amsterdam</span></li> <li><span>London</span></li> <li><span>Tokyo</span></li> </ul> </div> </li> <li id="setting-radius"> <span> <em class="Counter">Alla</em> Behandlar </span> <div id="radius"> <ul> <li> <span>Alla</span> <input type="radio" name="radius" class="Check" checked/> </li> <li> <span>Hund</span> <input type="radio" name="radius" class="Check" /> </li> <li> <span>Katt</span> <input type="radio" name="radius" class="Check" /> </li> <li> <span>Smådjur</span> <input type="radio" name="radius" class="Check" /> </li> <li> <span>Häst</span> <input type="radio" name="radius" class="Check" /> </li> </ul> <p class="mmpanelSetAnimalType"> <a href="#settings" class="button">Filtrera</a> </p> </div> </li> <li class="Divider">Filter</li> <li> <span>Vetified</span> <input type="checkbox" class="Toggle" /> </li> <li> <span>Hög kundnöjdhet</span> <input type="checkbox" class="Toggle" /> </li> <li> <span>Transparent prislista</span> <input type="checkbox" class="Toggle" /> </li> <li> <span>Jour</span> <input type="checkbox" class="Toggle" /> </li> <li> <span>Har butik</span> <input type="checkbox" class="Toggle" /> </li> </ul> <br /> <p class="mm-button"> <a href="#/search" class="button">Filtrera</a> </p> </div> </nav> </div>
JS初始化代码
document.addEventListener( "DOMContentLoaded", () => { const menu = new Mmenu("#clinicFilter", { //options "navbars": [ { "position": "top", "content": [ "close" ] } ], pageScroll: true, slidingSubmenus: true, searchfield: { add: true, addTo: "#locations", placeholder: "Stad", showTextItems: true }, onClick: { setSelected: false }, navbar: { title: "Filtrera" }, extensions: ["border-none", "pagedim-black"] }, { //Configuration }); } );
内容的提问来源于stack exchange,提问作者user5283666
相关产品推荐
相关产品推荐

