调整菜单大小,尝试滚动时关闭手机

Resizing Menu, Closes on mobile when trying to scroll

本文关键字:滚动 手机 菜单 调整      更新时间:2024-03-22

我的代码:

! function(e) {
    e.fn.menumaker = function(n) {
        var s = e(this),
            t = e.extend({
                title: "Sky Walkers",
                format: "dropdown",
                breakpoint: 768,
                sticky: !1
            }, n);
        return this.each(function() {
            if (s.find("li ul").parent().addClass("has-sub"), "select" != t.format) s.prepend('<div id="menu-button">' + t.title + "</div>"), e(this).find("#menu-button").on("click", function() {
                e(this).toggleClass("menu-opened");
                var n = e(this).next("ul");
                n.hasClass("open") ? n.hide().removeClass("open") : (n.show().addClass("open"), "dropdown" === t.format && n.find("ul").show())
            }), multiTg = function() {
                s.find(".has-sub").prepend('<span class="submenu-button"></span>'), s.find(".submenu-button").on("click", function() {
                    e(this).toggleClass("submenu-opened"), e(this).siblings("ul").hasClass("open") ? e(this).siblings("ul").removeClass("open").hide() : e(this).siblings("ul").addClass("open").show()
                })
            }, "multitoggle" === t.format ? multiTg() : s.addClass("dropdown");
            else if ("select" === t.format) {
                s.append('<select style="width: 100%"/>').addClass("select-list");
                var n = s.find("select");
                n.append("<option>" + t.title + "</option>", {
                    selected: "selected",
                    value: ""
                }), s.find("a").each(function() {
                    console.log(e(this).parents("ul").length);
                    var s = e(this),
                        t = "";
                    for (i = 1; i < s.parents("ul").length; i++) t += "-";
                    n.append('<option value="' + e(this).attr("href") + '">' + t + s.text() + "</option")
                }), n.on("change", function() {
                    window.location = e(this).find("option:selected").val()
                })
            }
            return t.sticky === !0 && s.css("position", "fixed"), resizeFix = function() {
                e(window).width() > t.breakpoint && (s.find("ul").show(), s.removeClass("small-screen"), "select" === t.format && s.find("select").hide()), e(window).width() <= t.breakpoint && (s.find("ul").hide().removeClass("open"), s.addClass("small-screen"), "select" === t.format && s.find("select").show())
            }, resizeFix(), e(window).on("resize", resizeFix)
        })
    }
}(jQuery);
<div id="cssmenu">
  <ul>
     <li><a href="index.php"">Home</a></li>
     <li><a href="#">Boot Camp</a>
        <ul>
           <li><a href="th6.php">Townhall 6</a></li>
           <li><a href="th7.php">Townhall 7</a></li>
           <li><a href="th8.php">Townhall 8</a></li>
           <li><a href="th9.php">Townhall 9</a></li>
           <li><a href="th10.php">Townhall 10</a></li>
           <li><a href="th11.php">Townhall 11</a></li>
        </ul>
     </li>
     <li><a href="#">Information</a>
        <ul>
           <li><a href="about.php">About Us</a></li>
           <li><a href="contact.php">Contact Us</a></li>
        </ul>
     </li>
     <li><a href="#">Rules</a>
        <ul>
           <li><a href="rules.php">Normal</a></li>
           <li><a href="war.php">War</a></li>
        </ul>
     </li>
     <li><a href="#">Stats</a></li>
  </ul>
</div>

问题:当用户试图在移动设备上滚动时,它会关闭导航栏,这种情况只发生在手机上。我认为这与.show和.hide功能有关,但我无法让它发挥作用,我通常会在这个网站上发现自己,这是我第一次真正发布问题,但你们总是有答案的。请帮忙!我不想仅仅得到答案,我想知道如何解决这个问题以及应该采取的步骤。我正在努力学习javascript。注意:我没有对此进行编码。我不拥有这个导航栏,只是想修复它。

编辑:有没有办法绕过移动设备上的.显示和.隐藏?

注意!!!我找到了一个真正适用于此的修复程序

这段代码来自CSSMenuMaker网站的MenuMaker.min.js。

很多很多人都很失望,因为在以响应格式滚动时菜单会关闭。

这里有一个小见解:

  • 之所以会发生这种情况,是因为在移动设备上滚动时,会被视为"调整大小"事件。javascript要求在调整大小时关闭菜单,但显然这对试图在触摸滚动设备上操作菜单的最终用户来说效果不佳!!!

  • 我发现的其他一些解决方案是以某种方式从javascript中"删除"resizeFix函数。因此,一个解决方案是删除以下

    , e(window).on("resize", resizeFix)
    

然而,这将导致两个问题:

1) 当你从移动设备上的菜单导航到另一个页面后返回主页时,两个菜单会堆叠出现,直到你刷新页面(如果你不刷新,只有底部的菜单会运行),刷新后会恢复正常。

2) 当你从桌面上的"断点"上方开始,并将屏幕拖动到较小的大小时,响应菜单会混乱不堪,看起来支离破碎(而不是折叠成可以下拉的漂亮菜单)。这是因为resizeFix已删除。

解决方案:

当屏幕大小超过断点时,使用"if,else"操作来调用resizeFix函数,或者"else"调用相同的函数,但在最后使用e(frame).on("resize",resizeFix),因为使用"frame"不会破坏代码,但不会从上面产生问题#1,还允许在不关闭菜单的情况下滚动

因此,您的代码在底部应该是这样的:

if($(window).width()>768){
return t.sticky === !0 && s.css("position", "fixed"), resizeFix = function() {
            e(window).width() > t.breakpoint && (s.find("ul").show(), s.removeClass("small-screen"), "select" === t.format && s.find("select").hide()), e(window).width() <= t.breakpoint && (s.find("ul").hide().removeClass("open"), s.addClass("small-screen"), "select" === t.format && s.find("select").show())
        }, resizeFix(), e(window).on("resize", resizeFix)
}
else {
return t.sticky === !0 && s.css("position", "fixed"), resizeFix = function() {
            e(window).width() > t.breakpoint && (s.find("ul").show(), s.removeClass("small-screen"), "select" === t.format && s.find("select").hide()), e(window).width() <= t.breakpoint && (s.find("ul").hide().removeClass("open"), s.addClass("small-screen"), "select" === t.format && s.find("select").show())
        }, resizeFix(), e(frame).on("resize", resizeFix)
}
    })
}
}(jQuery);

自己试试吧!

我花了48小时通过研究其他人的想法并确定确切的问题来解决这个问题,然后在这段时间的24小时里,我的网站一直在运行,但有我上面列出的两个问题,直到我发现,在调整大小的最后一部分,用"框架"替换"窗口"可以让我的网站在移动大小下正常运行,而不会产生第一个问题,即返回主页将放置2个堆叠菜单。就在那时,我意识到,如果有一种方法可以只针对断点上的大小调用原始函数,那么问题#2就会得到解决,然后让它调用相同的函数,但在屏幕位于断点下时,在末尾插入"window"的"frame",那么理论上,这将解决所有问题,并允许在不关闭菜单的情况下进行移动滚动。

天哪,我是对的!

我对javascript了解不多,这是我第一次尝试解决和发布问题,老实说,我很自豪,因为我的研究让我从比我更了解js的聪明人那里得到了很多聪明的想法,但我能够解决它,但他们没有!

事实上,我之所以找到这篇文章,是因为我还在寻找解决方案。但我回来发布了一个解决方案,因为当我在谷歌或类似的地方键入"滚动时菜单关闭"时,这个链接会出现在第一页顶部附近的SERP中。我想其他人可能会发现它,并像我一样非常高兴。

CSSMenuMaker的注册和登录也被窃听了,所以我无法帮助那些可能在网站上搜索评论的人,他们也遇到了同样的麻烦。我看到了一些建议,但没有任何帮助,或者只是另一个功能被破坏,而不是一个功能齐全的菜单。

我真的希望你能得到这个,我知道你很久以前就发布了,但就像我说的,也许其他人会看到这个并从中受益。

干杯,伙计们!!!-TucciMane