如何阻止mmenu点击后先显示在左上角再跳转至目标位置的行为?
这个问题我之前帮人排查过,核心是mmenu默认的初始化定位逻辑导致的——它会先把菜单容器临时放在top:0, left:0的绝对定位位置,等JS计算好目标位置后再移过去,这中间的延迟就造成了肉眼可见的跳动。下面给你几个靠谱的解决思路:
方案一:用官方配置直接指定定位规则(最推荐)
mmenu本身提供了positioning配置项,你可以强制菜单从一开始就基于触发按钮定位,跳过临时定位的步骤。
$("#menu").mmenu({ positioning: { my: "left top", // 菜单的哪个点对齐目标元素 at: "left bottom", // 对齐目标元素的哪个点 of: $("#menu-button") // 绑定到你的触发按钮 }, // 保留你原来的其他配置 extensions: ["theme-dark"], navbar: { title: "My menu" } });
这个方法直接利用官方API修正定位逻辑,不会有兼容性问题,是最稳妥的方案。
方案二:用CSS隐藏初始状态,避免跳动过程
如果不想修改JS配置,可以通过CSS让菜单在位置计算完成前完全不可见,等定位好再显示:
/* 初始状态隐藏菜单 */ .mm-menu { visibility: hidden; opacity: 0; transition: visibility 0s, opacity 0.3s ease; } /* 菜单打开时显示 */ .mm-menu.mm-opened { visibility: visible; opacity: 1; }
这样用户只会看到菜单从目标位置平滑出现,不会看到从左上角移过来的过程。
方案三:手动提前设置初始位置(特殊场景兜底)
如果上面两种方法都不生效,可以在初始化mmenu之前,手动把菜单定位到触发按钮的下方,提前对齐:
// 先获取触发按钮的位置和高度 const btn = $("#menu-button"); const btnOffset = btn.offset(); const btnHeight = btn.outerHeight(); // 提前设置菜单的初始位置,先隐藏 $("#menu").css({ position: "absolute", top: `${btnOffset.top + btnHeight}px`, left: `${btnOffset.left}px`, visibility: "hidden" }); // 再初始化mmenu $("#menu").mmenu({ // 你的原有配置 }); // 点击按钮时显示菜单 btn.on("click", function() { $("#menu").css("visibility", "visible"); });
优先试试方案一,官方配置的适配性最好;如果有特殊样式冲突,再用方案二或三兜底。
内容的提问来源于stack exchange,提问作者Андрей
相关产品推荐
相关产品推荐

