У меня есть следующий HTML:
<ul>
<li>
<p>A</p>
<p>B</p>
<p>C</p
<p>D</p>
</li>
<li>
<p>AAA</p>
<p>BBB</p>
<p>CCC</p
<p>DDD</p>
</li>
<li>
<p>A</p>
<p>B</p>
<p>C</p
<p>D</p>
</li>
<li>
<p>AAAAAA</p>
<p>BBBBBB</p>
<p>CCCCCC</p
<p>DDDDDD</p>
</li>
</ul>
Фактическое количество li
является переменным, но каждый li
всегда будет иметь 4 тега p
.
Я хочу разместить это в сетке CSS:
+--------+--------+--------+--------+
| A | B | C | D |
+--------+--------+--------+--------+
| AAA | BBB | CCC | DDD |
+--------+--------+--------+--------+
| A | B | C | D |
+--------+--------+--------+--------+
| AAAAAA | BBBBBB | CCCCCC | DDDDDD |
+--------+--------+--------+--------+
Итак, ul
имеет сетку с 4 столбцами, и каждый li
является подсеткой.
Но когда ширина экрана меньше 650 пикселей, я хочу переключить макет на макет с двумя столбцами и изменить порядок тегов p
:
+--------+--------+
| A | C |
+--------+--------+
| B | D |
+--------+--------+
| AAA | CCC |
+--------+--------+
| BBB | DDD |
+--------+--------+
| A | C |
+--------+--------+
| B | D |
+--------+--------+
| AAAAAA | CCCCCC |
+--------+--------+
| BBBBBB | DDDDDD |
+--------+--------+
Это то, что у меня есть на данный момент:
ul {
list-style: none;
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
grid-template-areas: "a b c d";
}
li {
display: grid;
grid-template-columns: subgrid;
grid-template-rows: subgrid;
grid-column: span 4;
}
li p:nth-of-type(1) {
grid-area: a;
}
li p:nth-of-type(2) {
grid-area: b;
}
li p:nth-of-type(3) {
grid-area: c;
}
li p:nth-of-type(4) {
grid-area: d;
}
@media (max-width: 650px) {
ul {
grid-template-columns: 1fr 1fr;
grid-template-areas: "a c" "b d";
}
li {
grid-row: span 2;
}
}
Первые две строки отображаются правильно, но после этого строки «ac» и «b d» перекрывают друг друга.
Как сделать так, чтобы макет не перекрывался?
Как я уже говорил в вопросе, всегда будет 4 столбца.
ul {
list-style: none;
display: grid;
grid-template-columns: repeat(4, 1fr);
/* Define 4 columns */
gap: 10px;
/* Optional: adds gap between rows/columns */
}
li {
display: grid;
grid-template-columns: repeat(4, 1fr);
/* Each li also has 4 columns */
}
li p:nth-of-type(1) {
grid-column: 1;
/* Position first p in the first column */
}
li p:nth-of-type(2) {
grid-column: 2;
/* Position second p in the second column */
}
li p:nth-of-type(3) {
grid-column: 3;
/* Position third p in the third column */
}
li p:nth-of-type(4) {
grid-column: 4;
/* Position fourth p in the fourth column */
}
@media (max-width: 650px) {
ul {
grid-template-columns: repeat(2, 1fr);
/* Only 2 columns in the ul */
}
li {
grid-template-columns: repeat(2, 1fr);
/* Each li has 2 columns */
}
li p:nth-of-type(1),
/* A and C are in the first column */
li p:nth-of-type(3) {
grid-column: 1;
}
li p:nth-of-type(2),
/* B and D are in the second column */
li p:nth-of-type(4) {
grid-column: 2;
}
}
Сетка переключается на 2 столбца для ul и li. Элементы p перемещаются так, что A и C находятся в первом столбце, а B и D — во втором столбце.
Я думаю, тебе это, ul
display: grid;
не нужно
li {
list-style: none;
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
grid-template-areas: "a b c d";
}
li p:nth-of-type(1) {
grid-area: a;
}
li p:nth-of-type(2) {
grid-area: b;
}
li p:nth-of-type(3) {
grid-area: c;
}
li p:nth-of-type(4) {
grid-area: d;
}
@media (max-width: 650px) {
li {
grid-template-columns: 1fr 1fr;
grid-template-areas: "a c" "b d";
}
}
<ul>
<li>
<p>A</p>
<p>B</p>
<p>C</p>
<p>D</p>
</li>
<li>
<p>AAA</p>
<p>BBB</p>
<p>CCC</p>
<p>DDD</p>
</li>
<li>
<p>A</p>
<p>B</p>
<p>C</p>
<p>D</p>
</li>
<li>
<p>AAAAAA</p>
<p>BBBBBB</p>
<p>CCCCCC</p>
<p>DDDDDD</p>
</li>
</ul>
Я бы не стал использовать здесь grid-area
, это, по сути, ненужное усложнение.
Переключатель довольно прост: просто (на соответствующей ширине) примените grid-auto-flow: column;
к li
.
* { margin: 0; padding: 0; min-width: 0; min-height: 0; box-sizing: border-box; } ::before, ::after { box-sizing:inherit; }
ul {
list-style: none;
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: .25em;
}
li {
display: grid;
grid-template-columns: subgrid;
grid-template-rows: subgrid;
grid-column: span 4;
border: 1px solid grey;
}
@media (max-width: 650px) {
ul {
grid-template-columns: 1fr 1fr;
}
li {
grid-row: span 2;
grid-auto-flow: column;
}
}
<ul>
<li>
<p>A</p>
<p>B</p>
<p>C</p>
<p>D</p>
</li>
<li>
<p>AAA</p>
<p>BBB</p>
<p>CCC</p>
<p>DDD</p>
</li>
<li>
<p>A</p>
<p>B</p>
<p>C</p>
<p>D</p>
</li>
<li>
<p>AAAAAA</p>
<p>BBBBBB</p>
<p>CCCCCC</p>
<p>DDDDDD</p>
</li>
</ul>
Что произойдет, если столбцов будет больше или меньше четырех? Кажется, вы жестко запрограммировали это число.