Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Разбить выпадающее меню на 5 колонок (https://javascript.ru/forum/dom-window/74595-razbit-vypadayushhee-menyu-na-5-kolonok.html)

Alexandroppolus 23.07.2018 16:18

А вот, например, такой момент:

есть подпункты 1, 2, 3, ..., 9, 10

как они будут раскиданы по 5 колонкам? какой из двух вариантов:

1) Колонка 1: (1, 2), Колонка 2: (3, 4), Колонка 3: (5, 6), Колонка 4: (7, 8), Колонка 5: (9, 10),

2) Колонка 1: (1, 5), Колонка 2: (2, 6), Колонка 3: (3, 7), Колонка 4: (4, 8), Колонка 5: (5, 10),

Igorsrt 23.07.2018 16:20

Цитата:

Сообщение от j0hnik (Сообщение 490718)
а должно быть пять неполных?

Да именно пять неполных (причем неполная последняя колонка) - это же меню у меня будет

j0hnik 23.07.2018 16:21

<nav>
	<ul>
		<li><a href="[[!++site_url]]"><span>Пункт меню</span></a></li>
		<li>
			<a href="[[~70]]"><span>Пункт меню с выпадающим списком</span></a>
			<ul>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
			</ul>
		</li>
		<li><a href="[[!++site_url]]"><span>Пункт меню</span></a></li>
		<li><a href="[[!++site_url]]"><span>Пункт меню</span></a></li>
		<li><a href="[[!++site_url]]"><span>Пункт меню</span></a></li>
	</ul>
</nav>
<nav>
	<ul>
		<li><a href="[[!++site_url]]"><span>Пункт меню</span></a></li>
		<li>
			<a href="[[~70]]"><span>Пункт меню с выпадающим списком</span></a>
			<ul>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
			</ul>
		</li>
		<li><a href="[[!++site_url]]"><span>Пункт меню</span></a></li>
		<li><a href="[[!++site_url]]"><span>Пункт меню</span></a></li>
		<li><a href="[[!++site_url]]"><span>Пункт меню</span></a></li>
	</ul>
</nav>
<script>
	[].forEach.call(document.querySelectorAll('ul li ul'), function(elt){
		var z = Math.ceil(elt.querySelectorAll('li').length / 5);
		[].forEach.call(elt.querySelectorAll('li:nth-child('+z+'n-'+(z-1)+')'),function(el,i){
			el.insertAdjacentHTML('beforebegin', '<li><ul></ul></li>');
			var wrap = elt.querySelectorAll('li ul')[i];
			var x = z-1;
			while(x-- && el.nextElementSibling) wrap.appendChild(el.nextElementSibling);
			wrap.insertBefore(el, wrap.firstChild);
		});
		});
	
</script>

Igorsrt 23.07.2018 16:52

Да, вот так. Спасибо!

Igorsrt 23.07.2018 20:11

Извиняюсь что снова беспокою - моя вина, упустил еще один момент: в изначальном списке должен быть еще один элемент <li class="retractor">Закрыть</li>, т.е. начальная верстка такая:
<nav>
	<ul>
		<li><a href="[[!++site_url]]"><span>Пункт меню</span></a></li>
		<li>
			<a href="[[~70]]"><span>Пункт меню с выпадающим списком</span></a>
			<ul>
				<li class="retractor">Закрыть</li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
			</ul>
		</li>
		<li><a href="[[!++site_url]]"><span>Пункт меню</span></a></li>
		<li><a href="[[!++site_url]]"><span>Пункт меню</span></a></li>
		<li><a href="[[!++site_url]]"><span>Пункт меню</span></a></li>
	</ul>
</nav>
<script>
	[].forEach.call(document.querySelectorAll('ul li ul'), function(elt){
		var z = Math.ceil(elt.querySelectorAll('li').length / 5);
		[].forEach.call(elt.querySelectorAll('li:nth-child('+z+'n-'+(z-1)+')'),function(el,i){
			el.insertAdjacentHTML('beforebegin', '<li><ul></ul></li>');
			var wrap = elt.querySelectorAll('li ul')[i];
			var x = z-1;
			while(x-- && el.nextElementSibling) wrap.appendChild(el.nextElementSibling);
			wrap.insertBefore(el, wrap.firstChild);
		});
	});
	
</script>

так вот этот пункт "Закрыть" не должен учитываться при разбиении на блоки, т.е. должно получиться так:
<nav>
	<ul>
		<li><a href="[[!++site_url]]"><span>Пункт меню</span></a></li>
		<li>
			<a href="[[~70]]"><span>Пункт меню</span></a>
			<ul>
<li class="retractor">Закрыть</li>
				<li>
					<ul>
						<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
						<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
						<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
						<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
					</ul>
				</li>
				<li>
					<ul>
						<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
						<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
						<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
						<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
					</ul>
				</li>
				<li>
					<ul>
						<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
						<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
						<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
						<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
					</ul>
				</li>
				<li>
					<ul>
						<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
						<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
						<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
						<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
					</ul>
				</li>
				<li>
					<ul>
						<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
						<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
						<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
						<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
					</ul>
				</li>
			</ul>
		</li>
		<li><a href="[[!++site_url]]"><span>Пункт меню</span></a></li>
		<li><a href="[[!++site_url]]"><span>Пункт меню</span></a></li>
		<li><a href="[[!++site_url]]"><span>Пункт меню</span></a></li>
	</ul>
</nav>


думал, сам смогу разобраться, но что-то не получается

Igorsrt 23.07.2018 20:31

а нет, вроде получилось
))))

рони 23.07.2018 20:45

Igorsrt,
Пункт подменю - сколько элементов 20 или 21 пост №15?
начальная верстка такая: 21
должно получиться так: 20

рони 23.07.2018 21:00

разбить на пять колонок
 
Igorsrt,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
.item-box {
  border: 2px solid green;
}
  </style>
<script>
window.addEventListener("DOMContentLoaded", function() {
    function wrapEach(elements, wrapper, countToWrap, cls) {
        var container;
        [].forEach.call(elements, function(el, i) {
            i % countToWrap || (container = document.createElement(wrapper),
            cls && container.classList.add(cls),
            el.parentNode.replaceChild(container, el));
            container.appendChild(el)
        })
    }
    var ret = document.querySelectorAll(".retractor"),
        n = 5;
    [].forEach.call(ret, function(node) {
        var list = node.parentNode.querySelectorAll(".retractor ~ li"),
            num = Math.ceil(list.length / n);
        wrapEach(list, "ul", num);
        list = node.parentNode.querySelectorAll(".retractor ~ ul");
        wrapEach(list, "li", 1, "item-box")
    })
});
    </script>

</head>

<body>
<nav>
	<ul>
		<li><a href="[[!++site_url]]"><span>Пункт меню</span></a></li>
		<li>
			<a href="[[~70]]"><span>Пункт меню с выпадающим списком</span></a>
			<ul>
				<li class="retractor">Закрыть</li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
				<li><a href="[[~73]]"><span>Пункт подменю</span></a></li>
			</ul>
		</li>
		<li><a href="[[!++site_url]]"><span>Пункт меню</span></a></li>
		<li><a href="[[!++site_url]]"><span>Пункт меню</span></a></li>
		<li><a href="[[!++site_url]]"><span>Пункт меню</span></a></li>
	</ul>
</nav>


</body>
</html>


Часовой пояс GMT +3, время: 10:15.