Как произвольно разбить <ul> на columns?

116
26 мая 2021, 19:50

Всем привет! Обычным способом можно разбить "ul" на columns, прописав в стилях списка "columns: 3". Он сделает 3 колонки, по 2 "li" в каждой. В моем случае нужно сделать это с определенных мест, чтобы выглядело это, как в прикрепленном изображении. Или же как то указать количество "li" в каждой из колонок. Прошу вашей помощи, друзья!

<ul>
  <li class="list-item-1">List Item 1</li>
  <li class="list-item-2">List Item 2</li>
  <li class="list-item-3">List Item 3</li>
  <li class="list-item-4">List Item 4</li>
  <li class="list-item-5">List Item 5</li>
  <li class="list-item-6">List Item 6</li>
</ul>

Answer 1

ul {columns:3} 
 
li:nth-child(4), 
li:nth-child(6) { 
  -webkit-column-break-before: always; 
}
<ul> 
  <li class="list-item-1">List Item 1</li> 
  <li class="list-item-2">List Item 2</li> 
  <li class="list-item-3">List Item 3</li> 
  <li class="list-item-4">List Item 4</li> 
  <li class="list-item-5">List Item 5</li> 
  <li class="list-item-6">List Item 6</li> 
</ul>

Всё.

Answer 2

Решил сделать три отдельных li, и в каждый добавить новый ul.
C margin-padding и list-style: none; уже сами разберетесь)

let ul = document.getElementById('ul'); 
let li = ul.querySelectorAll('li'); 
 
let uls = [], lis = []; 
for( let i = 0; i < 3; i++ ){ 
  uls[i] = document.createElement('ul'); 
  lis[i] = document.createElement('li'); 
} // Создаю три новых li, чтобы добавить их к основному ul 
// И еще три ul, которые добавятся в созданные li 
 
let count = [3, 2, 1]; // Начальное распределение элементов 
for( let i = 6; i < li.length; i++ ){ 
  count[ i % 3 ]++; 
} // В случае добавления новых - сверху будет докидываться +1 элем, слева направо. 
console.log( JSON.stringify( count ) ); 
 
let sum = 0; 
for( let i = 0; i < count.length; i++ ){ 
  for( let j = sum; j < sum + count[i]; j++ ){ 
    uls[i].appendChild( li[j] ); 
  } // Все li в промежутке от sum до sum + count[i] — добавляются в созданные ul 
  sum += count[i]; 
} 
 
lis.forEach(function(e, i){ 
  e.appendChild( uls[i] ); // созданные ul пихаются в созданные li 
  ul.appendChild(e); // Созданные li пихаются в основной блок. 
});
#ul { 
  display: flex; 
} 
#ul > li { 
  padding: 0 25px; 
}
<ul id="ul"> 
  <li class="list-item-1">List Item 1</li> 
  <li class="list-item-2">List Item 2</li> 
  <li class="list-item-3">List Item 3</li> 
  <li class="list-item-4">List Item 4</li> 
  <li class="list-item-5">List Item 5</li> 
  <li class="list-item-6">List Item 6</li> 
  <li class="list-item-7">List Item 7</li> 
  <li class="list-item-8">List Item 8</li> 
  <li class="list-item-9">List Item 9</li> 
</ul>

P.s. хотя можно было сделать просто три ul и поставить их рядом, а родителя вообще удалить. Но мало-ли, вдруг там еще что-то привязано к этому элементу.

READ ALSO
Модульные css и глобальные классы

Модульные css и глобальные классы

Как переопределить в module scss глобальный класс officeUI fabric?

132
Зачем удалять динамические массивы, и что будет если их не удалять?

Зачем удалять динамические массивы, и что будет если их не удалять?

нам в универе сказали, что мы обязаны постоянно удалять массивы, если они динамические, но я так и не понял зачем и почемуВот, например, код...

95
C++, dynamic_cast и уточнение интерфейса

C++, dynamic_cast и уточнение интерфейса

Я уже долго пытаюсь придумать, как можно организовать игровую механику классического WormsМне удалось найти разные варианты, но все они со своими...

112
Ошибка при добавлении rc файлов Qt

Ошибка при добавлении rc файлов Qt

Проект был без ошибок, пока не добавила иконку приложение qt

101