Как обрамить несколько элементов в ul
Суть задачи:
Обрамить пункты меню в UL для того, что бы меню росло не в высоту, а в ширину т.е. образовывались столбцы. Исходный HTML <ul class="menu"> <li><a href="#">Angelo Cappellini</a></li> <li><a href="#">Antico Borgo</a></li> <li><a href="#">Arca</a></li> <li><a href="#">Asnaghi Interiors</a></li> <li><a href="#">Bastex</a></li> <li><a href="#">BM Style</a></li> <li><a href="#">Caroti</a></li> </ul> И в итоге с помощью Jquery я хочу получить такое преобразование: <ul class="menu"> <li><a href="#">Angelo Cappellini</a></li> <li><a href="#">Antico Borgo</a></li> <li><a href="#">Arca</a></li> <li><a href="#">Asnaghi Interiors</a></li> </ul> <ul class="menu"> <li><a href="#">Bastex</a></li> <li><a href="#">BM Style</a></li> <li><a href="#">Caroti</a></li> </ul> Получилось, что меню разбивается на каждой четвертой по счету ссылке (li), таким образом при добавлении новых ссылок в меню - оно будет образовывать новые колонки и они будут выстраиваться по горизонтали (CSS). Пытался делать так: $(function() { $('ul.menu li:eq(4)').after('</ul>' + '<ul class="menu">'); }); Но далее знаний не хватает, а поиск дал больше вопросов, че ответов =( Благодарю) |
пробегаешь по li и формируешь в переменной новый список из ul. А потом существующий заменишь на получившийся.
|
$('ul.menu li').each(function (i) { if (i % 4 == 3) { $(this).after('</ul><ul class="menu">'); } }); |
Цитата:
А в условии сказано, что после 12 элемента добавить </ul><ul class="menu"> ? Или мне мануальчик перечитать надо? |
Цитата:
$(function() { $('ul.menu li').each(function (i) { if (i % 4 == 3) { $(this).after('</ul><ul class="menu">'); } }); }); Спасибо! |
На выходе получаю некорректный HTML
<ul class="menu"> <li><a href="#">Angelo Cappellini</a></li> <ul class="menu"></ul> <li><a href="#">Antico Borgo</a></li> <li><a href="#">Arca</a></li> <li><a href="#">Asnaghi Interiors</a></li> <li><a href="#">Bastex</a></li> <ul class="menu"></ul> <li><a href="#">BM Style</a></li> <li><a href="#">Caroti</a></li> <li><a href="#">Caspani Tino</a></li> </ul> Вероятно, что Jquery переставляет местами </ul> и <ul class="menu"> дабы исправить "ошибку". |
Работает что ли так? А если у родителя hlml() посмотреть?
|
Цитата:
|
Цитата:
|
За готовым кодом - в раздел работа, там за пару баксов сделают.
А тут попрошу потрудиться самому иначе не будет толка. Алгоритм уточню: 1) создаем контейнер накопления 2) пробегаем по li существующего при этом каждые 4-е запихиваем в отдельный ul 3) эти отдельные ul добавляем в контейнер 4) вместо исходного списка вставляем контейнер Используются только широко распространенные методы jQuery. Жду попыток. :) |
$('ul.menu').each(function(){ $('<ul class="menu"></ul>').append($('li:gt(4)', this)).insertAfter(this); }); |
Цитата:
|
Цитата:
|
Цитата:
$ulist = $('<div></div>'); |
Цитата:
Цитата:
|
Есть ещё такой вариант:
var num = 3; // кол-во четвёрок <li> for (var i = 0; i <= num; i++) { $('ul.menu li:lt(' + (i * 4) + '):gt(' + (i * 4 + 3) + ')').wrapAll('<ul class="menu"></ul>') } |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
$('ul.menu').each(function(){ var li = $('li',this), length = Math.ceil(li.length / 4), i = 0, uls = $('<div></div>'); for(; i < length; i++){ $('<ul class="menu"></ul>').append(li.filter(':gt(' + (i*4-1) + ')').filter(':lt(' + (i+1)*4 + ')')).appendTo(uls); } $(this).replaceWith(uls.children()); });Или элегантней, но не оптимально: $('ul.menu').each(function(){ var i = Math.ceil($('li',this).length / 4), uls = $('<div></div>'); while(i--) $('<ul class="menu"></ul>').append($('li',this).filter(':lt(4)')).appendTo(uls); $(this).replaceWith(uls.children()); }); |
Спасибо! Сравнив со своими потугами, понял, что пытался делать проще, но не получил бы рабочего кода.
|
Часовой пояс GMT +3, время: 05:07. |