Was*_*ikh 17 html javascript css jquery responsive-design
有列表主题的简单菜单.UL LI.LI的宽度和数量是动态的.并且有一个下拉类型的东西"更多"悬停/点击它将显示剩余的LI,这将不适合可用空间.
当用户从右到左调整窗口大小时,我尝试使用jquery,它将隐藏最后一个可见的菜单项.有什么方法可以执行此反转并在"更多"链接中添加LI.
尝试了一些选项,因为当我们调整大小然后列表项移动到下面并且增加UL的高度时宽度更小所以使用这种方法我能够隐藏最后可见.码
http://jsbin.com/flexmenu/2/edit
步骤1

第2步
第3步
用户重新调整大小(增加宽度)时,这些步骤将反向
标记
<div class="twelve columns filter-wrapper">
    <ul class="nav-bar-filter" id="nav-bar-filter">
        <li><a href="#">All</a></li>
        <li><a href="#">Small</a></li>
        <li><a href="#">Medium</a></li>
        <li><a href="#">Extra large</a></li>
        <li><a href="#">Text</a></li>
        <li><a href="#">Small-1</a></li>
        <li><a href="#">Medium-1</a></li>
        <li><a href="#">Extra large text</a></li>
        <li><a href="#">Large text</a></li>
        <li><a href="#">Text</a></li>
    </ul>
<ul id="more-nav">
  <li><a href="#">More > </a>
    <ul class="subfilter"><li><a href="#">Text</a></li></ul>
  </li>    
</ul>
</div>
基本上这个菜单将用于响应式布局菜单.任何帮助都将有所帮助.编辑1:添加标记
Ser*_*gio 14
好吧,我已经尝试构建一些脚本来实现它,这就是我所拥有的:
$().ready(function () { 
    //we reconstruct menu on window.resize
    $(window).on("resize", function (e) {                                                   
        var parentWidth = $("#nav-bar-filter").parent().width() - 40;
        var ulWidth = $("#more-nav").outerWidth();                  
        var menuLi = $("#nav-bar-filter > li");                 
        var liForMoving = new Array();      
        //take all elements that can't fit parent width to array
        menuLi.each(function () {                       
            ulWidth += $(this).outerWidth(); 
            if (ulWidth > parentWidth) {
                console.log(ulWidth);
                liForMoving.push($(this));
            }
        });                         
        if (liForMoving.length > 0) {   //if have any in array -> move them to "more" ul
            e.preventDefault();                     
            liForMoving.forEach(function (item) {
                item.clone().appendTo(".subfilter");
                item.remove();
            });                         
        }
        else if (ulWidth < parentWidth) { //check if we can put some 'li' back to menu
            liForMoving = new Array();
            var moved = $(".subfilter > li");
            for (var i = moved.length - 1; i >= 0; i--) { //reverse order
                var tmpLi = $(moved[i]).clone();
                tmpLi.appendTo($("#nav-bar-filter"));
                ulWidth += $(moved[i]).outerWidth();
                if (ulWidth < parentWidth) {                                
                    $(moved[i]).remove();
                }
                else {
                    ulWidth -= $(moved[i]).outerWidth();
                    tmpLi.remove();
                }                           
            }                       
        }                       
        if ($(".subfilter > li").length > 0) { //if we have elements in extended menu - show it
            $("#more-nav").show();
        }
        else {
            $("#more-nav").hide();
        }
    });
    $(window).trigger("resize"); //call resize handler to build menu right
});
不得不改变你的CSS样式,使其正常工作.我们做的是:
width主菜单的初始值为零,但我们可能必须显示附加菜单,因此我们也得到它的大小.window.resize通过在主菜单累积在每个元素宽度的所有元素(水平)我们循环ulWidth变量.width主菜单超过width父容器 - >我们需要将其余菜单项移动到子菜单(垂直) - 所以我们将这些元素推送到数组liForMoving.liForMoving 不为空 - 我们克隆其元素,将它们附加到子菜单并从主菜单中删除它们.width所有元素mainMenu都小于其容器的宽度,我们需要检查是否可以将一些元素从子菜单移动到主菜单$(moved[i]).remove())中删除元素,如果不是 - 我们删除附加的元素(tmpLi.remove())raz*_*zak 10
$(document).ready(function () {
    var menu = $("#nav-bar-filter"),
        subMenu = $(".subfilter"),
        more = $("#more-nav"),
        parent = $(".filter-wrapper"),
        ww = $(window).width(),
        smw = more.outerWidth();
    menu.children("li").each(function () {
        var w = $(this).outerWidth();
        if (w > smw) smw = w + 20;
        return smw
    });
    more.css('width', smw);
    function contract() {
        var w = 0,
            outerWidth = parent.width() - smw - 50;
        for (i = 0; i < menu.children("li").size(); i++) {
            w += menu.children("li").eq(i).outerWidth();
            if (w > outerWidth) {
                menu.children("li").eq(i - 1).nextAll()
                    .detach()
                    .css('opacity', 0)
                    .prependTo(".subfilter")
                    .stop().animate({
                    'opacity': 1
                }, 300);
                break;
            }
        }
    }
    function expand() {
        var w = 0,
            outerWidth = parent.width() - smw - 20;
        menu.children("li").each(function () {
            w += $(this).outerWidth();
            return w;
        });
        for (i = 0; i < subMenu.children("li").size(); i++) {
            w += subMenu.children("li").eq(i).outerWidth();
            if (w > outerWidth) {
                var a = 0;
                while (a < i) {
                    subMenu.children("li").eq(a)
                        .css('opacity', 0)
                        .detach()
                        .appendTo("#nav-bar-filter")
                        .stop().animate({
                        'opacity': 1
                    }, 300);
                    a++;
                }
                break;
            }
        }
    }
    contract();
    $(window).on("resize", function (e) {
        ($(window).width() > ww) ? expand() : contract();
        ww = $(window).width();
    });
});
不得不修改CSS以使其工作.我没有为任何元素提供静态尺寸,因此无论内容如何,菜单都会响应.
工作原理:实在有2个功能contract()和expand(),当页面加载contract()将被调用时,如果它的扩大是调整窗口以额外的项目转移到子菜单,expand()将被调用,如果是承包contract()将改为调用.
更新:向右添加动画和固定子菜单位置,请参阅演示.