Макет сетки предоставляет несколько методов для изменения расположения элементов сетки. Я перечислил четыре ниже.
- Свойство
grid-template-areas
- Построчное размещение
- Свойство
order
- Функция
dense
свойства grid-auto-flow
. (Возможно, самое простое, легкое и надежное решение для этого типа макета, поскольку оно работает для любого количества элементов сетки.)
Вот оригинальный макет:
grid-container {
display: grid;
grid-template-columns: 15% 1fr 25%;
grid-auto-rows: 50px; /* for demo */
grid-gap: 10px;
}
/* non-essential decorative styles */
grid-item {
border: 1px solid gray;
background-color: lightgreen;
display: flex;
align-items: center;
justify-content: center;
}
grid-item:nth-child(2) {
background-color: orange;
}
<grid-container>
<grid-item>1</grid-item>
<grid-item>2</grid-item>
<grid-item>3</grid-item>
</grid-container>
jsFiddle demo 1
1. Свойство grid-template-areas
Свойство grid-template-areas
позволяет упорядочивать макет с использованием визуального искусства ASCII.
Поместите имена областей сетки (которые определены для каждого элемента) в том месте, где вы хотите, чтобы они отображались.
grid-container {
display: grid;
grid-template-columns: 15% 1fr 25%;
grid-auto-rows: 50px; /* for demo */
grid-gap: 10px;
grid-template-areas: "column-1 column-2 column-3";
}
grid-item:nth-child(1) { grid-area: column-1; }
grid-item:nth-child(2) { grid-area: column-2; }
grid-item:nth-child(3) { grid-area: column-3; }
@media ( max-width: 500px ) {
grid-container {
grid-template-columns: 1fr 1fr;
grid-template-areas: " column-1 column-3 "
" column-2 column-2 ";
}
}
/* non-essential decorative styles */
grid-item {
border: 1px solid gray;
background-color: lightgreen;
display: flex;
align-items: center;
justify-content: center;
}
grid-item:nth-child(2) {
background-color: orange;
}
<grid-container>
<grid-item>1</grid-item>
<grid-item>2</grid-item>
<grid-item>3</grid-item>
</grid-container>
jsFiddle demo 2
Из спецификации:
7.3. Именованные области: свойство grid-template-areas
Это свойство определяет именованные области сетки, которые не связаны с каким-либо конкретным элементом сетки, но на них можно ссылаться из свойств размещения в сетке.
Синтаксис свойства grid-template-areas
также обеспечивает визуализацию структуры сетки, что упрощает понимание общей компоновки контейнера сетки.
Все строки должны иметь одинаковое количество столбцов, иначе объявление недействительно.
Если именованная область сетки охватывает несколько ячеек сетки, но эти ячейки не образуют один заполненный прямоугольник, объявление недействительно.
Примечание. Непрямоугольные или отдельные области могут быть разрешены в будущей версии этого модуля.
2. Построчное размещение
Используйте grid-row-start
, grid-row-end
, grid-column-start
, grid-column-end
или их сокращения, grid-row
и grid-column
, чтобы установить размер и положение элемента сетки в сетке.
grid-container {
display: grid;
grid-template-columns: 15% 1fr 25%;
grid-auto-rows: 50px; /* for demo */
grid-gap: 10px;
}
@media ( max-width: 500px ) {
grid-container { grid-template-columns: 1fr 1fr; }
grid-item:nth-child(1) { grid-row: 1 / 2; grid-column: 1 / 2; }
grid-item:nth-child(2) { grid-row: 2 / 3; grid-column: 1 / 3; }
grid-item:nth-child(3) { grid-row: 1 / 2; grid-column: 2 / 3; }
}
/* non-essential decorative styles */
grid-item {
border: 1px solid gray;
background-color: lightgreen;
display: flex;
align-items: center;
justify-content: center;
}
grid-item:nth-child(2) {
background-color: orange;
}
<grid-container>
<grid-item>1</grid-item>
<grid-item>2</grid-item>
<grid-item>3</grid-item>
</grid-container>
jsFiddle demo 3
Из спецификации:
8.3. Построчное размещение: свойства grid-row-start
, grid-column-start
, grid-row-end
и grid-column-end
3. Свойство order
Свойство order
в Grid Layout выполняет те же функции, что и в Flex Layout.
grid-container {
display: grid;
grid-template-columns: 15% 1fr 25%;
grid-auto-rows: 50px; /* for demo */
grid-gap: 10px;
}
@media ( max-width: 500px ) {
grid-container { grid-template-columns: 1fr 1fr; }
grid-item:nth-child(1) { order: 1; }
grid-item:nth-child(2) { order: 3; grid-column: 1 / 3; }
grid-item:nth-child(3) { order: 2; }
}
/* non-essential decorative styles */
grid-item {
border: 1px solid gray;
background-color: lightgreen;
display: flex;
align-items: center;
justify-content: center;
}
grid-item:nth-child(2) {
background-color: orange;
}
<grid-container>
<grid-item>1</grid-item>
<grid-item>2</grid-item>
<grid-item>3</grid-item>
</grid-container>
jsFiddle demo 3
Из спецификации:
6.3. Переупорядоченные элементы сетки: свойство order
4. Функция dense
свойства grid-auto-flow
.
Это решение, пожалуй, самое простое, легкое и надежное из всех представленных здесь, поскольку оно работает для любого количества элементов сетки.
Хотя это решение не дает каких-либо серьезных преимуществ перед тремя предыдущими в макете, описанном в вопросе, который состоит всего из трех элементов сетки, оно предлагает огромные преимущества, когда количество элементов сетки больше или динамически генерируемый.
Этот вопрос и приведенные выше решения касаются этого:
01 03
02 02
Но, допустим, нам это нужно:
01 03
02 02
04 06
05 05
07 09
08 08
10 12
11 11
and so on...
Используя grid-template-areas
, размещение по строкам и order
, решение потребовало бы большого количества жесткого кодирования (если бы мы знали общее количество элементов) и, возможно, настраиваемых свойств CSS и / или JavaScript (если элементы были созданы динамически).
Однако функция dense
CSS Grid просто и легко справляется с обоими сценариями.
Применяя grid-auto-flow: dense
к контейнеру, каждый третий элемент заполняет пустую ячейку, созданную в результате последовательного упорядочивания.
grid-container {
display: grid;
grid-template-columns: 15% 1fr 25%;
grid-auto-rows: 50px;
grid-gap: 10px;
}
@media (max-width: 500px) {
grid-container {
grid-template-columns: 1fr 1fr;
grid-auto-flow: dense; /* KEY RULE; deactive to see what happens without it;
defaults to "sparse" (consecutive ordering) value */
}
grid-item:nth-child(3n + 2) {
grid-column: 1 / 3;
}
}
/* non-essential decorative styles */
grid-item {
border: 1px solid gray;
background-color: lightgreen;
display: flex;
align-items: center;
justify-content: center;
}
grid-item:nth-child(-n + 3) { background-color: aqua; }
grid-item:nth-child(n + 4):nth-child(-n + 6) { background-color: lightgreen; }
grid-item:nth-child(n + 7):nth-child(-n + 9) { background-color: orange; }
grid-item:nth-child(n + 10):nth-child(-n + 12) { background-color: lightgray; }
<grid-container>
<grid-item>1</grid-item>
<grid-item>2</grid-item>
<grid-item>3</grid-item>
<grid-item>4</grid-item>
<grid-item>5</grid-item>
<grid-item>6</grid-item>
<grid-item>7</grid-item>
<grid-item>8</grid-item>
<grid-item>9</grid-item>
<grid-item>10</grid-item>
<grid-item>11</grid-item>
<grid-item>12</grid-item>
</grid-container>
jsFiddle demo 4
Из спецификации:
7.7. Автоматическое размещение: свойство grid-auto-flow
плотный
Если указано, алгоритм автоматического размещения использует алгоритм «плотной» упаковки, который пытается заполнить дыры в сетке раньше, если позже появятся более мелкие элементы.
Если этот параметр не указан, используется «разреженный» алгоритм, при котором алгоритм размещения перемещается только «вперед» в сетке при размещении элементов, и никогда не возвращается назад, чтобы заполнить пробелы.
person
Michael Benjamin
schedule
28.07.2017
order
, используемый во flexbox. gridbyexample.com/examples/example23 - person sol   schedule 28.07.2017