сетка это тренд
Grid-layout не предназначен для замены flex-layout, это дополнение к flex. Grid хорош для двумерной компоновки, а flex хорош для одномерной компоновки. Им нужно внести свой вклад.
Долгожданный grid-layout наконец начал поддерживаться в марте 2017 года и поддерживался некоторыми браузерами.
flex не соответствует нашим требованиям к общему макету страницы,Don't use flexbox for overall page layoutЭта статья иллюстрирует такой момент: не используйте flexbox для разметки всей страницы. И мы также можем чувствовать, что, когда flex делает общий макет страницы при обычном использовании, все еще есть недостатки, и много inline-box и float по-прежнему необходимы для упорядочения содержимого (// страница сведений о послепродажном заказе TODO как пример); Еще один вопрос, о котором мы поговорим после того, как разберемся с сеткой позже.
grid = table2.0?
Двухмерный макет, вы можете расположить содержимое в строках и столбцах. Разделите страницу на блоки, указав размер, расположение и уровень различных блоков содержимого.
Есть точка зрения, что grid очень похож на table2.0, у них есть сходство. Например, элементы расположены в строках и столбцах. Но разница между таблицей и сеткой в том, что таблица имеет содержательную структуру и не может быть в ней свободно выложена. Внутренние элементы сетки могут свободно устанавливать положение, допуская перекрытие и установку уровня семпла.
несколько терминов
сетка-контейнер сетка-контейнер
Контейнер сетки устанавливает новый контекст форматирования сетки для своего содержимого, который является границами элементов внутренней сетки.
линия сетки
Разделите линии по горизонтали и вертикали, чтобы создать дорожки сетки, ячейки сетки и области сетки. Так же, как широта и долгота, он разделяет северное и южное полушария, восточное и западное полушария, тропики, умеренный пояс север-юг и холодный пояс север-юг. Линии сетки имеют числовой индекс и могут быть названы сами по себе. Линии долготы и широты являются числовыми и также могут быть названы, например, нулевой меридиан и экватор.
сетка-дорожка сетка-дорожка
Горизонтальное или вертикальное пространство между блоками содержимого сетки. Биньшен, Биньхэ, Биньсин, Бинан, Бинькан, Цзянлин, Цзянхуэй, Цзянхань, Цзянхун. (Классическое называние пригородов, лавочники)
ячейка сетки ячейка сетки
Единичный блок содержимого сетки — это наименьший блок, в который может быть помещен контент. Например, если страница разделена тремя горизонтальными и вертикальными линиями сетки, ячейка представляет собой одну из девяти сеток.
сетка-область
Ограничивает область линиями сетки в качестве границ. Первоначально и NetEase, и Alibaba занимали одну ячейку, но теперь им приходится расширяться, занимая две, и эти две складываются в соответствующие области сетки.
два примера
Прежде чем разбираться в конкретных свойствах,Возьмем простой пример
Глядя на это так, сетка все еще очень интересна.Сначала разделите ее на блоки, а затем укажите диапазон площади каждого блока. Блоки могут перекрываться. Но это только начало, сетка приносит нам 17 новых функций, давайте рассмотрим еще один пример, прежде чем разбираться в свойствах, классическая схема компоновки — компоновка Святого Грааля.
- Общий макет веб-страниц: верхний и нижний колонтитулы, блок основного контента и боковая колонка с обеих сторон.
- Фиксированная ширина с обеих сторон, переменная ширина посередине
- Содержимое трех средних столбцов одинаковой высоты
- Нижний колонтитул всегда находится внизу окна, даже если содержимое не заполняет всю высоту окна.
- Отзывчивый макет, все модули отображаются со 100% шириной в меньшем окне просмотра.
Вы можете быстро закодировать этот интерфейс в уме и написать стиль, это будет не сложно, но и не просто. мыПосмотрите, как это делает сетка
// key code
.hg__header { grid-area: header;}
.hg__footer { grid-area: footer;}
.hg__main { grid-area: main;}
.hg__left { grid-area: navigation;}
.hg__right { grid-area: ads;}
.hg {
display: grid;
grid-template-areas: "header header header"
"navigation main ads"
"footer footer footer";
grid-template-columns: 250px 1fr 300px;
grid-template-rows: 100px
1fr
80px;
min-height: 100vh;
}
шаг:
-
определить сетку
- Задайте псевдоним области сетки, grid-area: , который удобен для справки при указании области, где находится блок. В предыдущем простом примере grid-area используется для указания того, какие линии сетки находятся сверху, снизу, слева и справа от области сетки.Таким образом, grid-area может не только указывать размер и положение области сетки, но и задавать псевдоним области.
grid-area: main; grid-row-start: main; grid-column-start: main; grid-row-end: main; grid-column-end: main;
- grid-template-areas: "- - -" "- - -" "- - -"; Макет сетки можно указать очень интуитивно. Его значение представляет собой массив строк, разделенных пробелами, каждая строка представляет строку. Внутри каждой строки находится список ячеек сетки, разделенных пробелами, а область сетки записывается несколько раз в нескольких столбцах. Например, в примере верхний и нижний колонтитулы написаны три раза, и все они занимают всю ширину области.
- Задайте псевдоним области сетки, grid-area: , который удобен для справки при указании области, где находится блок. В предыдущем простом примере grid-area используется для указания того, какие линии сетки находятся сверху, снизу, слева и справа от области сетки.Таким образом, grid-area может не только указывать размер и положение области сетки, но и задавать псевдоним области.
-
Установить высоту и ширину ячейки
В CSS3 есть новая единица измерения, fr, которая появляется в строке значений для пропорционального распределения оставшегося пространства в определенном направлении. При установке высоты строки она пишется отдельными строками для наглядности.
-
Установите нижний колонтитул с фиксированным положением
- Отзывчивый макет с использованием медиа-запросов. Сбросить макет и высоту строки
grid-container
1. grid-template-columns | grid-template-rows
grid-template-columns: <track list>
,Определить количество строк, столбцов, размер сетки сетки.
Форм много, самые распространенные из них следующие:
grid-template-columns: 100px 1fr;
grid-template-columns: [linename] 100px; // 定义网格线名字
grid-template-columns: [linename1] 100px [linename2 linename3]; // 一条网格线多个名字
grid-template-columns: minmax(100px, 1fr); // 最小100px, 最大满屏
grid-template-columns: fit-content(40%); // 指定最大值不超过屏宽40%
grid-template-columns: repeat(3, 200px); // 三列200px
// 给网格线指定名字
.box {
grid-template-columns: [first] 40px [line2] 50px [line3] auto [col4-start] 50px [five] 40px [end];
grid-template-rows: [row1-start] 25% [row1-end] 100px [third-line] auto [last-line];
}
2. grid-template-areas
Определите область сетки и используйте имя области сетки, объявленное вызовом grid-area, для размещения соответствующего элемента сетки. Определите явную область сетки.
3. сетка-ряд-разрыв, сетка-столбец-разрыв
Определяет расстояние между сетками (исключая расстояние между элементом сетки и краем контейнера)
4. justify-items: start | end | center | stretch (по умолчанию);
Определяет горизонтальное выравнивание содержимого дочерних элементов сетки, аналогично выравниванию содержимого flex-контейнера, но без пробелов вокруг и пробелов между ними.
5. align-items: start | end | center | stretch (по умолчанию);
Определяет вертикальное выравнивание содержимого дочерних элементов сетки, аналогично элементам выравнивания flex-контейнера.
6. justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
Когда емкость контейнера сетки превышает общий размер сетки, например, когда каждый подэлемент сетки использует фиксированное значение, укажите выравнивание сетки в контейнере сетки и вертикальной оси. Разница между последними тремя значениями атрибута составляет:
- пространство вокруг: расстояние между началом и концом составляет половину расстояния сетки
- space-between: Пространство между началом и концом равно нулю
-
пространственно-равномерно: расстояние между началом и концом равно шагу сетки
7. align-content: start | end | center | stretch | space-around | space-between | space-evenly;
По вертикали к направлению выравнивания justify-content, указывающего выравнивание сетки и горизонтальной оси.
8. сетка-авто-столбцы, сетка-авто-строки, сетка-авто-поток
grid-auto-columns | grid-auto-rows используется для создания элемента сетки неявного размещения сетки, когда ячеек сетки недостаточно. посмотри на одинпример
Мы определяем только грид-контейнер 1×1, в него помещается box1, а как насчет остальных трех? протекать. box2 отображается в правой части экрана после того, как box1, box3 и box4 отображаются внизу, а высота — это только высота содержимого.
указанныйgrid-auto-columns: 200px; grid-auto-rows: 200px;
, что эквивалентно созданию большего количества неявных ячеек сетки размером 200*200 по горизонтали и вертикали в контейнере для хранения возможных дополнительных элементов.
С ним связано еще одно свойство: grid-auto-flow.Когда мы не устанавливаем это свойство, лишние элементы также располагаются в порядке слева направо и сверху вниз.Это свойство управляет алгоритмом автоматической компоновки.
grid-auto-flow: row | column | row dense | column dense;
- row является значением по умолчанию, что означает, что алгоритм Auto Layout заполняет каждую строку по очереди, добавляя новые строки только при необходимости.
- столбец означает, что алгоритм Auto Layout заполняет каждый столбец по очереди, добавляя новые строки только при необходимости.
- Плотное представление сообщает алгоритму автоматической компоновки, чтобы он пытался заполнить дыры в сетке, если появляются меньшие дочерние элементы. (Не рекомендуется, может загромождать макет)
grid-item
1. grid-column-start | grid-column-end | grid-row-start | grid-row-end
grid-row: grid-row-start / grid-row-end
grid-column: grid-column-start / grid-column-end | grid-column-start | span <value>
Если grid-column-end/grid-row-end не задан явно, дочерние элементы сетки по умолчанию охватывают одну ячейку сетки. Кроме того, дочерние элементы сетки могут перекрывать друг друга, а порядок их размещения можно контролировать с помощью z-index.
Есть некоторые элементы, которые мы хотим охватить всю область просмотра, например, верхний и нижний колонтитулы, а для маленьких экранов — двухколоночный макет:
.header, .footer {
grid-column: 1 / 3;
}
К сожалению, когда мы переключаемся на большой экран, ряд из 12 столбцов, эти элементы будут заполнять только первые два столбца, а не 12 столбцов, нам нужно определить новый конец столбца сетки и установить значение равное 13. Этот способ более хлопотный, и есть простой способ, grid-column:1/-1;, так что независимо от размера экрана они будут занимать всю строку. Как следующее:
.header, .footer {
grid-column: 1 / -1;
}
2. grid-area
grid-area: <name> | grid-row-start / grid-column-start / grid-row-end / grid-column-end
3. justify-self: start | end | center | stretch Выравнивание содержимого ячейки сетки в горизонтальном направлении. с оправданием себя во flex.
4. align-self: start | end | center | stretch Вертикальное выравнивание содержимого ячейки сетки. Подобно align-self во flex.
Функции, предоставляемые сеткой
1. repeat()
Repeat() обеспечивает компактное объявление. Если строк и столбцов слишком много, а распределение регулярное, мы можем использовать функции для упорядочивания линий сетки.
grid-template-columns: repeat(3, 20px [col-start]) 5%;
// 等价于
grid-template-columns: 20px [col-start] 20px [col-start] 20px [col-start] 5%;
}
2. minmax()
Minmax () эквивалентен уточнением минимума к наибольшему интервалу для линии сетки. Если MIN> MAX, этот интервал недействителен, показывает мин.
3. fit-content()
fit-content() эквивалентен min('max-content', max('auto', arguments));
Еще одна проблема с гибкой версткой
Еще одна проблема с макетами flex-layout заключается в том, что когда на страницу нарисовано много контента, или контент меняется, страница работает нестабильно, когда 2g или загрузка сети нестабильна.Flexbox vs Grid page layout. Контент загружается с сервера в потоке, пользователь может видеть контент до полной загрузки страницы, но в случае гибкой верстки верстка будет перестроена. Именно потому, что flex сам по себе является гибким макетом. Но сетка не полностью свободна от проблемы перестановки макета — есть предпосылки:
必须让你的网格划分是可以预先确定的,比如是根据视窗宽高确定的。如果是根据内容而定,那么也是会崩坏的。
В приведенном ниже примере ширина столбца сетки зависит от содержимого, поэтому она также будет меняться в зависимости от содержимого. Последний, кроме того, не определен в контейнере сетки и является динамически создаваемым элементом. После создания он заставит страницу перерисовываться
.container {
display: grid;
grid-template-columns:
(foo) max-content,
(bar) min-content,
(hello) auto;
}
aside {
grid-column: 4;
}
Но не отказывайтесь от flex-layout, это безусловно самое мощное свойство макета страницы, результат веления времени, но он не подходит для верстки всего фрейма страницы. flex является ключевым в адаптивном макете, это макет, управляемый контентом. Вам не нужно заранее знать, что там будет, вы можете задать, как элемент будет распределять оставшееся место и как себя вести, когда места не хватит. Кажется более мощной является возможность одномерного макета, а преимуществом сетки является двумерный макет. Это также является первоначальным замыслом их дизайна.
Вполне возможно, что после того, как грид-макет станет широко поддерживаться, будет много ситуаций, когда flex встраивается в грид-макет.
Браузер пока не поддерживает подсетку, и спецификация все еще изменяется, поэтому я не буду вводить ее в первую очередь.
Ссылаться на
Don't use flexbox for overall page layout
(Перевод) Примечания к изучению CSS Grid Layout
Краткое введение в CSS Grid Layout