- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个导航系统,我希望父级 ul
和所有子级 uls
跨越 100% 宽度,当您单击 li
与 child ul
, parent 从左边滑出, child 从右边滑入。这是我到目前为止所拥有的:
$(function() {
$('.list-container ul > li.has-child').each(function() {
$(this).find('ul').prepend('<li class="back">< Back</li>');
});
$(document).on('click', '.list-container ul > li', function(e) {
e.stopPropagation();
var children = $(this).find('ul');
if (!$(this).hasClass('back')) {
if (children.length > 0) {
$(this).parent().css('left','-100%');
$(this).find('ul > li').css('display','block');
$(this).find('ul').css('left','100%');
}
}
});
$(document).on('click','li.back', function(e) {
e.stopPropagation();
$(this).parent().parent().parent().css('left','0');
$(this).parent().css('left','200%');
});
});
html,body {
height:100%;
margin:0;
}
.list-container {
overflow:hidden;
width:100%;
}
ul {
width:100%;
list-style-type:none;
padding:0;
margin:0;
position:absolute;
transition: all 0.5s ease;
}
li {
padding:10px 0 10px 15px;
border-bottom:1px solid black;
}
li.has-child:after {
display:inline-block;
content:">";
float:right;
margin-right:15px;
}
li > ul {
display:block;
left:200%;
top:0;
}
li > ul > li {
display:none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="list-container">
<ul>
<li class="has-child">Test 1
<ul>
<li class="has-child">Test 1 sub-menu
<ul>
<li>Test 1 sub-sub-menu</li>
</ul>
</li>
<li>Test 1 sub-menu a</li>
</ul>
</li>
<li class="has-child">Test 2
<ul>
<li>Test 2 sub-menu</li>
<li class="has-child">Test 2 sub-menu a
<ul>
<li>Test 2 sub-sub-menu</li>
</ul>
</li>
</ul>
</li>
<li class="has-child">Test 3
<ul>
<li>Test 3 sub-menu</li>
<li class="has-child">Test 3 sub-menu a
<ul>
<li>Test 3 sub-sub-menu</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
此代码按预期用于第一级/第二级元素,但一旦您尝试点击进入第三级(即“测试 1 子菜单”),它就会变得困惑。我现在意识到使用 divs
而不是 uls
可能会更好,但是任何人都可以建议如何在不修改 HTML 结构的情况下使它工作吗?如果有更好的方法来实现此功能,则愿意完全更改 jQuery/CSS。
最佳答案
This code is working as intended for the first/second level of items, but once you try to click through to the 3rd level(ie "Test 1 sub-menu") it gets messed up.
那是因为,您将 ul
移动一个常数 200%
,而子 ul
移动一个常数 +/-100%
。同时,您将主 ul
重置为 0
。除此之外,当您使用显示 block 显示菜单时,您不会隐藏它们。虽然这适用于第一级,但它会从第二级开始 split 。
I realize now that it probably would have been better to use divs for this rather than uls
是的,使用 div
可能会更好,因为与分层的 ul
相比,您可以更轻松地处理它们。但是,ul
对于层次结构来说会更具语义。
如果您不想更改 HTML 结构,那么最简单和最好的选择就是指定每个子菜单所在的 level
。这可以通过简单地添加一个每个 li
上的 data-
属性都有更多子项,您可以摆脱 .has-child
类。在 data-
属性中定义级别后,您可以使用这些属性将每个级别移动相应的系数。
下面是一个粗略的演示。请注意,尽管您已使用 jQuery
对其进行标记,但我还是使用普通的旧 vanila JavaScript 创建了此演示,因为这对我来说更容易、更快速。如果愿意,您可以将它转换为 jQuery,否则它应该可以正常工作,没有任何问题。
演示 fiddle :https://jsfiddle.net/abhitalks/euLzo2dg/
演示片段:
// keep things outside the global scope
(function (window, document) {
var attachTo = document.getElementsByClassName('list-container')[0];
prepareNav(attachTo); // attach nav to the div
function prepareNav(nav) {
// prepare nav by creating back links, setting styles, and click handler
var
navBar = nav.firstElementChild,
navElems = nav.querySelectorAll('li[data-level] > ul')
;
for (i=0; i < navElems.length; i++) {
var backLink = document.createElement('li');
backLink.className = 'back';
backLink.textContent = '\u3008' + ' Back';
navElems[i].insertBefore(backLink, navElems[i].firstElementChild);
}
navBar.style.left = '0%';
nav.addEventListener('click', function(e) {
startNav(e, navBar, navElems);
}, false);
}
function startNav(e, navBar, navElems) {
// click handler
if (e.target.dataset && e.target.dataset.level) {
// move main ul by negative multiples of level
navBar.style.left = -(e.target.dataset.level * 100) + '%';
// reset all menus by hiding those
[].forEach.call(navElems, function(ne) { ne.classList.remove('show'); });
// show the parent menu
e.target.parentNode.classList.add('show');
// show the current menu
e.target.firstElementChild.classList.add('show');
}
if (e.target.className === 'back') {
// move back the main ul by 100 (not to 100)
var leftPos = parseInt(navBar.style.left);
navBar.style.left = (leftPos + 100) + '%';
}
}
})(window, document);
* { box-sizing: border-box; margin: 0; padding: 0; font-family: sans-serif; }
html, body { height:100%; }
.list-container {
overflow: hidden; position: relative;
width: 100%; min-height: 128px;
}
.list-container ul {
width: 100%; background-color: #eee;
list-style-type: none;
position: absolute; left: 0%; top: 0%;
transition: all .5s ease;
}
.list-container li {
padding: 10px 0 10px 15px;
cursor: pointer; border: 1px solid #aaa;
}
.list-container li:first-child { border-bottom: none; }
.list-container li:last-child { border-top: none; }
.list-container li.back + li:last-child { border-top: 1px solid #aaa; }
.list-container li[data-level]::after {
display: inline-block; content: '\003009';
float: right; margin-right: 15px;
}
.list-container li[data-level]:hover,
.list-container li.back:hover { background-color: #ddd; }
.list-container li[data-level] > ul { left: 100%; top: 0; display: none; }
.list-container li[data-level] > ul.show { display: block; }
<div class="list-container">
<ul>
<li data-level="1">Test 1
<ul>
<li data-level="2">Test 1 sub-menu
<ul>
<li>Test 1 sub-sub-menu</li>
</ul>
</li>
<li>Test 1 sub-menu a</li>
</ul>
</li>
<li data-level="1">Test 2
<ul>
<li>Test 2 sub-menu</li>
<li data-level="2">Test 2 sub-menu a
<ul>
<li>Test 2 sub-sub-menu</li>
</ul>
</li>
</ul>
</li>
<li data-level="1">Test 3
<ul>
<li>Test 3 sub-menu</li>
<li data-level="2">Test 3 sub-menu a
<ul>
<li>Test 3 sub-sub-menu</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
关于jquery - 100% 宽度滑动多层 UL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42790931/
我正在尝试使用 jQuery 来提交一个基本的 Accordion 样式菜单。 这是菜单: http://www.cybart.com/bscg/ 这是为其提供 Accordion 功能的代码片段:
这是我的网站: http://www.simply-a-christian.com/index.html 在导航栏上,如果您移动到: 信念 玛丽安教义 您可以看到每个 Marian Dogma(列出了
这可能是一个很容易回答的问题,但是,我找不到解决方案。我已经建立了一个非常简单的菜单,每当我将鼠标悬停在 ul 父项上时,它的子项 ul ul 就会变得可见。基本上它是有效的,但 parent 让位于
这是一张图片: 问题是(你可以看到):“页面”按钮太低,无法点击。我想要的是它应该靠近“联系人”。 现在是代码: HTML Home About
我有一个这样的嵌套 ul 列表: Subcat Subcat2
如果标题不好理解,我来解释一下... 我有一个 css/jquery 切换菜单。按“+”号时它变大,按“-”号时它变小。我使几个元素的填充、边距和高度在切换/单击时发生变化。菜单顶部充满了链接,然后当
我正在尝试创建一个列表,该列表会在单击上/下时更改它的第一个元素。 This is what i want to do. 此代码运行良好。但问题是我也在我网站的主菜单中使用列表,并且这段代码也在我的主
我需要使用水平缩放的 ul > li > ul 的组合来创建一个菜单。每个 ul 都应该有一个 max-height 并在溢出时滚动。悬停在 li 上时,如果里面有另一个 ul 标签,它应该会在右侧打
我正在 ul 中编写 ul 来制作 Accordion 式菜单。但是当我在 html 验证器中检查下面的代码时,它给了我这些错误 Element ul not allowed as child of
我有两个列表,第二个列表是可排序的,我可以从第一个列表拖动到第二个列表,但不知道如何从第一个列表中删除。 如果我删除 helper: "clone" ,该项目 (li) 会被删除,但拖放操作效果不佳(
JSFiddle 问题:https://jsfiddle.net/td6szj3o/ /我有一个 ul li,每个 li 都有标准文本项。该列表是动态的,因此有时每个内容 li 小于其所在容器的 wi
我有两个元素 - 一个在另一个里面。问题是第二个元素显示在第一个 ul li 元素的顶部。 HTML: Home Merchants
我有一些结构如下的菜单: First level link 1 Child link 1 Child link 2
我有很长的ul,李的数目不是恒定的 1 2 3 4 5 6 7 8 9 我想使用Moovweb SDK将其分为两个ul。 1 2 3 4
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎偏离主题,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或 include a mini
我有一棵信息“树”,显示在许多嵌套列表中(ul li ul li ....)。两个问题: 当我点击时,父 ul 和子 ul 都会切换。 如果我点击在其中没有 ul 的嵌套列表中(例如,下面的 Cran
我正在尝试在 jQuery 中创建以下内容: 我有一个项目列表(例如 10 个)。如果项目数超过 6,则将剩余项目(从 6 到 10)复制到新的 UL 中以创建下拉菜单结构。 菜单的第一个版本是 ht
嘿大家 - 我在工作中尝试 jquery 的第二天,有点卡住了。 我有一个无序列表的链接..在无序列表的链接中 点击 ,我想要的 child 变得可见。 点击(文档上的任何位置)后,我想要 child
嗨,这就是我想要实现的目标。我有一个 ID="columns"的 div,在本例中我有 3 列,但可能会有更多或更少...我正在使用 JQuery 动态添加列表项。
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Using .after() to add html closing and open tags 我想显示高度几乎相
我是一名优秀的程序员,十分优秀!