CSS - grid布局

388 阅读5分钟
theme: cyanosis
highlight: atom-one-dark

Flex 布局是轴线布局,只能指定“项目”针对轴线的位置,可以看作是一维布局

Grid 布局则是将容器划分 成“行”和“列”,产生单元格,然后指定“项目所在”的单元格,可以看作是二维布局

基本概念

和Flex布局一样,grid布局同样被划分为grid containergrid items

grid items依旧是grid container的直接子元素

LxNJmD.png

LxNuO4.png

LxNSd6.jpg

每个grid布局,有隐藏的网格线,用来帮助定位

LxNrCE.png

容器属性

grid-template-*

LxNF1h.png

 .container {
   /*
     开启grid
     grid --- 块级元素
     inline-grid --- 行内级元素
   */
   display: grid;
 ​
   /*
     单单设置display: grid是不会起作用的
     需要结合grid-template-columns或grid-template-rows一起使用
 ​
     只设置了grid-template-columns --- 设置网格有多少列,及其对应的排列方式
     只设置了grid-template-rows --- 设置网格有多少行,及其对应的排列方式
   */
 ​
   /* 表示三列 每一列的宽度为100px */
   grid-template-columns: 100px 100px 100px;
   
   /* 表示有四行 每一行的高度为100px */
   grid-template-rows: 100px 100px 100px 100px;
   width: 600px;
   height: 600px;
   background-color: skyblue;
 }
 ​
 .item {
   width: 100px;
 }

repeat函数

 /* repeat(),第一个参数是重复的次数,第二个参数是所要重复的值 */
 /*
   grid-template-columns: 100px 100px 100px;
   等价于
   grid-template-columns: repeat(3, 100px);
 */
 grid-template-columns: repeat(3, 100px);

auto-fill

auto-fill 由浏览器自主决定可以划分成多少个单元格

 grid-template-columns: repeat(auto-fill, 100px);

fr

fr,为了方便表示比例关系,网格布局提供了fr关键字(fraction 的缩写,意为"片段")

 /* 宽度平均分成3份 */
 grid-template-columns: repeat(3, 1fr);

minmax()

minmax(),函数产生一个长度范围,表示长度就在这个范围之中,它接受两个参数,分别为最小值和最大值

 grid-template-columns: repeat(2, minmax(150px, 1fr))

image-20230514145631326

auto

auto,表示由浏览器自己决定长度

 /* 此时auto的作用和fr类似 */
 grid-template-columns: repeat(3, auto);
 ​
 /* 此时auto表示宽度为元素内容的宽度,剩余的宽度由1fr的那个元素占据 */
 grid-template-columns: auto auto 1fr;

image-20230514145700246

网格线

用于定义网格线的名称

 /* 三个单元格 --> 四条网格线 */
 grid-template-columns: [c1] 100px [c2] 100px [c3] 100px [c4];

gap

gap用于设置item(项目)相互之间的距离

名称说明
column-gap列单元格与列单元格之间的间距
row-gap行单元格与行单元格之间的间距
gapcolumn-gaprow-gap的简写属性
 /*
   column-gap: 10px;
   row-gap: 10px;
 ​
   等价于 gap: 10px 10px;
 ​
   当column-gap的值和row-gap的值一样的时候可以简写成一个 -> gap: 10px;
 */
 gap: 10px;

grid-template-areas

一个区域由单个或多个单元格组成,一个区域中可以有多个单元格组成,也可以仅仅只有一个单元格组成

区域的命名会影响到网格线,每个区域的起始网格线, 会自动命名为区域名-start,终止网格线自动命名为区 域名-end

 /* container是一个 3 * 3 的grid容器 */
 ​
 /* 每一个单元格一个区域 */
 grid-template-areas: 'a b c' 'd e f' 'g h i';
 ​
 /* 为了可读性 一般写成如下形式 */
 grid-template-areas:
   'a b c'
   'd e f'
   'g h i';
 /* 一行为一个区域 */
 grid-template-areas:
   'a a a'
   'b b b'
   'c c c';
 /* 点表示 该单元格暂时不划分到任何一个area中,先行忽略 */
 grid-template-areas:
   'a . a'
   'b . b'
   'c . c';

grid-auto-flow

grid-auto-flow用于设置子元素的排放顺序

 grid-template-columns: repeat(3, 1fr);
 grid-template-rows: repeat(3, 1fr);
 ​
 /* grid-auto-flow 默认值为 row */
 grid-auto-flow: column;

LxN2H8.png

LxNCZk.png

justify-items/align-items

用于设置所有单元格中元素的排列方式

 # 默认值为 stretch
 justify-items: start | end | center | stretch;
 ​
 # 默认值为 stretch
 align-items: start | end | center | stretch;

place-items属性是align-items属性和justify-items属性的合并简写形式

 # 注意: place-items在设置的时候,第一个值是设置垂直方向的值,第二个值才是设置水平方向上的值
 place-items: <align-items> <justify-items>;
 /* item在水平和垂直方向上全部居中对齐 */
 place-items: center;

justify-content/align-content

设置整个内容区域的水平和垂直的对齐方式

 # 默认值 normal,表现效果为stretch
 justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
 ​
 # 默认值 normal,表现效果为stretch
 align-content: start | end | center | stretch | space-around | space-between | space-evenly;

LxNTe5.png

grid-auto-columns / grid-auto-rows

用来设置多出来的项目宽和高

他们的默认值都是auto,即根据其中内容和项目的大小自动调整

 grid-auto-rows: 50px;
 grid-auto-columns: 80px;

LxNiKt.png

项目属性

grid-column-start / grid-column-end / grid-row-start / grid-row-end

grid-column-start / grid-column-end / grid-row-start / grid-row-end用来指定item的具体位置是根据哪几根网格线来进行定位的

LxSnKT.png

 grid-column-start: 1;
 grid-column-end: 3;
 ​
 /* 可以简写为 */
 grid-column: 1 / 3;
 ​
 /* 等价于 */
 grid-column-start: span 2;
 ​
 /* 等价于 */
 grid-column-end: span 2;
 ​
 /* 同理 */
 grid-row-start: 1;
 grid-row-end: 3;
 ​
 /* 可以简写为 */
 grid-row: 1 / 3;
 ​
 /* 等价于 */
 grid-row-start: span 2;
 ​
 /* 等价于 */
 grid-row-end: span 2;
 ​
 /* 如果给网格线起了别名 那么在这里也可以使用网格线的别名来进行标识 */
 grid-column-start: c1;
 grid-column-end: c3;

grid-area

指定项目放在哪一个区域

LxSYiy.png

 grid-column-start: 1;
 grid-column-end: 3;
 grid-row-start: 1;
 grid-row-end: 3
 ​
 /* 可以简写为 */
 grid-area: 1 / 1 / 3 / 3;

justify-self / align-self / place-self

justify-self永远设置单个单元格中内容的排列方式。可取值与justify-items的可取值完全一致

 justify-self: start | end | center | stretch;
 ​
 align-self: start | end | center | stretch;
 ​
 # place-self属性是align-self属性和justify-self属性的合并简写形式 
 # 同样第一个值是设置垂直方向上的值,第二个值才是设置水平方向上的值
 place-self: <align-self> <justify-self>;