根据屏幕大小,将菜单项合并到下拉列表

该博客介绍了如何使用HTML、CSS和JavaScript实现一个类似浏览器收藏栏的导航菜单。当菜单项超过一定数量时,超出部分将被隐藏并显示“更多”按钮。点击“更多”按钮,隐藏的菜单项会显示在一个绝对定位的接收器元素中。同时,代码实现了窗口大小改变时的响应式布局,确保菜单的适配性。
摘要由CSDN通过智能技术生成

类似效果,样式自行更改

跟浏览器收藏栏(如上图)类似

html

<nav class="nav-bar">
    <div class="container" style="position:relative" >
        <div id="navBar">
            <ul id="menuName">
                <li>List item 0</li>
                <li>List item 1</li>
                <li>List item 2</li>
                <li>List item 3</li>
                <li>List item 4</li>
                <li>List item 5</li>
                <li>List item 6</li>
                <li>List item 7</li>
                <li>List item 8</li>
                <li>List item 9</li>
                <li>List item 10</li>
                <li>List item 11</li>
                <li>List item 12</li>
                <li>List item 13</li>
                <li></li>
            </ul>
            <div id="more" style="display:none">more>></div>
        </div>
        <ul id="receiver"></ul>
    </div>
</nav>

js

<script>
    var menuNames = document.getElementById('menuName'),
        rec = document.getElementById('receiver'),
        more = document.getElementById('more');
    if (more) {
        more.onclick = moreClick
    }
    window.onresize = resize;
    resize();
    function resize() {
        const rChildren = rec.children;
        let numW = 0;

        [...rChildren].forEach(item => {
            item.outHTML = '';
            menuNames.appendChild(item);
        })

        const showWidth = menuNames.offsetWidth,
            tChildren = menuNames.children;

        [...tChildren].forEach(item => {
            numW += item.offsetWidth;

            if (numW > showWidth) {
                item.outHTML = '';
                rec.appendChild(item);
            }
        });

        //判断菜单列表的长度,决定‘more’显示与否
        if (menuNames.offsetWidth < 1420) {
            more.style.display = 'block'
        } else {
            more.style.display = 'none'
        }
    }

    function moreClick() {
        isHidden(rec) ? rec.style.display = 'block' : rec.style.display = 'none';
        function isHidden(el) {
            var style = window.getComputedStyle(el);
            return (style.display === 'none')
        }
    }
</script>

css

#navBar {
    display: flex;
    align-items: center;
}
#menuName {
    height: 20px;
    overflow: hidden;
    box-sizing: border-box;
    padding: 0;
}
#menuName li {
    float: left;
    padding:0 10px;
    box-sizing: border-box;
    list-style: none;
}
#receiver{
    position:absolute;
    right:5px;
    top:40px;
    width:100px;
    background:#1e7e34;
    border-radius: 10px;
    display:none;
    padding-left:10px;
}
#receiver li {
    list-style: none;
    width: 100px;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值