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)

Igorsrt 23.07.2018 14:54

Разбить выпадающее меню на 5 колонок
 
Здравствуйте!
Имеется обычное двухуровневое меню на CMS Modx вида:
<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>
			</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>

Пункты меню добавляются из админки сайта и соответсвенно их количество будет меняться. Можно ли с помощью js разбивать выпадающее меню на 5 одинаковых колонок? Т.е. что бы в итоге верстка выглядела так:
<nav>
	<ul>
		<li><a href="[[!++site_url]]"><span>Пункт меню</span></a></li>
		<li>
			<a href="[[~70]]"><span>Пункт меню</span></a>
			<ul>
				<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>

Dilettante_Pro 23.07.2018 15:09

Igorsrt,
Посмотрите это

Igorsrt 23.07.2018 15:32

Цитата:

Сообщение от Dilettante_Pro (Сообщение 490705)

В этом примере, насколько я понимаю, заранее известно, что в каждом блоке будет по 2 элемента... У меня же количество пунктов в колонках будет меняться - т.е. получается нужно посдчитать общее количество, затем поделить на 5, а уже потом по Вашему примеру разбивать на колонки... а я в js не силен (

Dilettante_Pro 23.07.2018 15:50

Igorsrt,
Пример не мой, а j0hnik.:thanks:
Да, там заранее известно, что элементы объединяются по два, и делается цикл по нечетным элементам.
Вам же удобнее будет использовать цикл for с вычисленным шагом.
Самостоятельно пробовали что-то написать? В чем проблемы?

j0hnik 23.07.2018 15:55

<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>
			</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>
	var z = Math.floor(document.querySelectorAll('ul li ul li').length / 5);
		[].forEach.call(document.querySelectorAll('ul li ul li:nth-child('+z+'n-'+(z-1)+')'),function(el,i){
			el.insertAdjacentHTML('beforebegin', '<li><ul></ul></li>');
			var wrap = document.querySelectorAll('ul li ul li ul')[i];
			var x = z-1;
			while(x-- && el.nextElementSibling) wrap.appendChild(el.nextElementSibling);
			wrap.insertBefore(el, wrap.firstChild);
		});
	
</script>


если ровно не делится остатки будут перекинуты в следующий блок

плохо что нет классов нигде

Dilettante_Pro 23.07.2018 16:03

j0hnik,
Тут еще есть проблема, если такие же блоки будут и в других пунктах меню.

j0hnik 23.07.2018 16:12

Dilettante_Pro,
без классов конечно трешак полный
<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>
			</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>
	<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>
			</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.floor(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:15

Цитата:

Сообщение от j0hnik (Сообщение 490710)
<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>
			</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>
	var z = Math.floor(document.querySelectorAll('ul li ul li').length / 5);
		[].forEach.call(document.querySelectorAll('ul li ul li:nth-child('+z+'n-'+(z-1)+')'),function(el,i){
			el.insertAdjacentHTML('beforebegin', '<li><ul></ul></li>');
			var wrap = document.querySelectorAll('ul li ul li ul')[i];
			var x = z-1;
			while(x-- && el.nextElementSibling) wrap.appendChild(el.nextElementSibling);
			wrap.insertBefore(el, wrap.firstChild);
		});
	
</script>


если ровно не делится остатки будут перекинуты в следующий блок

плохо что нет классов нигде

маленько не так... попробовал добавить в список еще пару элементов - появилась шестая колонка (а мне нужно именно 5)... классы добавить не проблема (они там вообще есть, это я так для упрощения все постирал... давайте например добавим в пример <nav class="mymenu">, что бы конкретная привязка была)

j0hnik 23.07.2018 16:16

Dilettante_Pro,
а если будут еще и много меню, обернуть в форич еще раз :lol:

j0hnik 23.07.2018 16:17

Цитата:

Сообщение от Igorsrt
попробовал добавить в список еще пару элементов - появилась шестая колонка...

а должно быть пять неполных?


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