javascript - Css 优先级导航栏(菜单)问题

标签 javascript jquery html css

我有一个简单的响应式菜单,有一个折叠菜单内容的功能,而不是转移到 Fiddle 上的向下字检查。 .

我面临的问题是,当我调整浏览器大小时菜单开始隐藏按钮名称 More 也随着调整浏览器大小时隐藏,我希望当菜单开始隐藏时它永远不会隐藏。

HTML

<div class="nav">
    <div class="navControl">
        <a href="#">Navigation</a>
    </div>
    <ul style=" height: 50px !important;">
        <li><a href="#" class="active">صفہ اول</a></li>
        <li><a href="#">تازہ ترین</a></li>
        <li><a href="#">پاکستان</a></li>
        <li><a href="#">دنیا</a></li>
        <li><a href="#">کھیل</a></li>
        <li><a href="#">فن و ثقافت</a></li>
        <li><a href="#">ماحولیات</a></li>
        <li><a href="#">کالم/بلاگ</a></li>
        <li><a href="#">فیچرز</a></li>
        <li><a href="#">ادب</a></li>
        <li><a href="#">اسلامی صفحہ</a></li> 
        <li><a href="#">تصاویر</a></li>
        <li><a href="#">ویڈیوز</a></li>       
        <li><a href="">ریڈیو</a></li>
    </ul>
</div>

CSS

.nav {
    background: #333;
    direction:rtl;
}

.nav .navControl {
    display: none;
    cursor: pointer;
}

.nav ul {
    list-style: none;
    margin-bottom: 0px !important;
    padding-right: 0px !important;
}

.nav li {
    display: block;
    position: relative;
    z-index: 2000;
}

.nav a {
    padding: 10px 10px;
    display: block;

    color: #fff;
    text-decoration: none;
    text-align: center;
}

.nav a:hover {
    color: #ccc;
}

.nav span {
    display: none;
}

.nav .dropdown {
    text-align: center;
}

.nav .dropdown li {
    margin: 0;
    display: inline-block;
}

.nav .dropdown a {
    padding: 0;
    border-right: 0;

    font-size: 0.8em;
}

.nav .dropdown li:last-child a {
    margin-right: 0;
}

.nav .dropdown ul {
    display: none;
}





/*----------------------------------------------------------------------------------------------------------------*\
    MEDIA QUERIES
\*----------------------------------------------------------------------------------------------------------------*/
@media all and (min-width: 600px) {
    .nav li {
        margin-right: -4px;
        display: inline-block;
    }

    .nav a {
       border-right: 1px solid #555;
    }

    .nav .dropdown {
        display: none;

        background: #333;

        position: absolute;
        top: 100%;
        left: 0;
    }

    .nav .dropdown li {
        display: block;
    }

    .nav .dropdown a {
        padding: 10px;
        margin-right: 0;

        white-space: nowrap;
        text-align: left;
    }

    .nav span {
        display: inline;

        position: relative;
        left: 5px;
    }

    .nav a:hover + .dropdown,
    .nav .dropdown:hover {
        display: block;
    }
}

JS

ResponsiveNav = function(nav, breakPoint) 
{   
    //if no nav container, output an error
    if(typeof nav === "undefined")
    {  
        console.log("The nav container needs setting.");
        return false;
    }

    //elements
    var navControl = nav.find(".navControl").first();
    var mainUL = nav.find("ul").first();
    var mainLIs = mainUL.children();
    var extraLI = $("<li class='extraDropdown'><a href='#'>More</a>");
    var extraDropdown = $("<ul class='dropdown'></ul>");    
    extraLI.append(extraDropdown);

    //variables
    var breakPoint = (typeof breakPoint != "number") ? 500 : breakPoint;
    var siteWidth = $(document).width();
    var lastSiteWidth = null;
    var navWidth = mainUL.width();
    var usingExtraDropdown = false;

    //listener for screen width
    $(window).resize(function() {
        siteWidth = $(document).width();
        navWidth = mainUL.width();
        checkNavType();
        lastSiteWidth = siteWidth;
    });

    //toggle nav when nav control is clicked
    navControl.on('click', function(event) {
        event.preventDefault();
        toggleNav();
    });

    //check if to use mobile nav or not
    checkNavType();

    //added a extra dropdown if not already there
    function addExtraDropdown()
    {
        if (!usingExtraDropdown) {
            usingExtraDropdown = true;
            mainUL.append(extraLI);
        }
    }

    //make sure the LIs fit into the nav
    function checkLIsFit()
    {
        var widthLIs = 0;

        mainLIs = mainUL.children();

        mainLIs.each(function() {
            widthLIs += $(this).outerWidth(true);
        });

        //need a dropdown
        if(widthLIs > navWidth) {
            addExtraDropdown();
            moveLI();
        }
    }

    //move LIs to the extra dropdown from main nav
    function moveLI()
    {
        mainLIs = mainUL.children().not(".extraDropdown");

        extraDropdown.prepend(mainLIs.last());

        checkLIsFit();
    }

    //move all LIs from extra dropdown back to the nav
    function resetExtraDropdown()
    {
        usingExtraDropdown = false;

        var LIsToMove = extraDropdown.children();

        mainUL.find(".extraDropdown").remove();

        mainUL.append(LIsToMove);
    }

    //check if to use mobile nav or not
    function checkNavType()
    {
        if(siteWidth != lastSiteWidth)
        {
            if(siteWidth >= breakPoint)
            {
                navControl.hide();
                mainUL.show();
            }
            else {
                navControl.show();
                mainUL.hide();
            }

            resetExtraDropdown();
            checkLIsFit();
        }
    }

    //open or close nav
    function toggleNav()
    {   
        mainUL.slideToggle();
    }
};

$(function() 
        {
            $(".nav").each(function()
            {
                new ResponsiveNav($(this), 600);
            });
        });

最佳答案

当你计算 widthLIs 时,你没有考虑到你的 li.extraDropdown(More) 的宽度,它没有隐藏,而是转到下面的行因为不合适。

所以要修复它,只需用 40 或您想要的其他值(当然可以)像这样对其进行加星标:

function checkLIsFit()
{
    var widthLIs = 40; /*here*/

    mainLIs = mainUL.children();

    mainLIs.each(function() {
        widthLIs += $(this).outerWidth(true);
    });

    //need a dropdown
    if(widthLIs > navWidth) {
        addExtraDropdown();
        moveLI();
    }
}

Here a working jsfiddle example

关于javascript - Css 优先级导航栏(菜单)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31843202/

相关文章:

javascript - 申请后的 Facebook 链接

javascript - 吊装和可变范围

JavaScript - 如果电子邮件错误则设置类

javascript - 什么会影响键盘焦点 html?

javascript - 动态调整子和父div高度

javascript - 当文件类型匹配时,将 <a> 标签替换为 <audio tags>

javascript - 如何在悬停时更改页面上的元素?

jquery - 为什么从 Ajax 加载新文本后 jQuery Expander 就会停止工作?

javascript - AJAX动态页面更新

html - 背景图像无重复位置 : right not appearing. 图像引用正常。是什么赋予了?