Как обрамить несколько элементов в 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:18. |