CSS Flex, не ограничивающий порядок элементов списка
Мне удалось получить это решение, чтобы изменить порядок каждые 1, 2 и т. Д.... так 1,3,2,5,4, но есть ли возможность изменить это так, не имеет значения, сколько элементов списка и более динамично?
ul {
display: flex;
flex-direction: column;
}
li:nth-child(1),
li:nth-child(3) {
order: -3;
}
li:nth-child(2),
li:nth-child(5) {
order: -2;
}
li:nth-child(4),
li:nth-child(7) {
order: -1;
}
<h1>TEST 1:</h1>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
</ul>
<h1>TEST 2:</h1>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>10</li>
<li>11</li>
<li>12</li>
<li>13</li>
<li>14</li>
<li>15</li>
</ul>
2 ответа
есть ли какие-то поправки, поэтому не имеет значения, сколько элементов списка и более динамично?
Если это только шаблон, который вы ищете, где изображение и текст меняются между левым и правым каждые 2-й ряд, вы можете сделать это следующим образом
ul {
display: flex;
flex-wrap: wrap;
align-items: flex-start;
list-style: none;
padding: 0;
margin: 0;
}
ul li {
display: flex;
width: calc(50% - 10px);
margin: 5px;
background: lightgray;
box-sizing: border-box;
}
ul li:nth-child(4n+1) div:first-child,
ul li:nth-child(4n+2) div:first-child {
order: 1;
}
ul li div:first-child {
width: 66.66%;
background: lightgreen;
padding: 40px 10px;
text-align: center;
}
ul li div:last-child {
width: 33.33%;
background: lightblue;
padding: 40px 10px;
text-align: center;
}
@media screen and (max-width: 600px) {
ul li {
width: calc(100% - 10px);
}
ul li:nth-child(4n+1) div:first-child,
ul li:nth-child(4n+2) div:first-child {
order: 0;
}
ul li:nth-child(odd) div:first-child {
order: 1;
}
}
<ul>
<li><div>1. image</div><div>text</div></li>
<li><div>2. image</div><div>text</div></li>
<li><div>3. image</div><div>text</div></li>
<li><div>4. image</div><div>text</div></li>
<li><div>5. image</div><div>text</div></li>
<li><div>6. image</div><div>text</div></li>
<li><div>7. image</div><div>text</div></li>
<li><div>8. image</div><div>text</div></li>
<li><div>9. image</div><div>text</div></li>
<li><div>10. image</div><div>text</div></li>
<li><div>11. image</div><div>text</div></li>
</ul>
Если это должно быть как на связанной странице " Уличные бобовые мешки", которые структурировали свои элементы в группы по 4, тогда будет произведено изменение разметки, как показано в этом примере.
div {
display: flex;
flex-direction: column;
}
div ul {
width: 100%;
display: flex;
flex-wrap: wrap;
align-items: flex-start;
list-style: none;
padding: 0;
margin: 0;
}
div ul li {
display: flex;
width: calc(50% - 10px);
margin: 5px;
background: lightgray;
box-sizing: border-box;
}
div ul li:nth-child(even),
div ul li:nth-child(odd) div:first-child {
order: 1;
}
div ul li div:first-child {
width: 66.66%;
background: lightgreen;
padding: 40px 10px;
text-align: center;
}
div ul li div:last-child {
width: 33.33%;
background: lightblue;
padding: 40px 10px;
text-align: center;
}
@media screen and (max-width: 600px) {
div ul li {
width: calc(100% - 10px);
}
div ul li:nth-child(even) {
order: 0;
}
}
<div>
<ul>
<li><div>1. image</div><div>text</div></li>
<li><div>2. image</div><div>text</div></li>
<li><div>3. image</div><div>text</div></li>
<li><div>4. image</div><div>text</div></li>
</ul>
<ul>
<li><div>5. image</div><div>text</div></li>
<li><div>6. image</div><div>text</div></li>
<li><div>7. image</div><div>text</div></li>
<li><div>8. image</div><div>text</div></li>
</ul>
<ul>
<li><div>9. image</div><div>text</div></li>
<li><div>10. image</div><div>text</div></li>
<li><div>11. image</div><div>text</div></li>
</ul>
</div>
Вы можете достичь этого эффекта на любой длине списка с помощью короткого фрагмента JavaScript.
Начиная с третьего пункта списка...
- сценарий возьмет третий элемент списка и поместит его перед предшественником
- затем он перейдет к пятому элементу списка и поместит его перед своим предшественником
- затем он перейдет к седьмому элементу списка и т. д.
Рабочий пример:
var lists = document.getElementsByTagName('ul');
for (var i = 0; i < lists.length; i++) {
var items = lists[i].getElementsByTagName('li');
for (var j = 2; j < items.length; j = j + 2) {
lists[i].insertBefore(items[j], items[(j-1)]);
}
}
div {
float: left;
width: 100px;
}
<div>
<h2>Test 1</h2>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
</ul>
</div>
<div>
<h2>Test 2</h2>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>10</li>
<li>11</li>
<li>12</li>
</ul>
</div>
<div>
<h2>Test 3</h2>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>10</li>
<li>11</li>
<li>12</li>
<li>13</li>
<li>14</li>
<li>15</li>
<li>16</li>
</ul>
</div>