嵌套列表-在单独的一行上显示每个ul级别
Nested lists - show each ul level on a separate line
我正在使用jQuery的同位素插件来过滤条目列表,使用下面的标记来列出可能的过滤器。所有顶级列表项最初都是可见的,如果我单击特定的过滤器按钮,则会显示任何子过滤器(如果有的话)。
所有这些都很棒。然而,我在获取CSS以正确显示列表时遇到了一些问题。标记为:
<ul class="filter-list">
<li><button data-filter="*">show all</button></li>
<li>
<button data-filter=".filter1">Filter 1</button>
<ul class="sub-filter">
<li>
<button data-filter=".filter1.filtera">Filter 1,A</button>
<ul class="sub-filter">
<li><button data-filter=".filtera.filteri">Filter 1,A,i</button></li>
<li><button data-filter=".filtera.filterii">Filter 1,A,ii</button></li>
<li><button data-filter=".filtera.filteriii">Filter 1,A,iii</button></li>
</ul>
</li>
<li><button data-filter=".filter1.filterb">Filter 1,B</button></li>
<li>
<button data-filter=".filter1.filterc">Filter 1,C</button>
<ul class="sub-filter">
<li><button data-filter=".filterc.filteri">Filter 1,C,i</button></li>
<li><button data-filter=".filterc.filterii">Filter 1,C,ii</button></li>
</ul>
</li>
<li>
<button data-filter=".filter1.filterd">Filter 1,D</button>
<ul class="sub-filter">
<li><button data-filter=".filterd.filteri">Filter 1,D,i</button></li>
<li><button data-filter=".filterd.filterii">Filter 1,D,ii</button></li>
</ul>
</li>
</ul>
</li>
<li><button data-filter=".filter2">Filter 2</button></li>
<li><button data-filter=".filter3">Filter 3</button></li>
</ul>
到目前为止,我拥有的CSS是:
ul.filter-list {
display:inline-block;
position: relative;
width: 100%;
margin:0;
padding:0;
}
ul.filter-list ul {
display: none;
position:relative;
}
.filter-list ul.active-filter {
display: block;
position:absolute;
top:50px;
left:0px;
}
ul.filter-list li {
list-style-type: none;
display: inline-block;
}
我需要的预期输出是将列表的每个"级别"都放在一行上,然后是当前活动的过滤器的下一个"级别"(如果有的话)。最初,它应该是这样的:
show all Filter 1 Filter 2 Filter 3
如果我点击Filter 1
,那么过滤器下面的下一级按钮应该显示在下一行:
show all Filter 1 Filter 2 Filter 3
Filter 1,A Filter 1,B Filter 1,C Filter 1,D
如果我点击Filter 1,C
,第三级按钮将需要显示在第三行:
show all Filter 1 Filter 2 Filter 3
Filter 1,A Filter 1,B Filter 1,C Filter 1,D
Filter 1,C,i Filter 1,C,ii
我仍然面临的最大问题之一是,由于活动列表是绝对定位的,它们显示在紧接着这个过滤器列表的内容之上,而不是向下推。你可以在这把小提琴上看到这种行为。此外,当屏幕尺寸减小时,事情不会像我期望的那样流动/中断(以及将绝对定位的按钮放在其他绝对定位的项目上)。
有没有办法只使用CSS(也许使用相对定位?)来实现这一点,或者我必须在现有的基础上添加大量的Javascript?或者我应该去掉嵌套列表,而选择多个"平面"列表吗?
您可以仅使用常规CSS
和jQuery/Javascript
来切换项目可见性:
$(function() {
$('button').on('click', function() {
// The element to be toggled (show/hide).
var toToggle = $(this).next('.sub-filter');
// Go through its parents until the element
// with class sub-filter and find its
// children with this same class to hide
// them, excluding itself.
$(this).parents('.sub-filter').find('.sub-filter').not(toToggle).hide();
// Toggle the target.
toToggle.toggle();
});
});
* {
box-sizing: border-box;
}
ul.filter-list,
ul.filter-list li {
list-style-type: none;
margin: 0;
padding: 0;
}
ul.sub-filter {
/* Giving them the full width and
floating them you guarantee their
place in a new line. */
width: 100%;
float: left;
display: none;
/* Setting their padding to 0 will
keep them aligned to the line above
them. */
padding: 0;
}
ul.filter-list > li,
ul.sub-filter > li {
/* Setting their display to inline
will show them next to each other. */
display: inline;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="filter-list">
<li>
<button data-filter="*">show all</button>
</li>
<li>
<button data-filter=".filter1">Filter 1</button>
<ul class="sub-filter">
<li>
<button data-filter=".filter1.filtera">Filter 1,A</button>
<ul class="sub-filter">
<li>
<button data-filter=".filtera.filteri">Filter 1,A,i</button>
</li>
<li>
<button data-filter=".filtera.filterii">Filter 1,A,ii</button>
</li>
<li>
<button data-filter=".filtera.filteriii">Filter 1,A,iii</button>
</li>
</ul>
</li>
<li>
<button data-filter=".filter1.filterb">Filter 1,B</button>
</li>
<li>
<button data-filter=".filter1.filterc">Filter 1,C</button>
<ul class="sub-filter">
<li>
<button data-filter=".filterc.filteri">Filter 1,C,i</button>
</li>
<li>
<button data-filter=".filterc.filterii">Filter 1,C,ii</button>
</li>
</ul>
</li>
<li>
<button data-filter=".filter1.filterd">Filter 1,D</button>
<ul class="sub-filter">
<li>
<button data-filter=".filterd.filteri">Filter 1,D,i</button>
</li>
<li>
<button data-filter=".filterd.filterii">Filter 1,D,ii</button>
</li>
</ul>
</li>
</ul>
</li>
<li>
<button data-filter=".filter2">Filter 2</button>
</li>
<li>
<button data-filter=".filter3">Filter 3</button>
</li>
</ul>
演示jsFiddle
相关文章:
- 谷歌地图-数据库中的标记只显示最后一行的信息
- 允许为显示的每个数据表选择一行
- 隐藏的锚链接下降在下一行一旦显示
- 使用下拉选择菜单高亮显示一行表格单元格
- 从 html 表中选择一行(突出显示)并在单击按钮时发送值
- 文档的第一行.写的格式不正确,有时无法显示
- 选择并高亮显示一行中的单元格
- 在表格最后一行(链接)中显示菜单,并在单击菜单项时显示模式窗口
- 在同一行中为每个复选框显示和隐藏文本字段
- 如果最后一行已经显示,如何防止jQuery加载更多停止函数
- 展开/折叠显示一行,而隐藏其他行
- 当鼠标放在一行上时,jqplot会高亮显示该行
- 如何从.txt文件中提取内容并在HTML中随机显示一行
- 使用下拉选择菜单高亮显示一行表格单元格(不同情况)
- AngularJS:只显示一行,不显示另一行
- 在ng-repeat中突出显示一行的更有效方法?. .角的方式
- 如何在
中显示一行文本 - HTML+JavaScript:如何在JavaScript中单击按钮时突出显示一行
- 当日期比昨天早时,我如何突出显示一行
- 在单击时突出显示一行