mmenu 包裹所有正文元素而不是页面选择器

问题描述 投票:0回答:2

我已经启动并运行了 mmenu,并执行了我需要它执行的所有操作,除了它破坏了我的粘性页脚,因为它会自动将所有代码包装在其中

<body>

我的脚本有

page: { selector: "#page" }

我有我想要包裹在里面的内容

<div id="page"></div>
但它仍然包裹着一切。

我正在使用 mmenujs.com 的最新版本。

这是我所拥有的示例布局:

<html>
<head>
    <link href="mmenu/mmenu.css" rel="stylesheet" />
</head>
<body style="min-height: 100vh; display: flex; flex-direction: column;">
    <div id="page">All the page content</div>
    <div id="footer" style="padding-top: 30px; padding-bottom: 20px; margin-top: auto;">My sticky footer</div>
    <nav id="navmenu">
        <ul>
            <li><span>HOME</span></li>
            <li><span>Example</span>
            <ul>
                <li><span>Test</span></li>
            </ul>
            </li>
        </ul>
    </nav>
    <script src="mmenu/mmenu.js"></script>
    <script>
        document.addEventListener("DOMContentLoaded", () => {
            function mediaqueryresponse(mql) {
                var mmenuOptions = {
                    navbar: {
                        title: "My Menu"
                    },
                    offCanvas: {
                        page: {
                            selector: "#page"
                         },
                        position: "left-front"
                    },
                    pageScroll: {
                        scroll: true,
                        update: true
                    },
                    setSelected: {
                        current: "detect",
                        hover: true
                    },
                    sidebar: {
                        collapsed: {
                            use: "(min-width: 50px)"
                        },
                        expanded: {
                            use: "(min-width: 1024px)"
                        }
                    },
                    theme: "dark-contrast"
                };

                if (mql.matches) {
                    mmenuOptions.navbars = [
                        {
                            position: "top",
                            content: [
                                "prev",
                                "title",
                                "close"
                            ]
                        }
                    ];
                } else {
                    mmenuOptions.navbars = [
                        {
                            position: "top",
                            content: [
                                "prev",
                                "title"
                            ]
                        }
                    ];
                }

                new Mmenu("#navmenu", mmenuOptions);
            }

            const mql = window.matchMedia("screen and (max-width: 900px)");
            mediaqueryresponse(mql);
            mql.addListener(mediaqueryresponse);
        });
    </script>
</body>
</html>

发生的事情是这样的:

<div id="mm-4" class="mm-page mm-slideout">
<div id="page"></div>
<div id="footer"></div>
</div>

这打破了我粘性的页脚。

我需要它是:

<div id="mm-4" class="mm-page mm-slideout">
<div id="page"></div>
</div>
<div id="footer"></div>

我知道 offCanvas 正在工作,因为我可以将位置更改为“右前”,并且菜单出现在右侧。我还确认了在函数运行之前 #page 在 DOM 中。

当然,如果没有菜单,我的粘性页脚也能完美工作。

不确定我做错了什么,但感谢任何帮助。谢谢!

javascript html jquery sticky-footer mmenu
2个回答
0
投票

问题似乎是由 Mmenu 将内容包裹在画布外元素内的方式引起的。解决该问题并防止 Mmenu 将页脚包裹在画布外元素内。通过将页脚 div 移到 body 元素之外,它不会被包裹在画布外元素内,并且您的粘性页脚应该按预期工作。

  <html>
        <head>
        <link href="mmenu/mmenu.css" rel="stylesheet" />
        </head>
        <body style="min-height: 100vh; display: flex; flex-direction: column;">
        <div id="page">All the page content</div>
        <nav id="navmenu">
            <ul>
                <li><span>HOME</span></li>
                <li><span>Example</span>
                <ul>
                    <li><span>Test</span></li>
                </ul>
                </li>
            </ul>
        </nav>
        <script src="mmenu/mmenu.js"></script>
        <script>
            document.addEventListener("DOMContentLoaded", () => {
                function mediaqueryresponse(mql) {
                    var mmenuOptions = {
                        navbar: {
                            title: "My Menu"
                        },
                        offCanvas: {
                            page: {
                                selector: "#page"
                             },
                            position: "left-front"
                        },
                        pageScroll: {
                            scroll: true,
                            update: true
                        },
                        setSelected: {
                            current: "detect",
                            hover: true
                        },
                        sidebar: {
                            collapsed: {
                                use: "(min-width: 50px)"
                            },
    
                            expanded: {
                                use: "(min-width: 1024px)"
                            }
                        },
                        theme: "dark-contrast"
                    }
    
                    if (mql.matches) {
                        mmenuOptions.navbars = [
                            {
                                position: "top",
                                content: [
                                    "prev",
                                    "title",
                                    "close"
                                ]
                            }
                        ];
                    } else {
                        mmenuOptions.navbars = [
                            {
                                position: "top",
                                content: [
                                    "prev",
                                    "title"
                                ]
                            }
                        ];
                    }
    
                    new Mmenu("#navmenu", mmenuOptions);
                }
    
                const mql = window.matchMedia("screen and (max-width: 900px)");
                mediaqueryresponse(mql);
                mql.addListener(mediaqueryresponse);
            });
        </script>
    </body>
    </html>
    

0
投票

事实证明,虽然 Shweta Mishra 的答案不是解决问题的正确方法,但她的显示理念:flex;弯曲方向:列;最小高度:100vh;最终非常有帮助。

对于遇到此问题的其他人,需要执行以下操作。

  1. 完全重写了菜单触发脚本。这样做的原因显然是,如果您在菜单中进行媒体查询,它会以各种不同且非常糟糕的方式中断。因此,我简化了它并使其在不使用 js 媒体查询的情况下工作。

  2. 页面的offCanvas调用不再在选项中,而是在配置中,这意味着初始化菜单时需要单独编写它作为第二个参数。一旦我这样做了,它就按照应有的方式使用#page作为菜单。

  3. 如果您正在尝试编写响应式代码(并且您应该这样做),则需要使用菜单offCanvas配置选项clone: true。这可以防止菜单内容在方向改变或浏览器窗口大小调整时消失。

  4. 仍然有一些 CSS 样式需要覆盖,但回到 Shweta 关于页脚粘在底部的答案,我在 #page 上使用了她的建议,并将页脚放在 #page 内。这是让一切在所有浏览器和设备上正常工作的唯一方法。

该代码最终看起来像:

#page {
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}

希望这个答案可以帮助其他人!

© www.soinside.com 2019 - 2024. All rights reserved.