根据屏幕尺寸替换导航栏 class

Replacing navbar class based on screen size

问题

如何使用 javascript.

交换 class 个导航栏

背景

我有一个固定的导航栏,我想在较小的屏幕尺寸(< 768 像素)上将其更改为静态导航栏,因为我的移动菜单推送器由于固定导航而出现布局问题。

HTML

<nav class="navbar navbar-default navbar-fixed-top" id="mynav">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle collapsed" data- 
 toggle="collapse" data-target="#navbar" aria-expanded="false" aria- 
   controls="navbar">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="#">Project name</a>
        </div>
        <div id="navbar" class="navbar-collapse collapse">
            <ul class="nav navbar-nav navbar-right">
                <li class="active"><a href="#">Home</a></li>
                <li><a href="#about">About</a></li>
                <li><a href="#products">Products</a></li>
                <li><a href="#contact">Contact</a></li>
            </ul>
        </div><!--/.nav-collapse -->
    </div>
</nav>

我尝试创建一个 javascript 函数来添加/删除静态导航 class 但由于某些原因它不起作用。

JS

function changeNav() {
    if ($(window).width() < 768) {
        $("#mynav").addClass("navbar-static-top");
        $("#mynav").removeClass("navbar-fixed-top");
    } else {
        $("#mynav").removeClass("navbar-static-top");
        $("#mynav").addClass("navbar-fixed-top"); 
    }
}
changeNav();

使用 css media queries 可能比 javascript 更容易完成。

示例:

@media (max-width: 768px) {
    // styles for device width <= 768px 
}

如果您真的想使用 javascript,那么 Abdeslem Charif 的回答是一个好的开始

你可以用这个代替,这个很合适,性能更好:

let lastState = false;
function checkForViewportChange () {
    var state = window.matchMedia("(max-width: 768px)").matches;
    if (state != lastState) {
        if (state) {
            //do your stuff here
        } else {
            //do your other stuff here
        }
        lastState = state
}}

window.setInterval (checkForViewportChange, 150);

您应该在每次用户调整屏幕大小时检查,使用 .resize() 方法

例如

$(window).resize(() => {
    let b = $(window).width() < 768;
    $("#mynav").addClass("navbar-"+(b ? "static":"fixed")+"-top");
    $("#mynav").removeClass("navbar-"+(b ? "fixed":"static")+"-top");
});