zoukankan      html  css  js  c++  java
  • flex布局和grid布局总结

    一   flex布局

    1 基本概念:(1)多层div嵌套,中间层的div既是容器,又是子元素(阮大神称之为项目)。(2)主轴,通常是X轴,水平方向(下面以此坐标轴状态为例)

    2 我认为作用在容器上的属性应该是7个,第一个也是最重要的:display:flex    还有inline-flex;

           阮大神说的作用在窗口上的6个属性(第一个值为默认值),用于控制子元素的布局,感觉最有用的是flex-direction:

    • flex-direction   方向  row | row-reverse | column | column-reverse;
    • flex-wrap      换行     nowrap | wrap | wrap-reverse;
    • flex-flow          方向 || 换行 如:row || nowrap
    • justify-content 主轴对齐  所有子元素进行靠左、靠右或分散对齐。flex-start | flex-end | center | 
                                                                                                                     space- between | space-around;
    • align-items       交叉轴对齐  每个子元素靠上、靠下、纵向居中、拉伸   flex-start | flex-end | center |
                                                                                                                      baseline | stretch;
    • align-content    子元素wrap的情况下形成多行子元素,此时才起作用    flex-start | flex-end | center | space-between | space-around | stretch;

    3 作用在子元素上的6个属性。感觉最有用的是flex:auto,可以让页面饱满些。 

    • order      子元素的先后顺序, 默认值是0的integer。感觉一般用不上。
    • flex-grow   子元素的放大比例, 默认值是0(不放大)的number。如:flex-grow: 2      
    • flex-shrink  子元素的缩小比例, 默认值是1(空间不足就缩小)的number。
    • flex-basis  子元素缩小或放大前的宽度, 默认值是auto即本来大小。如:flex-basis:350px。 
    • flex      简写表示flex-growflex-shrink 和 flex-basis。  
                     推荐使用: flex:auto (即1 1 auto) 和 flex:none (即0 0 auto)。 
    • align-self  允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。该属性可能取6个值,除了auto,其他都与align-items属性完全一致。

    二  grid布局

    可以看成EXCEL表格或围棋棋盘布局。n+1条线中夹着n个行或列。正常情况下,n行和m列会产生n x m个单元格。

    (一)  容器属性 

    1  display: grid;  或 display: inline-grid;

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

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

      grid-template-rows: repeat(3, 33.33%);    

      除了使用绝对单位,也可以使用百分比。

     (1)repeat()重复某种模式也是可以的。grid-template-columns: repeat(2, 100px 20px 80px);

     上面代码定义了6列,第一列和第四列的宽度为100px,第二列和第五列为20px,第三列和第六列为80px。

     (2) auto-fill 关键字

      有时,单元格的大小是固定的,但是容器的大小不确定。如果希望每一行(或每一列)容纳尽可能多的单元格,这时可以使用auto-fill关键字表示自动填充。

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

      上面代码表示每列宽度100px,然后自动填充,直到容器不能放置更多的列。

      (3)fr(fraction)关键字,表示行与行(或列)的比例关系

       grid-template-columns: 1fr 1fr;

      上面代码表示两列同宽 1:1

       fr可以与绝对长度的单位结合使用,这时会非常方便。  如: grid-template-columns: 150px 1fr 2fr;

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

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

        上面代码中,minmax(100px, 1fr)表示列宽不小于100px,不大于1fr。

      (5)auto 关键字 表示由浏览器自己决定长度。grid-template-columns: 100px auto 100px;

         上面代码中,第二列的宽度,基本上等于该列单元格的最大宽度,除非单元格内容设置了min-width,且这个值大于最大宽度。   

        (6)网格线的名称

      grid-template-columns属性和grid-template-rows属性里面,还可以使用方括号,指定每一根网格线的名字,方便以后的引用。grid-template-rows: [r1] 100px [r2] 100px [r3] auto [r4];

    网格布局允许同一根线有多个名字,比如[fifth-line row-5]。

    3  grid-row-gap: 20px;

       grid-column-gap: 20px;

      grid-row-gap属性设置行与行的间隔(行间距),grid-column-gap属性设置列与列的间隔(列间距)。

       grid-gap属性是grid-column-gap和grid-row-gap的合并简写形式,语法如下。

      grid-gap: 20px 20px;

      如果grid-gap省略了第二个值,浏览器认为第二个值等于第一个值。

      4 grid-template-areas 属性,  对区域命名,  如:

    grid-template-areas: "header header header"

                         "main main sidebar"

                         "footer footer .";

    如果某些区域不需要利用,则使用"点"(.)表示。

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

    比如,区域名为header,则起始位置的水平网格线和垂直网格线叫做header-start,终止位置的水平网格线和垂直网格线叫做header-end。

      5 grid-auto-flow 属性

    划分网格以后,容器的子元素会按照顺序,自动放置在每一个网格。默认的放置顺序是"先行后列",即先填满第一行,再开始放入第二行,

      这个顺序由grid-auto-flow属性决定,默认值是row,即"先行后列"。也可以将它设成column,变成"先列后行"。

    grid-auto-flow: column;

    grid-auto-flow属性除了设置成row和column,还可以设成row dense和column dense。

    row dense,表示"先行后列",并且尽可能紧密填满,尽量不出现空格。(即,将网页元素不占用的区域留在网页最右下角)

    column dense,表示"先列后行",并且尽量填满空格。(即,将网页元素不占用的区域留在网页最右下角)

      6 控制对齐的属性

    justify-items属性设置单元格内容的水平位置(左中右),

    align-items属性设置单元格内容的垂直位置(上中下)。

    如: justify-items: start | end | center | stretch;

      align-items: start | end | center | stretch;

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

    如:place-items: start end;

    如果省略第二个值,则浏览器认为与第一个值相等。

    7 justify-content属性是整个内容区域在容器里面的水平位置(左中右),align-content属性是整个内容区域的垂直位置(上中下)。

    justify-content: start | end | center | stretch | space-around | space-between | space-evenly;

      align-content: start | end | center | stretch | space-around | space-between | space-evenly;  

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

    place-content: space-around space-evenly;

    如果省略第二个值,浏览器就会假定第二个值等于第一个值。

    8  grid-auto-columns 属性 grid-auto-rows 属性

    有时候,一些项目的指定位置,在现有网格的外部。比如网格只有3列,但是某一个项目指定在第5行。这时,浏览器会自动生成多余的网格,以便放置项目。

    grid-auto-columns属性和grid-auto-rows属性用来设置,浏览器自动创建的多余网格的列宽和行高。它们的写法与grid-template-columns和grid-template-rows完全相同。如果不指定这两个属性,浏览器完全根据单元格内容的大小,决定新增网格的列宽和行高。

    下面的例子里面,划分好的网格是3行 x 3列,但是,8号项目指定在第4行,9号项目指定在第5行,那么浏览器会自动增加第4和第5行,行高50px.

    .container {

      display: grid;

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

      grid-template-rows: 100px 100px 100px;

      grid-auto-rows: 50px; 

    }

    上面代码指定新增的行高统一为50px(原始的行高为100px)。

    9  

    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属性:下边框所在的水平网格线

    .item-1 {

      grid-column-start: 2;

      grid-column-end: 4;

    }

    上面代码指定,1号项目的左边框是第二根垂直网格线,右边框是第四根垂直网格线

    如果除了1号项目以外,其他项目都没有指定位置,由浏览器自动布局,这时它们的位置由容器的grid-auto-flow属性决定,这个属性的默认值是row,因此会"先行后列"进行排列。

    读者可以把这个属性的值分别改成column、row dense和column dense,看看其他项目的位置发生了怎样的变化。

    这四个属性的值,除了指定为第几个网格线,还可以指定为网格线的名字。

    这四个属性的值还可以使用span关键字,表示"跨越",即左右边框(上下边框)之间跨越多少个网格。

    .item-1 {

      grid-column-start: span 2;

    }

    上面代码表示,1号项目的左边框距离右边框跨越2个网格。

    2

    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:  / ;

    }

    下面是一个例子。

    .item-1 {

      grid-column: 1 / 3;

      grid-row: 1 / 2;

    }

    /* 等同于 */

    .item-1 {

      grid-column-start: 1;

      grid-column-end: 3;

      grid-row-start: 1;

      grid-row-end: 2;

    }

    上面代码中,项目item-1占据第一行,从第一根列线到第三根列线。

    这两个属性之中,也可以使用span关键字,表示跨越多少个网格。

    .item-1 {

      background: #b03532;

      grid-column: 1 / 3;

      grid-row: 1 / 3;

    }

    /* 等同于 */

    .item-1 {

      background: #b03532;

      grid-column: 1 / span 2;

      grid-row: 1 / span 2;

    }

    上面代码中,项目item-1占据的区域,包括第一行 + 第二行、第一列 + 第二列。

    3 grid-area 属性

    grid-area属性指定项目放在哪一个区域。

    .item-1 {

      grid-area: e;

    }

    上面代码中,1号项目位于e区域。

    4.4

    justify-self 属性,

    align-self 属性,

    place-self 属性

    justify-self属性设置单元格内容的水平位置(左中右),跟justify-items属性的用法完全一致,但只作用于单个项目。

    align-self属性设置单元格内容的垂直位置(上中下),跟align-items属性的用法完全一致,也是只作用于单个项目。

    .item {

      justify-self: start | end | center | stretch;

      align-self: start | end | center | stretch;

    }

    这两个属性都可以取下面四个值。

    start:对齐单元格的起始边缘。

    end:对齐单元格的结束边缘。

    center:单元格内部居中。

    stretch:拉伸,占满单元格的整个宽度(默认值)

    参考:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html

    http://www.ruanyifeng.com/blog/2019/03/grid-layout-tutorial.html

    ——

  • 相关阅读:
    【乱侃】How do they look them ?
    【softeware】Messy code,some bug of Youdao notebook in EN win7
    【随谈】designing the login page of our project
    【web】Ad in security code, making good use of resource
    SQL数据库内存设置篇
    关系数据库的查询优化策略
    利用SQL未公开的存储过程实现分页
    sql语句总结
    sql中使用cmd命令注销登录用户
    SQLServer 分页存储过程
  • 原文地址:https://www.cnblogs.com/pu369/p/12511506.html
Copyright © 2011-2022 走看看