Изменение порядка столбцов в сетке CSS

У меня есть следующий 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» перекрывают друг друга.

Как сделать так, чтобы макет не перекрывался?

Что произойдет, если столбцов будет больше или меньше четырех? Кажется, вы жестко запрограммировали это число.

Paulie_D 09.07.2024 17:56

Как я уже говорил в вопросе, всегда будет 4 столбца.

ICR 16.07.2024 11:04
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
1
2
55
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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 — во втором столбце.

Я думаю, тебе это, uldisplay: 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>

Другие вопросы по теме