介绍几种布局方式flex布局、table布局、grid布局等

Flex布局

由于传统的布局方式是基于传统解决案是基于盒状模型,依赖 display属性 + position属性 + float属性。它对于那些特殊布局非常不方便,于是在2009年,W3C提出了一种新的方案----Flex布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。

基本概念

采用Flex布局的元素,称为Flex容器(flex container),简称"容器"。它的所有子元素自动成为容器成员,称为Flex项目(flex item),简称"项目"。
容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end。
项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。
在这里插入图片描述

基本属性介绍

容器的属性

  • 主轴排列方向:左(默认)、右、上、下
 .box {
  flex-direction: row | row-reverse | column | column-reverse;
}
  • 主轴是否换行:不换行(默认)、换行,第一行在上方、换行,第一行在下方
.box{
  flex-wrap: nowrap | wrap | wrap-reverse;
}
  • 主轴对齐方式:左对齐(默认)、右对齐、居中、两端对齐,项目之间的间隔都相等、每个项目两侧的间隔相等(项目之间的间隔比项目与边框的间隔大一倍)
.box {
  justify-content: flex-start | flex-end | center | space-between | space-around;
}
  • 交叉轴对齐方式(垂直方向):交叉轴的起点对齐、交叉轴的终点对齐、交叉轴的中点对齐、项目的第一行文字的基线对齐、如果项目未设置高度或设为auto,将占满整个容器的高度(默认)
.box {
  align-items: flex-start | flex-end | center | baseline | stretch;
}
  • 多根轴线的对齐方式:交叉轴的起点对齐、交叉轴的终点对齐、与交叉轴的中点对齐、与交叉轴两端对齐,轴线之间的间隔平均分布、每根轴线两侧的间隔都相等(轴线之间的间隔比轴线与边框的间隔大一倍)、轴线占满整个交叉轴(默认)
.box {
  align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
  • flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap。
.box {
  flex-flow: <flex-direction> || <flex-wrap>;
}

项目属性
项目的排列顺序:数值越小,排列越靠前,默认为0。

.item {
  order: <integer>;
}

项目的放大比例:默认为0,即如果存在剩余空间,也不放大。如果所有项目的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一个项目的flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍。

.item {
  flex-grow: <number>; /* default 0 */
}

项目的缩小比例:默认为1,即如果空间不足,该项目将缩小。如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。负值对该属性无效。

.item {
  flex-shrink: <number>; /* default 1 */
}

在分配多余空间之前,项目占据的主轴空间:浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。它可以设为跟width或height属性一样的值(比如350px),则项目将占据固定空间。

.item {
  flex-basis: <length> | auto; /* default auto */
}

允许单个项目有与其他项目不一样的对齐方式: 可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。

.item {
  align-self: auto | flex-start | flex-end | center | baseline | stretch;
}

flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。该属性有两个快捷值:auto (1 1 auto) 和 none (0 0 auto)。建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值。

.item {
  flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}

Table布局

基本属性介绍

  • 空间平均划分:子级容器默认是自动平分宽度沾满父级容器
 .box{
         display: table;
      }
.left,.right{
         display: table-cell;
      }
  • 设置其中一个table-cell为固定宽度:如果固定好其中一个子级容器,那么其余子级容器会自动平分宽度沾满父级容器
  • 设置每一个table-cell为固定宽度:所有子元素会均分
  • 垂直居中:把此元素放置在父元素的中部:vertical-align:middle
  • 等高对齐:如果要实现不管两个box哪个高度产生变化另一个就跟随,只需要把右侧的box也设置成display:table-cell就可以实现了。

优缺点

缺点:

  • table 比其他html标签占更多的字节。造成下载时间延迟,占用服务器更多的流量资源(代码冗余)。
  • table 会阻挡浏览其渲染引擎的渲染顺序,会延迟页面的生成速度,让用户等待时间更久。
  • 灵活性差,一旦设计确定,后期很难通过CSS让它展现新的面貌。
  • 不利于搜索引擎抓取信息,直接影响到网站的排名。

优点:

  • 兼容性好、容易上手

Grid布局

基本概念

它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局。以前,只能通过复杂的 CSS 框架达到的效果,现在浏览器内置了。Grid 布局则是将容器划分成"行"和"列",产生单元格,然后指定"项目所在"的单元格,可以看作是二维布局。Grid 布局远比 Flex 布局强大。

基本属性介绍

  • 划分行和列:
.container {
  display: grid;
  grid-template-columns: 33.33% 33.33% 33.33%;
  grid-template-rows: 33.33% 33.33% 33.33%;
}

关键字:repeat()、auto-fill、fr 、minmax()、auto、网格线的名称、布局实例

  • repeat()接受两个参数,第一个参数是重复的次数(上例是3),第二个参数是所要重复的值。repeat()重复某种模式也是可以的。
.container {
  display: grid;
  grid-template-columns: repeat(3, 33.33%);
  grid-template-rows: repeat(3, 33.33%);
}
  • 每一行(或每一列)容纳尽可能多的单元格,这时可以使用auto-fill关键字表示自动填充。
.container {
  display: grid;
  grid-template-columns: repeat(auto-fill, 100px);
}
  • 为了方便表示比例关系,网格布局提供了fr关键字(fraction
    的缩写,意为"片段")。如果两列的宽度分别为1fr和2fr,就表示后者是前者的两倍。
.container {
  display: grid;
  grid-template-columns: 1fr 1fr;
}

fr可以与绝对长度的单位结合使用,这时会非常方便。

.container {
  display: grid;
  grid-template-columns: 150px 1fr 2fr;
}
  • minmax()函数产生一个长度范围,表示长度就在这个范围之中。它接受两个参数,分别为最小值和最大值。
grid-template-columns: 1fr 1fr minmax(100px, 1fr);//minmax(100px, 1fr)表示列宽不小于100px,不大于1fr。
  • auto关键字表示由浏览器自己决定长度。
grid-template-columns: 100px auto 100px;//上面代码中,第二列的宽度,基本上等于该列单元格的最大宽度,除非单元格内容设置了min-width,且这个值大于最大宽度。
  • 网格线的名称: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];
}
//上面代码指定网格布局为3行 x 3列,因此有4根垂直网格线和4根水平网格线。方括号里面依次是这八根线的名字。网格布局允许同一根线有多个名字,比如[fifth-line row-5]。
  • 布局实例:grid-template-columns属性对于网页布局非常有用。两栏式布局只需要一行代码。同时传统的十二网格布局,写起来也很容易。
.wrapper {
  display: grid;
  grid-template-columns: 70% 30%;
}
grid-template-columns: repeat(12, 1fr);

Grid布局的参考网址

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

太多了,有点码不动了。
未完待续,敬请期待。
以后还有更多布局会分享给大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值