美文网首页
Grid布局相关属性

Grid布局相关属性

作者: Elevens_regret | 来源:发表于2020-03-29 22:29 被阅读0次

    定义display:grid或inline-grid开启子元素的Grid布局。

    .container {
        display: grid;
        //行内元素使用 display: inline-flex;
    }
    

    不同于flex布局,grid布局是一种二维布局,它将容器划分为行和列,行和列组成网格,子元素像表格一样按照设置的属性在这些网格中排列。水平的为行,垂直向的为列。行和列交叉就形成网格。

    父元素设置为grid布局之后,子元素的float、display: inline-block、display: table-cell、vertical-align和column-*属性将会失效。


    容器属性

    1、grid-template-columns、grid-template-rows

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

    .container {
        display: grid;
        grid-template-rows: 50px 50px 50px; // 表示分3行,每一行的高度为50px
        grid-template-columns: 50px 50px 50px;  // 表示分3列,每一列的宽度为50px
    
        // 支持百分比写法
        grid-template-columns: 33.33% 33.33% 33.33%;
        grid-template-rows: 33.33% 33.33% 33.33%;
    }
    

    chrome调试模式下可以看到生成的网格线



    相同的值可以使用repeat()函数进行合并

    // 表示大小为50px的值,重复3次,表示分3行3列,每一行的行高跟每一列的列宽都是50px
    grid-template-rows: repeat(3, 50px); 
    grid-template-columns: repeat(3, 50px);
    // 同样支持重复一种模式,表示以50px,60px,70px为一组值重复2次
    // 表示分6行6列,第1、2、3行行高为分别为50px,60px,70px,第4、5、6行的行高为50px,60px,70px,列宽同理
    grid-template-rows: repeat(2, 50px 60px 70px);
    grid-template-columns: repeat(2, 50px 60px 70px);
    


    repeat()函数的auto-fill关键字,表示以某一数值尽可能多的划分网格,
    当容器宽度固定时

    .container {
        width: 300px;
        display: grid;
        // 当宽度固定时,将以每一列50px的宽度尽可能多的划分网格,此时被划分为了6列
        grid-template-columns: repeat(auto-fill, 50px);
    }
    


    fr关键字,是一个单位关键字,表示所有fr单位之间的倍数关系

    // 表示划分为3列,第一列的宽度为150px,剩下的宽度以1:2的关系分配个第二列和第三列
    grid-template-columns: 150px 1fr 2fr;
    


    minmax()函数表示一个范围,接收两个参数,分别为最大值和最小值

    // 表示动态计算第三列的宽度,最小值为100px,最大值为1fr(与第二列同宽)
    grid-template-columns: 150px 1fr minmax(100px, 1fr);
    

    auto关键字
    表示浏览器自动分配,会将剩余可用空间分配给此项

    grid-template-columns: 150px 50px auto;  // 将容器剩余宽度分配给第三列
    


    可以给每条网格线命名,在之后的各类属性中可以使用命名对命名好的线进行操作

    grid-template-columns: [line1] 50px [line2] 50px [line3 line0] 50px [line4]; // 3列会生成4条竖线,也可以同时给多个命名
    

    使用grid可以简单的实现一些常用的布局

    // 左边菜单栏宽度固定,右边内容区撑满的两栏布局
    .container {
      display: grid;
      grid-template-columns: 200px auto;
    }
    
    // 经典12网格布局
    .container {
      display: grid;
      grid-template-columns: repeat(12, 1fr);
    }
    

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

    grid-row-gap属性设置行之间的间隔,grid-column-gap属性设置列之间的间隔。

    .container {
      display: grid;
      grid-template-rows: repeat(3, 50px);
      grid-template-columns: repeat(3, 50px);
      grid-row-gap: 10px; // 行间距为5px
      grid-column-gap: 10px; // 列间距为5px
    }
    


    grid-gap为上面两个属性的简写,上面的代码可以写成:

    .container {
      grid-gap: 10px 10px; // 行间距 列间距
      // 也可写成
      grid-gap: 10px; // 省略第二个属性表示与第一个相同
    }
    

    这3个属性的grid-前缀已经可以删除,可以直接写成row-gap、column-gap、gap


    3、grid-template-areas

    grid-template-areas属性将对所有网格进行命名规划,对网格的命名规划会影响到网格线的命名,网格起始位置的网格线为'网格名称-start',网格结束位置网格线为'网格名称-end'

    // 直接对3X3的网格区域做布局命名规划
    // 顶部3个网格组成了hearder区域,起始的网格线名称为header-start,结束位置的网格线名称为header-end
    .container {
      grid-template-areas: "header header header"
                           "main main sidebar"
                           "footer footer footer";
      // 如果某些网格不需要规划为某个区域,则直接用.表示
      grid-template-areas: 'a . c'
                           'd . f'
                           'g . i';
    }
    

    4、grid-auto-flow

    grid-auto-flow属性表示网格排列的方式,属性值默认为row,即先行排列,再列排列

    .container {
      // 修改为先列排列,再行排列
      grid-auto-flow: column;
    }
    

    还可以加上dense属性,表示当某些网格被安排好特定位置时,剩余的网格如何排列。



    由于第一个网格占据了两个网格宽度,第二个网格在同一行放不下,会选择第二行起始,这样就出现了一个网格的空隙,dense属性可以让之后的网格尽可能的填满这些空隙。

    .container {
      // 在行方向上尽可能的填满,不留空隙
      grid-auto-flow: row dense;
    }
    

    5、justify-items、align-items、place-items

    justify-items属性设置网格中内容在水平方向上的的位置。

    .container {
      // 在水平方向上居中
      justify-items: center;
    }
    

    align-items属性设置网格中内容在垂直方向上的的位置。

    .container {
      // 在垂直方向上居中
      align-items: center;
    }
    

    place-items属性是justify-items和align-items的简写形式,只写一个值时表示两个值相同。

    .container {
      // 在水平和垂直方向上都居中
      place-items: center;
    }
    

    这3个属性可以取的值有start(对齐网格的起始位置)、end(对齐网格的结束位置)、center(网格内部居中)、stretch(拉伸,没有规定内容的大小时,占满网格的整个宽度,此值为默认值)。


    6、justify-content、align-content、place-content

    justify-content属性设置所有网格组成的内容区域在水平方向上的位置。

    .container {
      // 所有网格组成的内容区域在水平方向上居中
      justify-items: center;
    }
    

    align-content属性设置所有网格组成的内容区域在垂直方向上的位置。

    .container {
      // 所有网格组成的内容区域在垂直方向上居中
      align-items: center;
    }
    

    place-content属性是justify-content和align-content的简写形式,只写一个值时表示两个值相同。

    .container {
      // 所有网格组成的内容区域在水平和垂直方向上都居中
      place-content: center;
    }
    

    这3个属性可以取的值有start(对齐容器的起始位置,此值为默认值)、end(对齐容器的结束位置)、center(容器内部居中)、stretch(拉伸,没有规定项目的大小时,会占满容器相应方向上的整个宽度)、space-around(每个项目两侧的距离相等,会造成项目之间的距离是项目到边缘距离的两倍)、space-between(每个网格之间的间隔相等,网格与容器边缘没有间距)、space-evenly(在相同的方向上,网格与网格之间,网格与边缘之间的距离全部相等)。

    .container {
      place-content: space-around;
    }
    
    .container {
      place-content: space-between;
    }
    
    .container {
      place-content: space-evenly;
    }
    

    7、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、grid-column-end、grid-row-start、grid-row-end

    可以用这4个属性来单独指定某一个网格的位置,grid-column-start表示网格左边框所在的垂直网格线,grid-column-end属性表示网格右边框所在的垂直网格线,grid-row-start属性表示网格上边框所在的水平网格线,grid-row-end属性表示网格下边框所在的水平网格线

    // 通过指定第一个项目的起始和结束网格线,将第一个项目移动到正中间
    .item-1{
      grid-column-start:2;
      grid-column-end:3;
      grid-row-start:2;
      grid-row-end:3;
    }
    
    // 默认只占一个网格宽度,可以省略结束位置
    .item-1{
      grid-column-start:2;
      grid-row-start:2;
    }
    

    // 水平和垂直方向都从第二个网格线开始,占据两个网格宽度
    .item-1{
      grid-column-start:2;
      grid-column-end:4;
      grid-row-start:2;
      grid-row-end:4;
    }
    


    前面通过给网格线命名的方式可以在这4个属性上进行应用。

    .container {
      grid-template-columns: [line1] 50px [line2] 50px [line3 line0] 50px [line4];
    }
    .item-1{
      grid-column-start: line2;
      grid-column-end: line4;
    }
    


    这4个属性值还有span关键字,表示跨越几个网格

    .item-1{
      grid-column-start: span 2;
    }
    
    // 指定结束位置的跨越得到的结果也是一样的
    .item-1{
      grid-column-end: span 2;
    }
    

    2、grid-column、grid-row

    这两个属性都是简写属性。
    grid-column是grid-column-start和grid-column-end的简写形式。
    grid-row是grid-row-start和grid-row-end的简写形式。

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

    同样可以使用span关键字。

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

    只写一项时表示默认跨越1个网格。

    .item-1 {
      grid-column: 2;
      grid-row: 2;
    }
    

    3、grid-area

    grid-area属性直接指定某个网格位于哪一个命名区域

    .container {
      grid-template-areas: 'a b c'
                           'd e f'
                           'g h i';
    }
    .item-1 {
      grid-area: e;
    }
    

    还可以当做grid-column-start、grid-column-end、grid-row-start、grid-row-end这4个属性的简写形式。

    .item-1 {
      grid-area: 2 / 2 / 3 / 3;
    }
    

    4、justify-self、align-self、place-self

    这3个属性的表现形式和值与容器属性的justify-items、align-items、place-items这3个属性完全一致。只不过只作用于单个网格。

    相关文章

      网友评论

          本文标题:Grid布局相关属性

          本文链接:https://www.haomeiwen.com/subject/ztvjuhtx.html