gpt4 book ai didi

javascript - 在调整大小时操作 jquery 菜单以实现响应式布局

转载 作者:技术小花猫 更新时间:2023-10-29 12:10:30 25 4
gpt4 key购买 nike

有一个带有列表项的简单菜单。 UL李。 LI 的宽度和数量是动态的。并且在悬停/单击时有下拉式“更多”的东西,它将显示剩余的 LI ,这将不适合可用空间。

我尝试在用户从右向左调整窗口大小时使用 jquery,它会隐藏最后一个可见的菜单项。执行此反转并在“更多”链接中添加 LI 的可能方法是什么。

尝试了一些选项,因为当我们调整大小时宽度变小,然后列表项移动到下方并增加 UL 的高度,所以使用这种方法我能够隐藏最后一个可见的。代码

http://jsbin.com/flexmenu/2/edit

第一步

resize of window

第 2 步 enter image description here

第 3 步 enter image description here

当用户调整大小(增加宽度)时,这些步骤将相反

标记

<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:添加标记

最佳答案

好吧,我已经尝试构建一些脚本来执行此操作,这就是我得到的:

$().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
});

JSFiddle sample

必须更改您的 css 样式才能使其正常工作。我们所做的是:

  1. 获取父容器的宽度,主菜单的初始 width 为零,但我们可能需要显示附加菜单,因此我们也获取其大小。
  2. window.resize 上,我们遍历主菜单(水平)中的所有元素,在 ulWidth 变量中累积每个元素的宽度。
  3. 一旦主菜单的宽度大于父容器的宽度 -> 我们需要将其余菜单项移动到子菜单(垂直) - 所以我们将这些元素推送到数组 liForMoving
  4. 如果数组 liForMoving 为空 - 我们克隆它的元素,将它们附加到子菜单并从主菜单中删除它们。
  5. 如果 mainMenu 中所有元素的 width 小于其容器的宽度,我们需要检查是否可以将一些元素从子菜单移动到主菜单
  6. 我们遍历子菜单元素,抓取每个元素,附加到主菜单(如果菜单中有不同的字体和填充 - 元素的最终大小会有所不同),检查其大小是否适合父容器。如果它 - 我们从子菜单中删除元素 ($(moved[i]).remove()),如果不是 - 我们删除附加元素 (tmpLi.remove())
  7. 最后我们检查子菜单是否有任何元素,并显示/隐藏它。

关于javascript - 在调整大小时操作 jquery 菜单以实现响应式布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15420151/

25 4 0