ナビゲーションオーバーレイ(ノードとサブノード)を備えたレスポンシブWebサイトで作業しています。ナビゲーションは、デスクトップビューの場合は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
ある意味でサブノードの数を尊重する必要がありますが、それを実現する方法がよくわかりません。たぶん誰もが素晴らしいヒントを持っているので、少し助けていただければ幸いです。