Динамические строки для grid-template-areas

У меня есть сетка с grid-template-areas, и я хочу, чтобы элементы с классом item-left отображались слева в одной колонке, а элементы с классом item-right - справа, как на скриншоте:

введите сюда описание изображения

Важный момент: количество элементов item-left и item-right всегда может быть разным. Поэтому я хочу, чтобы grid-template-areas работал динамически в рядах.

И я не могу менять html!

Сниппет:

ul {
    display: grid;
    grid-template-areas: "item-left item-right item-right item-right";
}

.item-left {
    grid-area: item-left;
}

.item-right {
    grid-area: item-right;
}

ul li ul {
    display: flex;
    flex-direction: column;
}
<ul>
    <li class="item-left">Itemn1</li>
    <li class="item-left">Itemn2</li>
    <li class="item-right">
        Itemn3
        <ul>
            <li>Sub Item 1</li>
            <li>Sub Item 2</li>
        </ul>
    </li>
    <li class="item-right">
        Itemn4
        <ul>
            <li>Sub Item 1</li>
            <li>Sub Item 2</li>
            <li>Sub Item 3</li>
        </ul>
    </li>
    <li class="item-left">Itemn5</li>
    <li class="item-right">
        Itemn6
        <ul>
            <li>Sub Item 1</li>
            <li>Sub Item 2</li>
            <li>Sub Item 3</li>
        </ul>
    </li>
    <li class="item-right">
        Itemn7
        <ul>
            <li>Sub Item 1</li>
            <li>Sub Item 2</li>
            <li>Sub Item 3</li>
        </ul>
    </li>
    <li class="item-right">
        Itemn8
        <ul>
            <li>Sub Item 1</li>
            <li>Sub Item 2</li>
            <li>Sub Item 3</li>
        </ul>
    </li>
    <li class="item-right">
        Itemn9
        <ul>
            <li>Sub Item 1</li>
            <li>Sub Item 2</li>
            <li>Sub Item 3</li>
        </ul>
    </li>
    <li class="item-right">
        Itemn10
        <ul>
            <li>Sub Item 1</li>
            <li>Sub Item 2</li>
        </ul>
    </li>
</ul>

Я пытался это сделать, но безуспешно.


Ответы (1 шт):

Автор решения: puffleeck

не идеально конечно... но для "не могу менять html" вроде неплохо

ul {
    display: grid;
    grid-template-columns: repeat(1fr 4);
    grid-auto-rows: 1fr; /*template area для этого надо было
    выкинуть - он фиксирует кол-во строк*/
    grid-auto-flow: column dense; /*сжимаем, убирая пустоты*/
}

.item-left {grid-column: 1;}
<ul>
    <li class="item-left">Itemn1</li>
    <li class="item-left">Itemn2</li>
    <li class="item-right">
        Itemn3
        <ul>
            <li>Sub Item 1</li>
            <li>Sub Item 2</li>
        </ul>
    </li>
    <li class="item-right">
        Itemn4
        <ul>
            <li>Sub Item 1</li>
            <li>Sub Item 2</li>
            <li>Sub Item 3</li>
        </ul>
    </li>
    <li class="item-left">Itemn5</li>
    <li class="item-right">
        Itemn6
        <ul>
            <li>Sub Item 1</li>
            <li>Sub Item 2</li>
            <li>Sub Item 3</li>
        </ul>
    </li>
    <li class="item-right">
        Itemn7
        <ul>
            <li>Sub Item 1</li>
            <li>Sub Item 2</li>
            <li>Sub Item 3</li>
        </ul>
    </li>
    <li class="item-right">
        Itemn8
        <ul>
            <li>Sub Item 1</li>
            <li>Sub Item 2</li>
            <li>Sub Item 3</li>
        </ul>
    </li>
    <li class="item-right">
        Itemn9
        <ul>
            <li>Sub Item 1</li>
            <li>Sub Item 2</li>
            <li>Sub Item 3</li>
        </ul>
    </li>
    <li class="item-right">
        Itemn10
        <ul>
            <li>Sub Item 1</li>
            <li>Sub Item 2</li>
        </ul>
    </li>
</ul>

→ Ссылка