Grid布局总结!!container的属性!!!

960 阅读6分钟

之前用的比较多的布局为flex,也有了解Grid布局,通过设置长宽的属性,来达到直接二维划分整个页面。看了下面经,有问到了布局,于是,我就查了grid布局的资料,自己实战练习了下。




〇、我的理解

首先说说grid布局给人的感受。之前的flex就是我需要调整container里的item的位置,调整好了item在container里的位置,再来调整item。给人的感觉就是以item为主体。
但是grid就不同。我一开始直接用横线和纵线把整体分块,并不会一开始关心item元素。然后接下来再操纵item,把item放到分好的框框里面。

以下截图caniuse,虽然grid布局很变态,操作方便,但是目前还不普及,可能明年会很普及?


一、用法

1. grid布局和flex一样,要考虑container以及里面的item。

grid container:

//Grid Container,设置了 display: gird 的元素。grid item 的直接父项
<div class="container">     
  <div class="item item-1"></div>
  <div class="item item-2"></div>
  <div class="item item-3"></div>
</div> 

Grid Item:

//注意:Grid 容器的孩子(直接子元素)。下面的 .item 元素就是 grid item,但 .sub-item不是。
<div class="container">
  <div class="item"></div> 
  <div class="item">
    <p class="sub-item"></p>
  </div>
  <div class="item"></div>
</div>

二、grid术语

1.Grid Line

分界线组成网格结构。 它们既可以是垂直的(“column grid lines”),也可以是水平的(“row grid lines”),并位于行或列的任一侧。 下面例中的黄线就是一个列网格线。

2.Grid Track(轨道??)

网格的列或行,网格轨道。

3.Grid Cell

每一个格子单元

4.Grid Area

多个grid cell组成的区域

三、语法

1.grid container常见属性

display

.container {
  display: grid | inline-grid | subgrid;
}
  • grid - 生成一个块级(block-level)网格
  • inline-grid - 生成一个行级(inline-level)网格
  • subgrid - 如果你的 grid container 本身就是一个 grid item(即,嵌套网格),你可以使用这个属性来表示你想从它的父节点获取它的行/列的大小,而不是指定它自己的大小。

grid-template-columns / grid-template-rows(重要!!)

直接栗子:

.container {
  grid-template-columns: 40px 50px auto 50px 40px;
  grid-template-rows: 25% 100px auto;
}

给grid line命名,且名字可以有多个

.container {
  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];
}


gird-template-areas (重要!)

定义grid area的名称。其中,.代表空单元格。然后在子元素上写grid-area:名字,元素便会布局到对应的区域。

.container {
  grid-template-columns: 50px 50px 50px 50px;
  grid-template-rows: auto;
  grid-template-areas: 
    "header header header header"
    "main main . sidebar"
    "footer footer footer footer";
}
.item-a {
  grid-area: header; //区域名字不需要引号
}
.item-b {
  grid-area: main;
}
.item-c {
  grid-area: sidebar;
}
.item-d {
  grid-area: footer;
}


gird-template

grid-template-rows、grid-template-columns、grid-template-areas 的简写。

.container {
  grid-template: none | subgrid | <grid-template-rows> / <grid-template-columns>;
}

举个栗子:

.container {
  grid-template:
    [row1-start] "header header header" 25px [row1-end] //写一行,一行下面的track区域,区域长25px,分割线
    [row2-start] "footer footer footer" 25px [row2-end]
    / auto 50px auto;  //列线划分
}
以上等价于:

.container {
  grid-template-rows: [row1-start] 25px [row1-end row2-start] 25px [row2-end];
  grid-template-columns: auto 50px auto;
  grid-template-areas: 
    "header header header" 
    "footer footer footer";
}

### grid-column-gap\grid-row-gap

指定网格线的大小,你可以把它想象为设置列/行之间的间距的宽度

.container {
  grid-template-columns: 100px 50px 100px;
  grid-template-rows: 80px auto 80px; 
  grid-column-gap: 10px;
  grid-row-gap: 15px;
}

然后使用grid-gap:15px 10px;可以简写以上的。若只写一个15px,则column也默认15px。


justify-items

调整items在分块区域里的位置,类比于flex里的justify-content

.container {
  justify-items: start | end | center | stretch;
}
  • start: 内容与网格区域的左端对齐
  • end: 内容与网格区域的右端对齐
  • center: 内容位于网格区域的中间位置
  • stretch: 内容宽度占据整个网格区域空间(拉满)(默认值)

自己尝试了下,
1. 初始的html:

<body>
  <div class="container">
  <div class="header">header</div> 
  <div class="main">main</div>
  <div class="sidebar">sidebar</div>
  <div class="footer">footer</div>
  </div>
</body>

2. 添加了justify-items:center后,元素全部居中。

另外,也可以设置对单个元素在格子中的位置,用justify-self。


align-items

类比flex里的align-items,调整纵向位置,方式同上的justify-items。

.container {
  align-items: start | end | center | stretch;
}
  • start: 内容与网格区域的顶端对齐
  • end: 内容与网格区域的底部对齐
  • center: 内容位于网格区域的垂直中心位置
  • stretch: 内容高度占据整个网格区域空间(这是默认值)

我的尝试:


justify-content 和 align-content

注意,这是调整网格在网格容器中的位置!!!
因为如果设置非弹性的单位px,网格可能占不满整个容器。可使用如上属性调整网格的横向和纵向

.container { //align-content与下面的一样
  justify-content: start | end | center | stretch | space-around | space-between | space-evenly;  
}
  • start - 网格与网格容器的左边对齐
  • end - 网格与网格容器的右边对齐
  • center - 网格与网格容器的中间对齐
  • stretch - 调整g rid item 的大小,让宽度填充整个网格容器
  • space-around - 在 grid item 之间设置均等宽度的空白间隙,其外边缘间隙大小为中间空白间隙宽度的一半
  • space-between - 在 grid item 之间设置均等宽度空白间隙,其外边缘无间隙
  • space-evenly - 在每个 grid item 之间设置均等宽度的空白间隙,包括外边缘

grid-auto-columns / grid-auto-rows

指定自动生成的网格轨道(又名隐式网格轨道)的大小。

先说说隐式网格轨道的意思。

  1. 首先,创建2X2网格。
.container {
  grid-template-columns: 60px 60px;
  grid-template-rows: 90px 90px
}

2.用grid-column和grid-row来定位item的位置。

.item-a {
  grid-column: 1 / 2;
  grid-row: 2 / 3;
}
.item-b {
  grid-column: 5 / 6;
  grid-row: 2 / 3;
}

3.指定的.item-b于列网格线5和列网格线6间,但并未定义列网格线5 6。所以,宽度为0的隐式轨道就会被创建。使用 grid-auto-columns 和 grid-auto-rows属性来指定隐式轨道的宽度:

.container {
  grid-auto-columns: 60px;
}


grid-auto-flow

让items按顺序自动填充格子。

.container {
  grid-auto-flow: row | column | row dense | column dense
}
  • row 按照123456789顺序填充

  • column

  • dense

若有元素大小不一致,优先让后面小的元素填补上面大的元素的空间。
让1号项目和2号项目各占据两个单元格,设置gird-auto-flow:row;会有空位。

设置gird-auto-flow:row dense;后:

设置gird-auto-flow:column dense;后:


grid

将以上含有grid的属性合在一起,新手就不说了。



Continue...