Перейти к содержимому

За что отвечает алгоритм dense html

  • автор:

Поэтапное руководство по алгоритму автоматического размещения из CSS Grid

В этом руководстве мы рассмотрим все этапы алгоритма автоматического размещения элементов из модуля CSS Grid Layout. Каждый этап управляется с помощью свойства grid-auto-flow . В своих других статьях “Introducing the CSS Grid Layout” и “Seven Ways You Can Place Elements Using CSS Grid Layout” автор рассмотрел спецификацию CSS Grid и проанализировал, как с помощью Grid можно позиционировать элементы на веб-странице. Однако в этих материалах в сетке явным образом задавалась позиция единственного элемента. Остальные элементы размещались с помощью некоего алгоритма.

Теперь разберем этот алгоритм. И когда в следующий раз вы обнаружите, что элемент оказался не там, где нужно, вам не придётся чесать затылок и удивляться, как так произошло.

Основные принципы

Прежде чем углубляться в подробности, рассмотрим некоторые основные принципы.

    Анонимные элементы сетки (Anonymous grid items). Если поместить текст напрямую в контейнер сетки, без обёртывания в какой-либо тег, то он превратится в анонимный элемент сетки. К таким элементам нельзя применять стили, но при этом они наследуют правила стилей от родительских контейнеров. Обратите внимание, что white space внутри контейнера сетки не приводит к созданию анонимного элемента.

Теперь активируйте в своём любимом современном браузере возможность использования экспериментальных функций, и рассмотрим подробности работы алгоритма при построении макета.

Этап #1: Генерирование анонимных элементов сетки

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

Следующий код генерирует анонимный элемент сетки из межэлементного текста (inter-element text):

 
1 Anonymous Item
2
3
4
5

В этом примере нужно отметить ещё и то, что алгоритм игнорирует CSS float’ы, применённые к div 2 и div 4.

Этап #2: Размещение элементов на явно указанные позиции

Для этого и следующих нескольких этапов мы воспользуемся сеткой из девяти разных элементов.

 
A
B
C
D
E
F
G
H
I

Первыми в сетку будут помещены элементы, для которых явно указаны позиции. В нашем случае пусть это будут элементы А и В. Пока что проигнорируем все остальные. Зададим позиции для А и В:

Алгоритм размещает A и B в соответствии с их значениями свойства grid-area :

  • На основе первого и второго значений grid-area задаёт для обоих элементов позицию левого верхнего угла.
  • На основе третьего и четвёртого значений grid-area задаёт для обоих элементов позицию правого нижнего угла.

Этап #3: Размещение элементов с помощью настройки row-позиции, а не column

Теперь алгоритм размещает элемент с явно указанными row-позициями в свойствах grid-row-start и grid-row-end .

Зададим значение grid-row для элементов C и D:

Чтобы определить column-позицию, которая не задана явным образом, алгоритм действует по одному из двух сценариев в соответствии с режимом размещения (packing mode):

  • Разреженное размещение (sparse packing) (по умолчанию).
  • Плотное размещение (dense packing).

Разреженное размещение на этапе #3

Это поведение по умолчанию. Начальная строка столбца (column-start line) нашего элемента получит минимальный возможный индекс строки (line index). Так мы избежим взаимного наложения пространства для текущего элемента и ячеек, уже занятых другими элементами.

Начальная строка столбца также должна идти после элемента, уже размещённого в том же ряду на этом этапе. Подчеркнём: на этом этапе, а не до этого этапа.

Рассмотрим на примере: элемент D не перемещался влево от А, даже при том, что он мог бы туда поместиться без каких-либо наложений. Дело в том, что элементы с явно заданной row-позицией, а не column-, алгоритм не размещает перед другим, аналогично позиционированным в данном ряду элементом (в нашем примере — С). Если у элемента С убрать значения grid-row, тогда D переместится влево от А.

Иными словами, элемент D, у которого явно задана row-позиция, а не column, может быть помещён перед А, но только в том случае, если этому не мешает С. А в данном случае он мешает, потому что у С, как и у D, определена row-позиция, а не column, и он находится в том же ряду, что и D.

Плотное размещение на этапе #3

Если вам нужно заполнить элементом D пустое место перед A, то придётся присвоить свойству grid-auto-flow значение row dense .

.container

В этом случае начальная строка столбца снова получит минимальный возможный индекс, чтобы не было взаимных наложений с другими элементами. Но если в ряду будет пустое место, куда наш элемент может поместиться без наложений, то он будет туда помещён без учёта предыдущего элемента из того же ряда и с теми же значениями позиционирования (в нашем примере — С).

Этап #4: Определение количества столбцов в неявной сетке

Далее алгоритм пытается определить количество столбцов в неявной сетке. Это происходит так:

  • Алгоритм берёт количество столбцов в явной сетке.
  • Затем проходит по всем элементам с заданной column-позицией и добавляет столбцы в начало и конец явной сетки, чтобы охватить все элементы.
  • Потом алгоритм проходит по всем элементам без заданной column-позиции. Если самое большое значение интервала (span) у одного из них оказывается больше ширины неявной сетки, то алгоритм добавляет столбцы в конце, чтобы охватить этот интервал.

Этап #5: Размещение оставшихся элементов

К данному моменту алгоритм уже разместил все элементы, чьи позиции явно определены, а также элементы с известными row-позициями. Теперь он начинает размещать в сетке оставшиеся элементы.

Но прежде чем рассматривать этот процесс, введём новый термин: курсор авторазмещения (auto-placement cursor). Это текущая точка вставки в сетку, определяемая пересечением пары координат — ряда и столбца. Изначально курсор помещается в точку пересечения начальных ряда и столбца неявной сетки.

Напомним, что позиционирование элементов зависит от режима размещения (packing mode), задаваемого свойством grid-auto-flow .

Разреженное размещение на этапе #5

По умолчанию оставшиеся элементы размещаются в разреженном режиме. Вот как это происходит.

Если для элемента не задана позиция ни по одной оси:

    Алгоритм инкрементирует column-позицию курсора до тех пор:
    а) пока не возникнет наложения между текущим элементом и ранее размещёнными,
    б) либо пока сумма «значение column-позиции курсора + значение column-интервала элемента» не превысит количество столбцов неявной сетки.

    Значение column-позиции курсора присваивается значению строки column-start элемента. Если значение новой позиции получается меньше, чем предыдущая column-позиция курсора, то row-позиция увеличивается на 1.

Размещение элементов E и F, когда не заданы позиции ни по одной оси

При обработке элемента E, у которого не заданы ни column-, ни row-позиция, для курсора задаются значения row 1 и column 1. Элемент E занимает только одну ячейку, он может поместиться в левый верхний угол без наложений. То есть алгоритм просто помещает элемент E на позицию row 1 / column 1.

Следующий элемент без заданных позиций по обеим осям — F. Значение column-позиции курсора увеличивается до 2. Но позиция row 1 / column 2 уже занята элементом А. Алгоритму приходится снова увеличивать значение column-позиции, пока оно не достигнет 4. Больше столбцов нет, и тогда row-позиция курсора увеличивается на 1, а column-позиция сбрасывается до 1: row 2 / column 1. Алгоритм снова начинает увеличивать column-позицию на 1, пока не дойдёт до 4. Место с координатами row 2 / column 4 пока что свободно и может быть занято элементом F. Алгоритм помещает его и переходит к следующему элементу.

Размещение элементов G и H, когда задана column-позиция

Начнём с G. Значение column-позиции курсора определяется таким же, как свойство grid-column-start элемента G — 3. Поскольку они меньше, чем предыдущее значение column (4), то row-позиция увеличивается на 1. То есть становится row 3 / column 3. Пространство с такими координатами в данный момент свободно, и G может быть туда помещён без наложений, что алгоритм и делает. Затем всё то же самое повторяется для элемента H.

Плотное размещение на этапе #5

Когда свойству grid-auto-flow присваивается значение row dense , выполняется иной порядок действий. Если вставляемый элемент не имеет определённой позиции, то текущая позиция курсора определяется в соответствии со строкой на пересечении начальных ряда и столбца неявной сетки, до того, как будет определена позиция элемента.

Элемент I помещён слева от H, потому что позиция курсора сбрасывается на строку, находящуюся на пересечении начальных ряда и столбца неявной сетки, вместо того чтобы начинать с последнего размещённого элемента. Алгоритм ищет подходящую позицию без наложений, находит место слева от H и помещает там элемент.

Заключение

В этой статье мы прошли по всем этапам работы алгоритма автоматического размещения из модуля CSS Grid Layout. Этот алгоритм управляется с помощью свойства grid-auto-flow .

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

  • Блог компании NIX
  • Веб-разработка
  • CSS

Полное визуальное руководство/шпаргалка по CSS Grid

Сегодня мы с вами рассмотрим свойства CSS Grid (далее также — Грид), позволяющие создавать адаптивные или отзывчивые макеты веб-страниц. Я постараюсь кратко, но полно объяснить, как работает каждое свойство.

Что такое CSS Grid ?

Грид — это макет для сайта (его схема, проект).

Грид-модель позволяет размещать контент сайта (располагать его определенным образом, позиционировать). Она позволяет создавать структуры, необходимые для обеспечения отзывчивости сайтов на различных устройствах. Это означает, что сайт будет одинаково хорошо смотреться на компьютере, телефоне и планшете.

Вот простой пример макета сайта, созданного с помощью Грида.

Компьютер

Телефон

Архитектура CSS Grid

Как же Грид работает? Элементы Грида (grid items) располагаются вдоль главной или основной (main) и поперечной (cross) оси (axis). При помощи различных свойств мы можем манипулировать элементами для создания макетов.

Помимо прочего, у нас имеется возможность объединять строки и колонки подобно тому, как мы это делаем в Excel , что предоставляет нам большую гибкость, чем Флекс ( Flexbox ).

К слову, если вас интересует Флекс, вот соответствующая статья.

Схема CSS Grid

Схема содержит все возможные свойства, предоставляемые Гридом. Эти свойства делятся на:

  • родительские (свойства грид-контейнера) и
  • дочерние (свойства грид-элементов)

Обратите внимание: красным цветом отмечены сокращения для свойств:


К концу настоящей статьи у вас будет полное понимание того, как работает каждое из них.

Настройка проекта

Для данного проекта требуются начальные знания HTML , CSS и умение работать с VSCode (или другим редактором по вашему вкусу). Делаем следующее:

  1. Создаем директорию для проекта, например, Project1 и открываем ее в редакторе ( cd Project1 , code . )
  2. Создаем файлы index.html и style.css
  3. Устанавливаем в VSCode сервер для разработки ( Live Server , расширение) и запускаем его

Или вы можете просто открыть Codepen (или любую другую песочницу) и начать писать код.

Все готово, можно приступать к делу.

HTML

Создаем 3 контейнера внутри body :

 
A
B
C

CSS свойство grid-auto-flow

CSS свойство grid-auto-flow определяет, как работает алгоритм автоматического размещения для неявно созданных элементов макета, указывая как они будут размещены в сетке макета.

Для того, чтобы задать размер неявно созданных столбцов в контейнере сетки макета Вы можете воспользоваться свойством grid-auto-columns, а для указания размера неявно созданных строк используется свойство grid-auto-rows.

Поддержка браузерами

Свойство Chrome

Firefox Opera Safari IExplorer Edge
grid-auto-flow 54.0* 52.0 44.0 10.3 10.0*
-ms-
16.0
12.0
-ms-

Синтаксис:

CSS синтаксис:

grid-auto-flow: "row | column | row dense | column dense | initial | inherit";

JavaScript синтаксис:

object.style.gridAutoFlow nam">row" 

Значения свойства

Значение Описание
row Ключевое слово, которое указывает, что алгоритм автоматического размещения размещает элементы, заполняя каждую строку по очереди, добавляя новые строки по мере необходимости. Является значением по умолчанию.
column Ключевое слово, которое указывает, что алгоритм автоматического размещения размещает элементы, заполняя каждый столбец по очереди, добавляя новые столбцы по мере необходимости.
dense Ключевое слово, указывающее, что алгоритм автоматического размещения использует «плотный» алгоритм размещения элементов, который пытается заполнить ранее образованные пустоты в сетке, если далее в макете появятся подходящие по размеру элементы. Это может привести к появлению элементов не в порядке их указания, при этом заполняются отверстия, оставленные большими элементами.
Если это ключевое слово dense опущено, то используется «разреженный» алгоритм, который размещает элементы в сетки не отступая для заполнения пустот. Это гарантирует, что все автоматически размещенные элементы отображаются «по порядку», даже если это оставляет пустоты, которые могли бы быть заполнены более поздними элементами.
initial Устанавливает свойство в значение по умолчанию.
inherit Указывает, что значение наследуется от родительского элемента.

Версия CSS

Кандидат в рекомендации (Candidate Recommendation)

Наследуется

Анимируемое

Пример использования

   Использование свойства grid-auto-flow .grid-container  display: grid; /* элемент отображается как блочный grid-контейнер */ margin-top: 5px; /* внешний отступ сверху */ padding: 10px; /* внешний отступ элемента со всех сторон */ background: rgb(0,150,208); /* цвет заднего фона */ > .grid-container > div  background: rgb(241,101,41); /* цвет заднего фона */ border: 1px solid #000; /* сплошная граница размером 1 пиксель черного цвета */ text-align: center; /* горизонтальное выравнивание текста */ > .grid-container  grid-template: repeat(4, 1fr) / 1fr 1fr; /* определяем количество и ширину столбцов и строк в макете сетки */ grid-auto-flow: column; /* алгоритм автоматического размещения размещает элементы, заполняя каждый столбец по очереди */ > .item-a  grid-row-start: 2; /* определяем с какой строки будет начинаться элемент background: red !important; /* цвет заднего фона */ > .item-b  grid-column-start: 2; /* определяем с какого столбца будет начинаться элемент background: yellow !important; /* цвет заднего фона */ >   id="dense" type="checkbox" onchange="changeGridAutoFlow()">dense class = "grid-container"> 
class = "item-a">A
class = "item-b">B C D E F
function changeGridAutoFlow() const grid = document.getElementsByClassName("grid-container")[0], // находим первый элемент с классом grid-container direction = document.getElementById("direction"), // находим элемент с id direction dense = document.getElementById("dense"); // находим элемент с id dense let gridAutoFlow = direction.value === "row" ? "row" : "column"; // проверяем значение элемента и записываем значение в переменную в зависимости от этого значения if ( dense.checked) // проверяем выбран ли чекбокс gridAutoFlow + nam">dense"; // если да, то добавляем к значению значение dense > grid.style.gridAutoFlow = gridAutoFlow; // устанавливаем grid-контейнеру новое значение свойства grid-auto-flow >

В этом примере мы разместили блочный grid-контейнер, внутри которого мы разместили шесть элементов . Для этого контейнера с помощью свойства grid-template мы указываем два значения, которые определяют, что мы размещаем четыре строки, используя функциональную нотацию repeat() , которая позволяет повторить фрагмент списка строк, и через косую черту значение, которое определяет, что мы размещаем два столбца. В качестве единиц измерения мы используем «гибкие» единицы измерения fr (fractional unit). В этом случае каждый столбец, или строка занимает часть оставшегося пространства в контейнере сетки макета пропорционально заданному коэффициенту. С помощью свойства grid-auto-flow мы задаем алгоритм автоматического размещения, который размещает элементы, заполняя каждый столбец по очереди (значение column ).

С помощью свойства grid-row-start мы размещаем элемент с классом «item-a» со второй строки, а элемент с классом «item-b» с помощью свойства grid-column-start со второго столбца.

Пример использования свойства grid-auto-flow.

CSS свойства

© 2016-2024 Денис Большаков, замечания и предложения по работе сайта Вы можете направить по адресу basicweb.ru@gmail.com

Кажется, вы используете блокировщик рекламы 🙁

Этот ресурс не является коммерческим проектом и развивается на энтузиазме автора сайта, который посвящает все свое свободное время этому проекту.

Добавьте, пожалуйста, basicweb.ru в исключения блокировщика рекламы, этим вы поможете развитию проекта.

За что отвечает алгоритм dense html css

Baseline is determined by this web feature being supported on the current and the previous major versions of major browsers.

CSS-свойство управляет поведением автоматически размещаемых элементов, точно указывая, как они попадают в сетку.

Интерактивный пример

Синтаксис

/* Ключевые свойства и значения */ grid-auto-flow: row; grid-auto-flow: column; grid-auto-flow: dense; grid-auto-flow: row dense; grid-auto-flow: column dense; /* Глобальные значения */ grid-auto-flow: inherit; grid-auto-flow: initial; grid-auto-flow: unset; 

Свойство можно использовать в двух вариантах:

  • с одним ключевым значением: row , column , или dense .
  • с двумя значениями: row dense или column dense .
Значения

Ключевое слово, указывающее размещать элементы, заполняя поочерёдно каждую строку и добавляя новые строки по мере необходимости. Это значение используется по умолчанию.

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

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

Formal syntax

Пример

HTML Content
div id="grid"> div id="item1">div> div id="item2">div> div id="item3">div> div id="item4">div> div id="item5">div> div> select id="direction" onchange="changeGridAutoFlow()"> option value="column">columnoption> option value="row">rowoption> select> input id="dense" type="checkbox" onchange="changeGridAutoFlow()" /> label for="dense">denselabel> 
CSS Content
#grid height: 200px; width: 200px; display: grid; grid-gap: 10px; grid-template: repeat(4, 1fr) / repeat(2, 1fr); grid-auto-flow: column; /* or 'row', 'row dense', 'column dense' */ > #item1 background-color: lime; grid-row-start: 3; > #item2 background-color: yellow; > #item3 background-color: blue; > #item4 grid-column-start: 2; background-color: red; > #item5 background-color: aqua; > 
function changeGridAutoFlow() var grid = document.getElementById("grid"); var direction = document.getElementById("direction"); var dense = document.getElementById("dense"); var gridAutoFlow = direction.value === "row" ? "row" : "column"; if (dense.checked) gridAutoFlow += " dense"; > grid.style.gridAutoFlow = gridAutoFlow; > 

Спецификация

Specification
CSS Grid Layout Module Level 2
# grid-auto-flow-property
Начальное значение row
Применяется к сеточные контейнеры
Наследуется нет
Обработка значения как указано
Animation type discrete

Браузерная совместимость

BCD tables only load in the browser

Смотрите также

  • Related CSS properties: grid-auto-rows (en-US), grid-auto-columns (en-US), grid
  • Grid Layout Guide: Auto-placement in grid layout (en-US)
  • Video tutorial: Introducing Grid auto-placement and order
Found a content problem with this page?
  • Edit the page on GitHub.
  • Report the content issue.
  • View the source on GitHub.

This page was last modified on 7 авг. 2023 г. by MDN contributors.

Your blueprint for a better internet.

MDN

Support

  • Product help
  • Report an issue

Our communities

Developers

  • Web Technologies
  • Learn Web Development
  • MDN Plus
  • Hacks Blog
  • Website Privacy Notice
  • Cookies
  • Legal
  • Community Participation Guidelines

Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998– 2023 by individual mozilla.org contributors. Content available under a Creative Commons license.

grid — auto — flow

Этим свойством можно поставить грид-элементы на пустое место.

Время чтения: меньше 5 мин

Открыть/закрыть навигацию по статье

Обновлено 11 мая 2023

Кратко

Скопировать ссылку «Кратко» Скопировано

Если грид-элементов больше, чем явно объявленных колонок или рядов, то они автоматически размещаются внутри родителя. А вот каким образом — в ряд или в колонку — можно указать при помощи свойства grid — auto — flow .

Пример

Скопировать ссылку «Пример» Скопировано

Принципы работы этого свойства удобнее всего изучать на примере, когда есть большой блок, который не помещается в одну грид-ячейку.

.container display: grid; /* Три колонки */ grid-template-columns: auto auto auto; /* Два ряда */ grid-template-rows: auto auto; /* Автоматическое размещение в ряд */ grid-auto-flow: row; /* Отступы между ячейками */ gap: 20px;> .item3 /* Занимает один ряд и растягивается на две колонки */ grid-column: span 2;> .container display: grid; /* Три колонки */ grid-template-columns: auto auto auto; /* Два ряда */ grid-template-rows: auto auto; /* Автоматическое размещение в ряд */ grid-auto-flow: row; /* Отступы между ячейками */ gap: 20px; > .item3 /* Занимает один ряд и растягивается на две колонки */ grid-column: span 2; >     

Пример реализации свойства grid-auto-flow со значением row.

Как видите, третий элемент не поместился в последнюю ячейку первого ряда и был перенесён на следующую строку. Следующий за ним четвёртый элемент встал в ближайшую доступную ячейку во втором ряду.

Как понять

Скопировать ссылку «Как понять» Скопировано

Свойство grid — template — rows командует браузеру, во сколько рядов выстраивать вложенные элементы. И какого размера должны быть эти ряды.

Как пишется

Скопировать ссылку «Как пишется» Скопировано

  • row (значение по умолчанию) — автоматически размещаемые элементы выстраиваются в ряды.
  • column — автоматически размещаемые элементы выстраиваются в колонки.
  • dense — браузер старается заполнить пустые ячейки в разметке, если размеры элементов позволяют. Можно сочетать с остальными значениями.

Для иллюстрации работы ключевого слова dense добавим его к значению свойства grid — auto — flow в примере выше:

.container /* Автоматическое размещение в ряд */ grid-auto-flow: row dense;> .container /* Автоматическое размещение в ряд */ grid-auto-flow: row dense; >     

Пример реализации свойства grid-auto-flow со значением row dense.

Теперь четвёртый элемент встал в ряд, но занял при этом пустую ячейку в первом ряду. Браузер старается закрыть все дырки в сетке, переставляя подходящие элементы на свободные места.

Подсказки

Скопировать ссылку «Подсказки» Скопировано

Полный список свойств гридов можно посмотреть в гайде по grid.

  • Chrome 66, поддерживается 66
  • Edge 79, поддерживается 79
  • Firefox 76, поддерживается 76
  • Safari 12.1, поддерживается 12.1

grid-auto-flow¶

Свойство grid-auto-flow управляет тем, как работает алгоритм автоматического размещения, точно указывая, как элементы попадают в сетку.

Если у вас есть элементы, которые вы явно не позиционируете в сетке, запускается алгоритм авто-размещения, чтобы их автоматически разместить. Это свойство контролирует то, как алгоритм авто-размещения работает.

Демо¶

  • grid
  • grid-area
  • grid-auto-columns
  • grid-auto-flow
  • grid-auto-rows
  • grid-column
  • grid-column-end
  • grid-column-gap
  • grid-column-start
  • grid-gap
  • grid-row
  • grid-row-end
  • grid-row-gap
  • grid-row-start
  • grid-template
  • grid-template-areas
  • grid-template-columns
  • grid-template-rows

Синтаксис¶

1 2 3 4 5 6 7 8 9 10 11
/* Keyword values */ grid-auto-flow: row; grid-auto-flow: column; grid-auto-flow: dense; grid-auto-flow: row dense; grid-auto-flow: column dense; /* Global values */ grid-auto-flow: inherit; grid-auto-flow: initial; grid-auto-flow: unset; 

Значения¶

Значение по-умолчанию: row

Применяется к grid контейнерам

алгоритм размещает элементы, заполняя каждую строку поочередно, добавляя новые строки по мере необходимости.

алгоритм помещает элементы, заполняя каждый столбец поочередно, добавляя по мере необходимости новые столбцы.

алгоритм использует «плотный» алгоритм упаковки, который пытается заполнить дыры в сетке, если позже появятся более мелкие элементы. Это может привести к тому, что элементы появятся не по порядку, но при этом заполнят отверстия, оставленные более крупными элементами.

Спецификации¶

Поддержка браузерами¶

Can I Use css-grid? Data on support for the css-grid feature across the major browsers from caniuse.com.

Описание и примеры¶

Пример 1¶
1 2 3 4 5 6 7
div id="grid"> div id="item1">div> div id="item2">div> div id="item3">div> div id="item4">div> div id="item5">div> div> 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
#grid height: 200px; width: 200px; display: grid; grid-gap: 10px; grid-template: repeat(4, 1fr) / repeat(2, 1fr); grid-auto-flow: column; /* or 'row', 'row dense', 'column dense' */ > #item1 background-color: lime; grid-row-start: 3; > #item2 background-color: yellow; > #item3 background-color: blue; > #item4 grid-column-start: 2; background-color: red; > #item5 background-color: aqua; > 
Пример 2¶

Рассмотрим следующий HTML:

1 2 3 4 5 6 7
section class="container"> div class="item-a">item-adiv> div class="item-b">item-bdiv> div class="item-c">item-cdiv> div class="item-d">item-ddiv> div class="item-e">item-ediv> section> 

Вы определили сетку с пятью колонками и двумя рядами, а свойство grid-auto-flow установили в row (оно же значение по умолчанию).

1 2 3 4 5 6
.container display: grid; grid-template-columns: 60px 60px 60px 60px 60px; grid-template-rows: 30px 30px; grid-auto-flow: row; > 

При размещении элементов в сетке, вы указываете позиции только для двух из них:

1 2 3 4 5 6 7 8
.item-a grid-column: 1; grid-row: 1 / 3; > .item-e grid-column: 5; grid-row: 1 / 3; > 

Так как мы установили grid-auto-flow в row , наша сетка будет выглядеть как на изображении ниже. Обратите внимание на то, как три элемента которые мы не расположили (item-b, item-c и item-d) перетекают через пустые строки:

CSS Grid Auto Flow Row

Если вместо этого мы установим свойство grid-auto-flow в column , элементы item-b , item-c и item-d будут перетекать сквозь колонки:

1 2 3 4 5 6
.container display: grid; grid-template-columns: 60px 60px 60px 60px 60px; grid-template-rows: 30px 30px; grid-auto-flow: column; > 

CSS Grid Auto Flow Column

См. также¶

Золотая рыбка CSS3 Grid Layout (часть 3)

Благодаря нашим недавним погружениям в волшебный мир этого модуля, мы уже смогли прочувствовать его силу и невероятные возможности, которыми он наделён. Но, несмотря на множество примеров и описаний разделов CSS Grid Layout Module Level 1, есть ещё немало сюрпризов, о которых стоит поговорить. Поэтому, как вы уже догадались, в этой статье мы продолжим прогулку по этой спецификации, ведь золотая рыбка задолжала нам ещё желания;)

Кстати, так совпало, что параллельно с нами Эмиль Бьёрклунд также ведёт свою серию статей, посвящённую спецификации Grid Layout. Поэтому, чтобы лучше прояснить для себя механизм этой раскладки, мы настоятельно рекомендуем ознакомиться со статьями Эмиля. Для этого можно пройти к нему в гости, либо прочитать перевод у нас на сайте.

Повторение колонок и рядов с функцией repeat()

Вы наверняка знаете свойство background-repeat , которое отвечает за повторение фоновой картинки в элементе. Вот и в модуле Grid Layout есть нечто похожее, но только для повторения колонок/рядов.

Представляю вам функцию repeat() , при помощи которой можно создать повторяющийся паттерн для построения колонок/рядов, описанный в компактной форме.

Например, возьмём CSS-код из спецификации:

Обратите внимание на повторяющиеся названия именованных линий, которые находятся в разных скобках. Как вы поняли, так тоже можно делать. Чуть позже в этой статье мы разберём примеры того, где это может пригодится, а пока вернёмся к repeat() .

При помощи repeat() то же самое CSS-объявление выглядит так:

.grid < display: grid; /* то же самое объявление с repeat() */ grid-template-columns: repeat (4, 10px [col-start] 250px [col-end]) 10px; >

Намного короче, неправда ли? Но давайте разберёмся. Я не стану приводить скриншоты, поскольку здесь достаточно простого объяснения, как работает эта функция. Первый аргумент в repeat() , это число повторений паттерна. В нашем случае паттерн будет повторяться 4 раза. Далее мы уже описываем сам паттерн: величину колонок, именованные линии и т.д. Всё просто. Очевидно, что эта функция очень полезна при большом количестве ячеек. И также не забывайте, что repeat() легко можно использовать и для построения рядов в свойстве grid-template-rows.

Обращение к полосам

По умолчанию грид-элементы распределяются по сетке в обычном порядке, как они идут в разметке. Но что если нам нужно раскидать блоки по конкретным колонкам/рядам? Grid Layout позаботился и об этом, предоставив пару способов. Рассмотрим каждый из них.

Способ с уникальными названиями грид-линий

Ранее (в этой и предыдущих статьях) мы уже научились создавать сетки разными методами, например, при помощи уникальных названий грид-линий. Поэтому в ниже представленной разметке и стилях вы не увидите ничего эдакого.

1
2
3
4
5
6

Мы воспользовались свойством grid-template-columns , чтобы создать сетку, состоящую из девяти колонок (четыре широких по 100px в ширину и пять узких по 10px). Нечто подобное мы проделывали здесь, только в нашем случае ширина первой колонки (а значит расстояние между началом первой и второй линией) будет 10px, второй (между [col1-start] и [col1-end]) — 100px, третьей — 10px и т.д.

В нашем грид-контейнере находится шесть грид-элементов. Представим, что нам нужно поместить в первую, третью и четвёртую широкие колонки по два блока, а вторую широкую колонку (и соответственно остальные узкие по 10px) пропустить. Для этого нам нужен такой CSS:

.unique-line-names > div:nth-child(3n + 1) .unique-line-names > div:nth-child(3n + 2) .unique-line-names > div:nth-child(3n)

2015-10-10_1728

Я специально сделал границу, чтобы было видно пустые колонки (ячейки грида). Элементы находятся во второй, в шестой и в восьмой колонках, а остальные колонки пустуют. Как вы, возможно, догадались из CSS-кода, произошло это потому, что с помощью свойства grid-column мы обратились к нужным нам колонкам по уникальными именам их границ ( [col1-start] , [col3-start] , [col4-start] ), приказав, например, первому и четвёртому элементам ( div:nth-child(3n + 1) ) оказаться в колонке, начинающейся от линии col1-start .

Способ с одинаковыми названиями грид-линий

Только что благодаря уникальным именам грид-линий мы легко раскидали элементы по нужным колонкам. Но что делать, если названия грид-линий не уникальны? Но и в этом случае Grid Layout нас не подвёл!

В HTML поменяем только класс у грид-контейнера.

1
2
3
4
5
6

А в CSS уберём цифры из названий линий, сделав их одинаковыми:

Мы заменили все col*-start на просто col-start , проделав тоже самое и с col*-end . И теперь при этом нам нужно получить такой же результат, что и в предыдущем примере. Как это сделать? Да легко. Мы просто обратимся к грид-линиям по номерам:

.same-line-names > div:nth-child(3n + 1) .same-line-names > div:nth-child(3n + 2) .same-line-names > div:nth-child(3n)

И вот результат. Знакомый, не правда ли?

2015-10-10_17281

Это напоминает массив, только номера начинаются с цифры 1, а не с цифры 0, как мы привыкли. В свойстве grid-template-columns четыре линии col-start , следовательно к первой можно обратиться col-start 1 , ко второй col-start 2 , и т.д. Понятно, что, например, col-start 1 будет равнозначна col1-start из предыдущего примера. Поэтому, чтобы заставить первый и четвёртый элементы ( div:nth-child(3n + 1) ) занять вторую колонку, мы просто присвоили их свойству grid-column значение col-start с номером 1 .

Автоматическое размещение

Согласно автоматическому алгоритму размещения Grid Layout, грид-элементы выкладываются по сетке в грид-контейнере друг за другом, заполняя собой свободное пространство. Если, например, грид-элементу не хватает места в первом ряду, то он автоматически переходит на второй ряд. Вся прелесть здесь в том, что Grid Layout позволяет нам взять алгоритм автозразмещения под свой контроль! Это напоминает свойство flex-direction в Flexbox, только круче и в контексте Grid Layout.

Давайте рассмотрим это сразу на примерах, начав с простых и закончив более сложным из спецификации.

Для начала воспользуемся уже знакомыми нам свойствами grid-template-columns и grid-template-rows и создадим грид-сетку 3х3, где колонки будут занимать по 200px, а ряды — по 100px. Элементов при этом будет семь, поскольку так нагляднее для понимания алгоритма.

1
2
3
4
5
6
7

grid1

Здесь всё вроде бы ясно, поэтому пора познакомиться с новым свойством grid-auto-flow , которое как раз и отвечает за алгоритм размещения грид-элементов по сетке. У этого свойства есть два значения: row , column , плюс к каждому из них может добавляться ещё одно волшебное значение dense. Последнее ( dense ) мы обсудим чуть позже, а пока посмотрим, как ведёт себя алгоритм без него. Первое значение rows (значение по умолчанию) приказывает элементам выстраиваться слева направо, идя по рядам, заполняя каждую грид-ячейку. Такое поведение можно наблюдать на рисунке выше.

А сейчас давайте поменяем значение свойства grid-auto-flow с row на column .

.grid < display: grid; grid-template-columns: 200px 200px 200px; grid-template-rows: 100px 100px 100px; /*меняет поведение алгоритма с row с на column*/ grid-auto-flow: column; >

grid2

Не трудно догадаться, что произошло. Теперь грид-элементы выстраиваются не слева направо, а сверху вниз, следуя уже не по рядам, а по колонкам.

А теперь перейдём к самому страшному более сложному примеру из спецификации, чтобы увидеть всю прелесть значения dense .

Представим, что у нас есть форма с полями, метками и отдельным блоком (на место расположение которого, кстати, стоит обратить особое внимание, см. блок #department-block ) с выпадающим списком внутри, ну и блок с кнопками.

Наша задача раскидать метки, поля и отдельный блок по своим колонкам (всего три колонки), а блоку с кнопками отвести отдельный ряд в самом низу.

form < display: grid; grid-template-columns: [labels] auto [controls] auto [oversized] auto; >form > label < grid-column: labels; grid-row: auto; >form > input, form > select < grid-column: controls; grid-row: auto; >#department-block < grid-column: oversized; grid-row: span 3; >#buttons < grid-row: auto; grid-column: 1 / -1; text-align: center; >

Я немного упростил пример и переделал картинку из спецификации, чтобы было наглядно понятно, что происходит

grid3-1

Для начала давайте разберёмся, что вообще происходит. В этом примере собрано множество грид-механизмов, с которыми мы уже знакомы. Например, взять вот это объявление:

grid-template-columns: [labels] auto [controls] auto [oversized] auto;

Мы уже проделывали подобный трюк в этой статье (см. раздел «Способ с уникальными названиями грид-линий»), где давали уникальные названия грид-линиям, чтобы потом разбросать нужные элементы по «именованным колонкам». Единственное отличие здесь в том, что расстояние между линиями (колонками) не фиксированное (auto), поэтому ширина колонок определяется шириной элементов.

Дальше у нас идут такие блоки объявлений:

form > label form > input #department-block

Свойство grid-column нам также знакомо, поэтому вы уже наверное догадались, что для меток (label) у нас отведена первая колонка, для полей — вторая, а для блока #department-block — третья.

Здесь стоит отметить несколько важных моментов. У свойства grid-row меток и полей стоит значение auto , поэтому ряды будут заполняться по мере необходимости. С этим всё понятно, но о чём нам говорит значение span 3 у свойства grid-row блока #department-block ? О том, что блок #department-block будет занимать три ряда (span 3).

А вот в каком ряду будет располагаться #department-block , нам расскажет наше загадочное значение dense .

Без dense алгоритм может «переть» только вперед, не оглядываясь назад. Поскольку метки и поля могут находиться только в своих выделенных колонках, то при их размещении алгоритм вынужден опускаться всё ниже и ниже. Когда он доходит до блока #department-block , алгоритм находится на 6 ряду — столько перед ним было меток и полей — и этот блок продолжает этот же 6 ряд.

А вот теперь мы подошли к самому главному — к dense — третьему значению свойства grid-auto-flow . Давайте посмотрим, что может сотворить эта мощная штука.

form < display: grid; grid-template-columns: [labels] auto [controls] auto [oversized] auto; /* волшебное значение dense*/ grid-auto-flow: dense;

grid-layout-css3

Как видно на рисунке, блоку #department-block больше не приходится опускаться вниз и ждать своей очереди, чтобы занять свой ряд. Благодаря dense алгоритм теперь учитывает пропущенные строки и размещает #department-block сразу же в первой строке его ряда.

  • Золотая рыбка CSS3 Grid Layout (часть 1)
  • Золотая рыбка CSS3 Grid Layout (часть 2)
P.S. Это тоже может быть интересно:
  • «Запашки» кода React-компонентов
  • Укрощаем режимы наложения: difference и exclusion
  • Убираем сдвиги в верстке наложением в CSS Grid

Если вам понравилась статья, поделитесь ей!

Похожие публикации:

  1. Как изменить цвет таблицы
  2. Как переключиться на другой репозиторий git
  3. Как сделать pwa приложение из сайта
  4. Как убить процесс c

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *