CSS布局之Grid | 青训营

69 阅读6分钟

基本概念

1.容器—有容器属性(container)

2.项目—有项目属性(items)

Grid布局(网格布局)

顾名思义将区域划分为一个一个的格子来布局,功能强大,但兼容性不如flex布局。

image.png

使用步骤:

  1. display:griddisplay:inline-grid使元素生成一个块级的Grid容器
  2. 使用grid-template-相关属性将容器划分为网络(定义行和列)
  3. 设置每一个子项占哪些行

步骤2 划分网格的线即为网格线。Grid会自动创建编号的网格线来定位每一个元素,m 列有 m + 1 根垂直的网格线,n 行有 n + 1 跟水平网格线。一般而言,是从左到右,从上到下,1,2,3 进行编号排序,从右到左,从下到上,则是按照 -1,-2,-3…顺序进行编号排序

image.png

一、容器属性

1. grid-template-*

grid-template-columns 每一列的列宽
grid-template-rows 每一行的行高

grid-template-columns:100px 100px 100px; // 显示为三列每一列宽度100px 

1.1 使用repeat()函数,简化重复的值

repeat接受多个参数,第一个参数是重复的次数,后面的参数是所要重复的值。

  grid-template-rows: repeat(4, 25%);
  grid-template-columns: repeat(2, 100px 20px);/*该代码定义了4列,第一列和第四列的宽度为100px,第二列和第五列为20px,*/

1.2 auto-fill表示自动填充

.container {
  display: grid;
  grid-template-columns: repeat(auto-fill, 40px);
  /*上面代码表示每列宽度40px,自动填充,直到容器放不下。*/
}

1.3 fr 单位

fr表示比例关系

.container {
  display: grid;
  grid-template-columns: 1fr 1fr;
  //表示两个相同宽度的列
}

1.4 minmax()

minmax()表示长度范围,两个参数分别是最小值和最大值

grid-template-columns: 1fr minmax(150px1fr);  
/*表示第二列列宽不小于150px,不大于1fr*/

1.5 auto关键字

auto关键字表示由浏览器自己决定长度。

    grid-template-columns: 100px auto 100px;

1.6 网格线的名称

grid-template-columns属性和grid-template-rows属性里面,还可以使用方括号,指定每一根网格线的名字

grid-template-columns: [a] 100px [b] 100px [c] 100px [d]; 
}

网格布局允许同一根线有多个名字

2. row-gap,column-gap,gap

属性描述
row-gap用于设置行间距
column-gap用于设置列间距
gap是column-gap和row-gap的合并简写形式

如果gap省略了第二个值,浏览器认为第二个值等于第一个值。

3. grid-template-areas定义区域

网格布局允许指定"区域"(area),一个区域由单个或多个单元格组成。

.container {
  display: grid;
  grid-template-columns: 100px 100px 100px;
  grid-template-rows: 100px 100px 100px;
  grid-template-areas: 'a b c'
                       'd e f'
                       'g h i';
}
//9个单元格,命名为a-i的九个区域

多个单元格合并成一个区域

grid-template-areas: 'a a a'
                     'b b b'

如果某些区域不需要利用,则使用"点"(.)表示。

grid-template-areas: 'a . c'
                     'd . f'
                     'g . i';
      /*中间一列为点,表示没有用到该单元格,或者该单元格不属于任何区域*/
  • 区域的命名会影响到网格线。每个区域的起始网格线,会自动命名为-start,终止网格线自动命名为-end。

4. grid-auto-flow

属性描述
row先行后列
column先列后行
row dense先行后列 换行时留下的空间可以由下面的元素填补上去
column dense先列后行 换行时留下的空间可以由下面的元素填补上去

5. *-items

  • justify-items属性设置单元格内容的水平位置(左中右)
  • align-items属性设置单元格内容的垂直位置(上中下)
  • place-items属性是align-items属性和justify-items属性的合并简写形式,如果省略第二个值,则浏览器认为与第一个值相等。
属性描述
start对齐单元格的起始边缘
end对齐单元格的结束边缘
center单元格内部居中
stretch拉伸,占满单元格的整个宽度(默认值)

6. *-content

  • justify-content属性是整个内容区域在容器里面的水平位置(左中右)
  • align-content属性是整个内容区域的垂直位置(上中下)
  • place-content属性是align-content属性和justify-content属性的合并简写形式,如果省略第二个值,浏览器就会假定第二个值等于第一个值
属性描述
start对齐单元格的起始边缘
end对齐单元格的结束边缘
center单元格内部居中
stretch项目大小没有指定时,拉伸占据整个网格容器
space-around每个项目两侧的间隔相等。所以,项目之间的间隔比项目与容器边框的间隔大一倍
space-between项目与项目的间隔相等,项目与容器边框之间没有间隔
space-evenly项目与项目的间隔相等,项目与容器边框之间也是同样长度的间隔

7. grid-auto-*

grid-auto-columns属性和grid-auto-rows属性

一些项目的指定位置,在现有网格的外部。所以浏览器会自动生成多余的网格来放置项目

  • grid-auto-columns属性和grid-auto-rows属性用来设置,浏览器自动创建的多余网格的列宽和行高。
  • grid-template-columnsgrid-template-rows的写法完全相同。
  • 如果不指定这两个属性,浏览器完全根据单元格内容的大小,决定新增网格的列宽和行高。

8.grid-template ,grid

  • grid-template属性是grid-template-columns、grid-template-rows、grid-template-areas这三个属性的合并简写形式。
  • grid属性是grid-template-rows、grid-template-columns、grid-template-areas、 grid-auto-rows、grid-auto-columns、grid-auto-flow这六个属性的合并简写形式
  • 不建议使用

二、项目属性

  1. grid-column-start
  2. grid-column-end
  3. grid-row-start
  4. grid-row-end

根据起、始网格线,来指定item的具体位置,如果产生了项目的重叠,则使用z-index属性指定项目的重叠顺序。

grid-column-start:1;
grid-column-end:5;
grid-row-start:1;
grid-row-end:5;
  1. grid-column(1,2简写形式)
grid-column: 1 / 5;
  1. grid-row(3,4简写形式)
grid-row: 1 / 5;
  1. grid-area
  • 指定项目放在哪一个区域
    grid-area: e;
  • 简写形式
grid-area: 1 / 1 / 5 / 5;
/*grid-area: <row-start> / <column-start> / <row-end> / <column-end>;*/
  1. justify-self:属性允许单个项目有与其他项目不一样的对齐方式(水平),用法与justify-self一样。默认继承父元素的justify-self属性,如果没有父元素,则等同于stretch
  2. align-self:属性允许单个项目有与其他项目不一样的对齐方式(垂直),剩下同justify-self
  3. place-self(8和9的简写形式)
    place-self: center center;
   /*place-self: <align-self> <justify-self>*/

如果省略第二个值,place-self属性会认为这两个值相等