CSS---Grid网格布局

155 阅读8分钟

将网页划分为一个个网格,可以任意组合不同的网格,做出各种各样的布局。

最强大的CSS布局方案。


Grid布局与Flex布局对比

相同:

  • 都可以指定容器内部多个项目的位置

不同:

  • Flex:轴线布局,即只能指定项目针对轴线的位置。一维布局
  • Grid:将容器划分成行和列,产生单元格,然后指定项目所在的单元格。二维布局

基本概念

容器与项目

  • 容器:采用网格布局的区域,container
  • 项目:容器内部采用网格定位的子元素。item

注意:

项目只能是容器的顶层子元素,不包含项目的子元素。Grid布局只对项目生效

小栗子:

<div>
  <div><p>1</p></div>
  <div><p>2</p></div>
  <div><p>3</p></div>
</div>
<!--对于这段代码,Grid布局对<p>标签不产生作用-->

行和列

  • 容器里的水平区域称为“行”,row
  • 容器中的垂直区域称为“列”,column

单元格(cell)

行和列的交叉区域则称为单元格。

m行n列则会产生m*n个单元格。

网格线

网格线:划分网格的线。grid line

正常情况下,n行有n+1个水平网格线,m列有m+1个垂直网格线。

容器属性

display属性

为容器设置display属性

div{
    display:grid;
}

默认情况下,容器元素是块级元素,网格布局独占一行,即

也可将容器元素设置为行内元素

div{
    display:inline-grid;
}

即与其兄弟元素显示在一行

注意:设置为网格布局之后,容器子元素的float、display:inline-block、display:table-cell、vertical-align、column-*等设置都将失效。

grid-template-columns和grid-template-rows

在容器指定了网格布局后,要对网格划分行和列。

  • grid-template-columns定义列宽
  • grid-template-rows定义行高

小栗子:

.container {
  display: grid;
  grid-template-columns: 100px 100px 100px;
  grid-template-rows: 100px 100px 100px;
}

使用绝对单位px,也可以使用百分比

repeat()

由于设置网格时经常需要设置重复的值,所以为了简化,可以使用repeat()函数

小栗子:

.container {
  display: grid;
  grid-template-columns: repeat(3, 33.33%);
  grid-template-rows: repeat(3, 33.33%);
}

repeat()函数中的第一个参数代表重复的次数,第二个参数代表所要重复的值。

grid-template-columns: repeat(2, 100px 20px 80px);

使用repeat()函数也可以进行某种模式的重复,上述栗子实现了对宽分别为100px,20px,80px的三个盒子的重复设置宽度

效果为:

auto-fill关键字

在单元格大小固定,但容器大小不固定时,尽可能的使每一行容纳更多的单元格,则使用auto-fill自动填充。

使用:在repeat()函数的第一个参数的位置使用auto-fill关键字

.container {
  display: grid;
  grid-template-columns: repeat(auto-fill, 100px);
}

fr关键字

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

小栗子:

.container {
  display: grid;
  grid-template-columns: 1fr 1fr;
}

表示两列宽度相同

.container {
  display: grid;
  grid-template-columns: 150px 1fr 2fr;
}

与绝对宽度同时使用,表示第三列宽度为第二列的二倍

minmax()

minmax()函数产生了长度范围,他接受两个参数,分别为最小值和最大值

grid-template-columns: 1fr 1fr minmax(100px, 1fr);

上述代码表示:列宽不小于100px,不大于1fr

auto关键字

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

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

上述代码表示:中间一栏的宽度随页面宽度自适应

网格线名称

可以在grid-template-columns和grid-template-rows属性中使用[]对网格线进行命名

.container {
  display: grid;
  grid-template-columns: [c1] 100px [c2] 100px [c3] auto [c4];
  grid-template-rows: [r1] 100px [r2] 100px [r3] auto [r4];
}

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

布局实例

对于两栏布局:

.wrapper {
  display: grid;
  grid-template-columns: 70% 30%;
}

传统12格布局:

grid-template-columns: repeat(12, 1fr);

grid-row-gap、grid-column-gap、grid-gap

  • grid-row-gap属性设置行与行之间的间距
  • grid-column-gap属性设置列于列之间的间隔
.container {
  grid-row-gap: 20px;
  grid-column-gap: 20px;
}
  • grid-gap是grid-row-gap,grid-column-gap的简写合并形式
  • 若grid-gap省略了第二个值,则默认与第一个值相等
grid-gap: <grid-row-gap> <grid-column-gap>;

例:

.container {
  grid-gap: 20px 20px;
}

这三个属性的前缀grid-已删除

grid-template-areas

网格布局允许指定区域,grid-template-areas用于定义区域

每个区域可以包含一个或多个单元格

.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';
}

该代码将九个单元格分为了九个区域

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

该代码将九个区域分为了三个区域

grid-template-areas: 'a . c'
                     'd . f'
                     'g . i';

若某些区域不需要被利用,则用(.)来表示

(.)表示没有用到该单元格,或者该单元格不属于任何区域

注意:

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

grid-auto-flow

划分网格后,子元素会按顺序放置在每一个网格中,默认放置顺序是先行后列。

即:grid-auto-flow:row

先列后行:grid-auto-flow:column;

row dense和column dense:用于某些项目指定位置,剩余的项目尽可能填满

小栗子:让1,2项目各占据两个单元格,默认情况则为

设置了grid-auto-flow: row dense;

设置了grid-auto-flow: column dense;

justify-items、align-items、place-items

justify-items设置单元格内容的水平位置

align-items设置单元格内容的垂直位置

属性值:

  • start:对齐单元格的起始边缘
  • end:对齐单元格的结束边缘
  • center:单元格内部居中
  • stretch:拉伸,占满整个单元格的宽度(默认值)
.container {
  justify-items: start | end | center | stretch;
  align-items: start | end | center | stretch;
}

place-items是align-items、justify-items的合并简写模式

place-items: <align-items> <justify-items>;

若省略第二个值,则默认与第一个值相等

justify-content、align-content、place-content

justify-content是整个内容区域在容器里面的水平位置

align-content是整个内容区域在容器里的垂直位置

属性值:

  • start
  • end
  • center
  • stretch
  • space-around
  • space-between
  • space-evenly

start:对齐容器的起始边框

end:对齐容器的结束边框

center:容器内部居中

stretch:项目大小没有指定时,拉伸占据整个网格容器(默认值)

space-around:每个项目两侧间隔相等。所以项目之间的间隔要比项目与边框之间的间隔大一倍

space-between:项目与项目之间的间隔相等,与边框之间没有间隔

space-evenly:项目与项目之间的间隔相等,与边框的间隔也相等

place-content属性是align和justify属性的合并简写模式。

place-content: <align-content> <justify-content>

若第二个值省略,则默认与第一个值相等

grid-auto-columns、grid-auto-rows

有时候,某些项目的指定位置在网格的外部。出现这种情况浏览器会自动生成多余的网格。

grid-auto-columns、grid-auto-rows对浏览器自动生成的多余网格进行行宽和列高的设置。

使用方法与grid-template-rows相同

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

项目属性

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-1 {
  grid-column-start: 2;
  grid-column-end: 4;
}

.item-1 {
  grid-column-start: 1;
  grid-column-end: 3;
  grid-row-start: 2;
  grid-row-end: 4;
}

该属性值可以为第几跟网格线,也可为网格线名字

span关键字:表示跨越几个网格

.item-1 {
  grid-column-start: span 2;
}

表示1项目左边框到右边框跨越两个网格

若产生项目的重叠,则使用z-index指定项目重叠顺序

grid-column 、grid-row

grid-column是grid-column-start和grid-column-end的合并简写形式

grid-row属性是grid-row-start属性和grid-row-end的合并简写形式

使用方式:

.item {
  grid-column:  / ;
  grid-row:  / ;
}
/前后可以为起始和终止网格线的数字,
也可是起始网格线/跨越网格数span

grid-area

指定项目放在哪一个区域

.item-1 {
  grid-area: e;
}

也可以用作grid-row-start、grid-column-start、grid-row-end、grid-column-end的合并简写形式

.item {
  grid-area: <row-start> / <column-start> / <row-end> / <column-end>;
}

justify-self、align-self、place-self

justify-self设置单元格内容的水平位置

align-self设置单元格的垂直位置

.item {
  justify-self: start | end | center | stretch;
  align-self: start | end | center | stretch;
}

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

place-self: <align-self> <justify-self>;

部分属性的应用效果及代码

博客参考: www.ruanyifeng.com/blog/2019/0…