Первоначальный ответ (прежде чем я понял, о чем вы спрашиваете):
В зависимости от того, как вы хотите <li>
с, вы можете использовать columns
...
div {
font-size: 30px;
padding: 30px;
}
ul {
display: inline-block;
column-width: 35px;
padding: 0;
list-style: none;
font-size: 10px;
columns: 2 0px;
}
li {
background: #9eff80;
margin: 1px;
padding: 2px;
opacity: 0.7;
width: 100%;
break-inside: avoid;
}
<div>
I'd like to have a list with several columns
<ul>
<li>A list</li>
<li>like this</li>
<li>with unknown</li>
<li>number and items</li>
<li>or columns.</li>
</ul>
in the middle of other text.
</div>
... или display:inline-flex
.Вам нужно установить max-width
для детей, установить flex-wrap: wrap
для родителя и указать желаемое vertical-align
для родителя:
div {
font-size: 30px;
padding: 30px;
}
ul {
display: inline-flex;
padding: 0;
list-style: none;
font-size: 10px;
flex-wrap: wrap;
line-height: 5em;
vertical-align: middle;
/* see also -webkit-baseline-middle
text-bottom
text-top */
}
li {
line-height: 1em;
flex: 0 1 auto;
margin: 1px;
width: calc(50% - 2px); /*deduct margin*/
background: #9eff80;
padding: 2px;
opacity: 0.7;
box-sizing: border-box;
}
<div>
I'd like to have a list with several columns
<ul>
<li>A list</li>
<li>like this</li>
<li>with unknown</li>
<li>number and items</li>
<li>or columns.</li>
</ul>
in the middle of other text.
</div>
Вероятно, наиболее важной частью всего этого является удаление height: 35px;
из ul
.Почему вы все равно жестко закодировали, если «Число элементов в списке неизвестно» ?
Правильный ответ (как этого можно достичь):
Похоже, вы хотите, чтобы ваши элементы отображались в виде неопределенной серии встроенных блоков, каждый из которых содержит 2 элемента или меньше.Вам все еще нужно определить, что должно произойти, когда содержимое ваших 2 элементов превысит желаемую высоту 35px
.
Вот как вы можете добиться этого, используя ванильный JavaScript.Если возможно, вы должны сделать это на стороне сервера, хотя:
let uls = document.querySelectorAll('ul');
for(let i = 0; i < uls.length; i++) {
let count = uls[i].children.length;
if (count && count > 2) {
for (j = 0; j < count/2; j++) {
let parent = uls[i].parentElement,
newUl = document.createElement('ul');
for (k = 0; k < 2; k++) {
li = uls[i].querySelector(':first-child');
if (li) {
newUl.appendChild(li);
parent.insertBefore(newUl, uls[i]);
}
}
}
}
}
div {
font-size: 30px;
padding: 30px;
}
ul {
display: inline-block;
padding: 0;
list-style: none;
font-size: 10px;
vertical-align: middle;
min-height: 35px;
}
li {
background: #9eff80;
padding: 2px;
margin: 1px;
opacity: 0.7;
}
<div>
I'd like to have a list with several columns
<ul>
<li>A list</li>
<li>like this</li>
<li>with unknown</li>
<li>number and items</li>
<li>or columns.</li>
<li>A list</li>
<li>like this</li>
<li>with unknown</li>
<li>number and items</li>
<li>or columns.</li>
<li>A list</li>
</ul>
in the middle of other text. I'd like to have a list with several columns
<ul>
<li>A list</li>
<li>like this</li>
<li>with unknown</li>
<li>number and items</li>
<li>or columns.</li>
<li>A list</li>
<li>like this</li>
<li>with unknown</li>
<li>number and items</li>
<li>or columns.</li>
<li>A list</li>
</ul>
in the middle of other text.
</div>
Это один из случаев, когда jQuery будет намного короче:
$('ul').each(function() {
while($('li', this).length > 2) {
let newUl = $('<ul/>'), i = 0;
while(i < 2) {
$('li', this).eq(0).appendTo(newUl);
i++;
}
newUl.insertBefore($(this));
}
})