参考
先来看一个需求:一行排3个元素,宽度小于一定的时候,变成一行排列两个。
其实antd的Grid组件等栅格布局都能很好地实现这个功能,不过下面现在先用gird属性来实现,以此更好地理解它的标准和原理。
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
}
@media (max-width: 1600px) {
.grid {
grid-template-columns: repeat(2, 1fr);
}
}
.grid > div {
padding: 8px;
color: white;
background: grey;
}
<div class="grid">
<div>contentdiv>
<div>contentdiv>
<div>contentdiv>
<div>contentdiv>
<div>contentdiv>
<div>contentdiv>
<div>contentdiv>
div>
屏幕不够大,一行就排两个。
当屏幕够大时,变成这样。
.container{
display: grid | inline-grid | subgrid
}
使用空格分隔的值列表来定义网格的列和行。这些值表示轨道大小,他们之间的空间表示网格线值
.container{
display: grid;
grid-template-columns: 40px 50px auto 50px 40px;
grid-template-rows: 25% 100px auto;
}
.container{
grid-template-columns: [first] 40px [line2] 50px [line2] auto [line3] auto [col4-start] 50px [five] 5px;
grid-template-rows: [row1-start] 25% [row1-end] 100px [thrid-line] auto [last-line];
}
.container{
grid-template-columns: repeat(3, 20px [col-start]) 5%;
}
设置单位为fr
网格会允许您设置的网格轨道大小为网格容器的自由空间的一小部分,例如,这会将每个项目设置为容器宽度的三分之一。
.container {
grid-template-columns: 1fr 1fr 1fr;
}
可用空间是在任何非弹性项目之后计算的,在这个例子中,fr
单元可用空间的总量不包括50px
.container{
grid-template-columns: 1fr 50px 1fr 1fr;
}
通过应用grid-area
属性指定网格空间的名称来定义网格模板。 值:
grid-area
none
: 没有定义网格空间.container{
grid-template-areas: " | . | none | ..." ;
}
Demo
.container{
display: grid;
grid-template-columns: repeat(4, 50px);
grid-template-rows: auto;
grid-template-areas:
"header header header header"
"main main . slidebar"
"footer footer footer footer"
}
.item-a{
grid-area: header;
}
.item-b{
grid-area: main;
}
.item-c{
grid-area: slidebar;
}
.item-d{
grid-area: footer;
}
一个简短设置grid-template-rows
, grid-template-columns
和grid-template-areas
在一起的声明,可读性不太好,不建议使用。
指定网格线的大小值:
.container{
display: grid;
grid-template-columns: repeat(4, 50px);
grid-template-rows: repeat(4, 80px);
grid-column-gap: 10px;
grid-row-gap: 15px;
}
速记grid-row-gap
和grid-column-gap
值:
.container {
grid-gap:
}
沿着行轴对齐网格内的内容(而不是align-items
沿着列轴对齐),适用于所有网格容器内的网格项目 值:
.container{
justify-items: start;
}
此行为也可以通过justify-self
在个别网格项目上设置
沿列轴对齐网格的内容(而不是justify-items
沿着行轴对齐)。该值适用于容器内的所有网格项目 值:
.container {
align-items: start;
}
有时,网格的总大小可能小于其网格容器的大小, 如果您的所有网格项目都是用非灵活单位进行大小调整,就可能发生这种情况。这时候可以设置网格容器内的网格的对齐方式,此属性沿着行轴对齐网络值:
.container{
justify-content: start;
}
此属性和justify-content
一样,只不过是沿着列轴对齐网格 值:
.container{
align-content: start;
}
指定任何自动生成的网格轨道的大小,当明确声明超出定义的网格空间的行或列(通过grid-template-rows / grid-template-columns)时,会创建隐式网格轨道值:
fr
单位) 如何创建隐式网格轨道, 例子:.contaienr{
display: grid;
grid-template-columns: repeat(2, 60px);
grid-template-rows: repeat(2, 90px);
}
.container{
grid-auto-columns: 60px;
}
如果您没有明确放置在网格上的网格项目,则自动分配算法会自动分配这些项目。该属性控制自动分配算法的原理 值:
例子:
<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
。
.container{
display: grid;
grid-template-columns: repeat(5, 60px);
grid-template-rows: repeat(2, 30px);
grid-auto-flow: row;
}
简写为所有设置下列属性的单一声明: grid-template-rows
,grid-template-columns
, grid-template-areas
, grid-auto-rows
, grid-auto-columns
和grid-flow
。
通过引用特定的网格线来确定网格内项目的位置。 值:
.item-a {
grid-column-start: 2;
grid-column-end: five;
grid-row-start: row1-start
grid-row-end: 3
}
简写为grid-column-start
+grid-column-end
和grid-row-start
+grid-row-end
值:
.item-c {
grid-column: 3 / span 2;
grid-row: third-line / 4;
}
为项目提供一个名称,以便可以通过使用grid-template-areas
属性创建的模板来引用他。或者属性可以用作grid-row-start
+grid-column-start
+grid-row-end
+grid-column-end
值:
.item {
grid-area: | / / / ;
}
.item-d{
grid-area: header;
}
.item-d {
grid-area: 1 / col4-start / last-line / 6
}
沿着行轴对齐网格的内容,此属性适用与单个网格项目的内容 值:
.item {
justify-self: start | end | center | stretch;
}
沿列轴对齐网格内的内容,此值适用与单个网格项目内的内容 值
.item {
align-self: start | end | center | stretch;
}
更多demo:https://gridbyexample.com/examples/
1个item占用一行
.father{
display: grid;
grid-template-columns: 416px minmax(366px, 416px);
}
.son{
grid-column-start: span 1
}
"wrapper">
"box header">Header
"box sidebar">Sidebar
"box content">Content
More content than we had before so this column is now quite tall.
"box footer">Footer
body {
margin: 40px;
}
.sidebar {
grid-area: sidebar;
}
.content {
grid-area: content;
}
.header {
grid-area: header;
}
.footer {
grid-area: footer;
}
.wrapper {
display: grid;
grid-gap: 10px;
grid-template-columns: 120px 120px 120px;
grid-template-areas:
"....... header header"
"sidebar content content"
"footer footer footer";
background-color: #fff;
color: #444;
}
.box {
background-color: #444;
color: #fff;
border-radius: 5px;
padding: 10px;
font-size: 150%;
}
.header,
.footer {
background-color: #999;
}