JSFiddle - React, Tailwind, and code Playground
HTML
<div class="menu">
<ul>
<li><a href="#">Main Link 1</a></li>
<li><a href="#">Main Link 2</a>
<ul class="multicolumn">
<li><a href="#">Sub Link 1</a></li>
<li><a href="#">Sub Link 2</a></li>
<li><a href="#">Sub Link 3</a></li>
<li><a href="#">Sub Link 4</a></li>
<li><a href="#">Sub Link 5</a></li>
<li><a href="#">Sub Link 6</a></li>
<li><a href="#">Sub Link 7</a></li>
<li><a href="#">Sub Link 8</a></li>
<li><a href="#">Sub Link 9</a></li>
<li><a href="#">Sub Link 10</a></li>
<li><a href="#">Sub Link 11</a></li>
<li><a href="#">Sub Link 11</a></li>
<li><a href="#">Sub Link 13</a></li>
<li><a href="#">Sub Link 14</a></li>
<li><a href="#">Sub Link 15</a></li>
<li><a href="#">Sub Link 16</a></li>
<li><a href="#">Sub Link 17</a></li>
<li><a href="#">Sub Link 18</a></li>
</ul>
</li>
<li><a href="#" >Main Item 3</a></li>
</ul>
</div>
CSS
.menu ul {
list-style:none;
}
.menu li ul {
width: 460px;
overflow: hidden;
}
.menu li li {
float: left;
width: 100%; /* 1 column - default*/
height: 1.5em;
}
JavaScript
// number of columns
var columns = 4;
var $ul = $('ul.multicolumn'),
$elements = $ul.children('li'),
breakPoint = Math.round($elements.length/columns);
$ordered = $('<div></div>');
function appendToUL(i) {
if ($ul.children().eq(i).length > 0) {
$ordered.append($ul.children().eq(i).clone());
}
else $ordered.append($('<li></li>'));
}
function reorder($el) {
$el.each(function(){
$item = $(this);
if ($item.index() >= breakPoint) return false;
appendToUL($item.index());
for (var i = 1; i < columns; i++) {
appendToUL(breakPoint*i+$item.index());
}
});
$ul.html($ordered.children().css('width',100/columns+'%'));
}
reorder($elements);