我正在制作一个响应式网站,其中包含导航叠加层(节点和子节点)。导航应该在桌面视图下分为4列或平板视图下分为2列。这是一个嵌套列表导航,所以一列是用<ul />
构建的。我的想法是,简单地将导航写在1列中,并使用jquery动态排列到4列或2列。
html:
<!-- overlay -->
<nav class="overlay">
<!-- ul for column -->
<ul>
<!-- nodes & subnodes -->
<li><a href="#">node</a>
<ul>
<li><a href="#">subnode</a></li>
<li><a href="#">subnode</a></li>
<li><a href="#">subnode</a></li>
<li><a href="#">subnode</a></li>
</ul>
</li>
<li><a href="#">node</a>
<ul>
<li><a href="#">subnode</a></li>
<li><a href="#">subnode</a></li>
<li><a href="#">subnode</a></li>
<li><a href="#">subnode</a></li>
<li><a href="#">subnode</a></li>
<li><a href="#">subnode</a></li>
<li><a href="#">subnode</a></li>
<li><a href="#">subnode</a></li>
</ul>
</li>
<li><a href="#">node</a> ...
</ul>
</nav>
我写了这个函数:
$.fn.arrangeObjects = function(wrapWith, maxCols) {
this.each(function() {
if ($(this).parent(wrapWith).length) $(this).unwrap();
});
this.parent().each(function() {
var $el = $(this).children();
amount = $el.length,
wrapAmount = amount / maxCols;
for (var i = 0; i < amount; i += wrapAmount) {
$el.slice(i, i + wrapAmount).wrapAll('<'+ wrapWith +'/>');
}
});
};
桌面端解雇:
$(".overlay > ul > li").arrangeObjects('ul', 4);
平板电脑解雇:
$(".overlay > ul > li").arrangeObjects('ul', 2);
这个解决方案将节点平均分成几列。不幸的是,这种方式看起来并不好看:
http://bern09.ch/notgood.png 我想要实现的是一种几乎相同列高的排列,就像这样:
http://bern09.ch/good.png 我必须以某种方式考虑子节点的数量,但我不知道如何实现。也许有人有很好的建议,稍微帮助一下就好了。