Twlig / issuesBlog

MIT License
3 stars 0 forks source link

Grid布局 #66

Open Twlig opened 2 years ago

Twlig commented 2 years ago

Grid

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

Gird布局由Grid容器和Grid项目构成。Grid项目(网格元素)只能是容器的顶层子元素。

Grid布局属性有两类:

容器属性

display:grid ;  容器元素为块级元素
display:inline-grid;   容器元素为行内元素
.wrapper {
  display: grid;
  /*  声明了三列,宽度分别为 200px 200px 200px */
  grid-template-columns: 200px 200px 200px;
  /*  声明了两行,行高分别为 50px 50px  */
  grid-template-rows: 50px 50px;
}

对于重复的值可以通过repeat()函数重写:

.wrapper {
  display: grid;
  grid-template-columns: repeat(3,200px);
  grid-template-rows:repeat(2,50px);
}

除了repeat函数外,还有以下关键字:

grid-template-columns: repeat(auto-fill, 200px) -- 表示列宽是 200 px,但列的数量是不固定的,只要浏览器能够容纳得下,就可以放置元素
grid-template-columns: 200px 1fr 2fr  -- 表示第一个列宽设置为 200px,后面剩余的宽度分为两部分,宽度分别为剩余宽度的 1/3 和 2/3
minmax(100px, 1fr)  -- 表示列宽不小于100px,不大于1fr
grid-template-columns: 100px auto 100px -- 表示第一第三列为 100px,中间由浏览器决定长度
grid-row-gap: 10px; 表示行间距是 10px
grid-column-gap: 20px; 表示列间距是 20px
grid-gap: 10px 20px; 等同上述两个属性
.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'
                        'c c c';

上面代码将9个单元格分成a、b、c三个区域,如果某些区域不需要利用,则用.表示。

1 2 3
4 5 6
7 8 9

当换成列后,排列变成下面的情况:

1 4 7
2 5 8
3 6 9
.container {
  justify-items: start | end | center | stretch;
  align-items: start | end | center | stretch;
}

属性对应如下:

start:对齐单元格的起始边缘
end:对齐单元格的结束边缘
center:单元格内部居中
stretch:拉伸,占满单元格的整个宽度(默认值)

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

.container {
  justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
  align-content: start | end | center | stretch | space-around | space-between | space-evenly;  
}

两个属性的写法完全相同,都可以取下面这些值:

start - 对齐容器的起始边框
end - 对齐容器的结束边框
center - 容器内部居中
space-around - 每个项目两侧的间隔相等。所以,项目之间的间隔比项目与容器边框的间隔大一倍
space-between - 项目与项目的间隔相等,项目与容器边框之间没有间隔
space-evenly - 项目与项目的间隔相等,项目与容器边框之间也是同样长度的间隔
stretch - 项目大小没有指定时,拉伸占据整个网格容器

比如网格只有3列,但是某一个项目指定在第5行。这时,浏览器会自动生成多余的网格,以便放置项目。超出的部分就是隐式网格

而grid-auto-rows与grid-auto-columns就是专门用于指定隐式网格的宽高

项目属性

grid-column-start 属性:左边框所在的垂直网格线 grid-column-end 属性:右边框所在的垂直网格线 grid-row-start 属性:上边框所在的水平网格线 grid-row-end 属性:下边框所在的水平网格线

<style>
    #container{
        display: grid;
        grid-template-columns: 100px 100px 100px;
        grid-template-rows: 100px 100px 100px;
    }
    .item-1 {
        grid-column-start: 2;
        grid-column-end: 4;
    }
</style>

<div id="container">
    <div class="item item-1">1</div>
    <div class="item item-2">2</div>
    <div class="item item-3">3</div>
</div>
.item {
  justify-self: start | end | center | stretch;
  align-self: start | end | center | stretch;
}

可取的值:

start:对齐单元格的起始边缘。
end:对齐单元格的结束边缘。
center:单元格内部居中。
stretch:拉伸,占满单元格的整个宽度(默认值)

容器属性13个:设置行列宽度(2),设置行列间距(3),设置区域名(1),设置行列排序(1),设置项目位置(3),设置整个内容区域的布局(2),多余项目的属性(1)

项目属性6个:设置项目行列起始位置(4),项目水平垂直布局(2)