Css 弹性布局(Flex)详细介绍(Flex 属性详解、场景分析)_css flex

.box {
  display: inline-flex;
}

Webkit 内核的浏览器,必须加上-webkit前缀。

.box {
  display: -webkit-flex;  /* Safari */
  display: flex;
}

采用 Flex 布局的元素,称为 Flex 容器(flex container),简称"容器"。它的所有子元素自动成为容器成员,称为 Flex 项目(flex item),简称"项目"。

Flex 容器属性

  • flex-direction
  • flex-wrap
  • flex-flow
  • justify-content
  • align-items
  • align-content

接下来,咱们通过具体实例介绍Flex属性的使用与其在布局上达成的效果。

Flex 基本使用

场景一

整个页面分为两大部分,我们希望左边部分作为菜单栏,宽度固定;右边部分作为内容展示区,宽度自适应且占满剩余部分。

类似如下布局

常规方式:浮动(float)

首先,将框架搭起来

<div id="app">
  <div id="nav">
    <div class="main-content">
      <div class="left-content">Left</div>
      <div class="right-content">Right</div>
    </div>
  </div>
</div>

为了方便查看效果,给每个盒子设置大小与添加背景色

<style>
.main-content {
  width: 100%;
  height:100%;
  background: #72f884;
}
.left-content {
  box-sizing: border-box;
  width: 200px;
  height: 200px;
  background: rgb(238, 119, 34);
}
.right-content {
  box-sizing: border-box;
  width: 200px;
  height: 200px;
  background: rgb(68, 133, 255);
}
</style>

初始页面展示效果

现在,使用浮动(float),使左边跟右边并列布局

<style>
.main-content {
  width: 100%;
  height:100%;
  background: #72f884;
}
.left-content {
  box-sizing: border-box;
  width: 200px;
  height: 200px;
  background: rgb(238, 119, 34);
  /* 使用浮动完成左右并列布局 */
  float: left;
}
.right-content {
  box-sizing: border-box;
  width: 200px;
  height: 200px;
  background: rgb(68, 133, 255);
  /* 使用浮动完成左右并列布局 */
  float: left;
}
</style>

页面展示效果

此时,再将右边的宽度通过 calc() 方法计算,实现右边自适应

<style>
.right-content {
  box-sizing: border-box;
  /* width: 200px; */
  height: 200px;
  background: rgb(68, 133, 255);
  /* 使用浮动完成左右并列布局 */
  float: left;
  /* 使用calc(),右边宽度 = 总宽度 - 左边菜单栏宽度  */
  width: calc(100% - 200px);
}
</style>

缩小窗口,查看效果

此时,实现了场景一的需求,效果看起来也还OK。但是有个问题,现在的这个布局使用的是浮动,即代表着这两个块脱离了文档流,如果页面有其他布局区域,如头部导航栏、底部关于栏、甚至是其他主内容区,这时候我们可能就需要花点时间去清除浮动带来的影响,或者是增加更多的浮动来完成其他区域的布局。

那么有没有一种布局是既可以不使用浮动(或者说是不脱离文档流),又能实现上面的布局呢?答案是肯定的,可以使用Flex(弹性布局),且写起来也更简便。

现在,我们将浮动样式去掉,在包含左右两个盒子的父盒子加上 display:flex,表示使用弹性布局

<style>
.main-content {
  width: 100%;
  height:100%;
  background: #72f884;
  /* 使用flex弹性布局 */
  display: flex;
}
.left-content {
  box-sizing: border-box;
  width: 200px;
  height: 200px;
  background: rgb(238, 119, 34);
}
.right-content {
  box-sizing: border-box;
  width: 200px;
  height: 200px;
  background: rgb(68, 133, 255);
}
</style>

此时查看页面效果

实现右边部分自适应只需要为右边添加样式 flex:1 即可

.right-content {
  box-sizing: border-box;
  width: 200px;
  height: 200px;
  background: rgb(68, 133, 255);
  /* 表示该盒子自动占满剩余空间(往下展开) */
  flex: 1;
}

此时左右两个盒子并列布局,且右边自适应,why?以下详细展开。

flex-direction

flex-direction属性决定主轴的方向,即项目(或者说是子盒子)的排列方向。

它可能有4个值。

  • row(默认值):主轴为水平方向,起点在左端。
  • row-reverse:主轴为水平方向,起点在右端。
  • column:主轴为垂直方向,起点在上沿。
  • column-reverse:主轴为垂直方向,起点在下沿。

布局图示

上面例子不设置该属性,因此为默认值(row),即主轴水平、从左到右排列。

场景二

整个页面分为多个部分,我们希望这些部分是并列布局,且宽度自适应。

页面布局如下(以三个部分举例,若更多部分做法一致)

<div id="app">
  <div id="nav">
    <div class="main-content">
      <div class="left-content">Left</div>
      <div class="middle-content">Middle</div>
      <div class="right-content">Right</div>
    </div>
  </div>
</div>

初始样式(同样,父盒子使用flex布局)

<style>
.main-content {
  width: 100%;
  height:100%;
  background: #72f884;
  /* 使用flex弹性布局 */
  display: flex;
}
.left-content {
  box-sizing: border-box;
  width: 200px;
  height: 200px;
  background: rgb(238, 119, 34);
}
.middle-content {
  box-sizing: border-box;
  width: 200px;
  height: 200px;
  background: rgb(173, 40, 250);
}
.right-content {
  box-sizing: border-box;
  width: 200px;
  height: 200px;
  background: rgb(68, 133, 255);
}
</style>

初始页面效果

现在,我们三个子盒子的宽度是固定的,因此实现不了自适应,我们可以使用 %(百分比)方式设置各个子盒子相对于父盒子所占的百分比

<style>
.left-content {
  box-sizing: border-box;
  /* 宽度使用 % ,实现自适应 */
  width: 30%;
  height: 200px;
  background: rgb(238, 119, 34);
}
.middle-content {
  box-sizing: border-box;
  /* 宽度使用 % ,实现自适应 */
  width: 40%;
  height: 200px;
  background: rgb(173, 40, 250);
}
.right-content {
  box-sizing: border-box;
  /* 宽度使用 % ,实现自适应 */
  width: 30%;
  height: 200px;
  background: rgb(68, 133, 255);
}
</style>

页面展示效果

缩小查看页面展示效果

注意观察,此时三个子盒子的宽度总和等于父盒子的宽度,即30% + 40% + 30% = 100%。

如果三个盒子的宽度占比总和小于100%,即都为30%,页面效果如下

此时页面会多出空的部分,我们可以将这部分利用起来。

justify-content

该属性定义了项目在主轴上的对齐方式。

它可能取5个值,具体对齐方式与轴的方向有关。下面假设主轴为从左到右。

此时主轴(flex-direction)为默认的row,即水平方向,从左到右。

  • flex-start(默认值):左对齐(即上面页面展示效果)
  • flex-end:右对齐
  • center: 居中
  • space-between:两端对齐,项目之间的间隔都相等。
  • space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。

接下来我们一一展示属性达成的效果

flex-start

如上图

flex-end

center

space-between(注意空白部分分配情况)

space-around(注意空白部分分配情况)

以上就是justify-content不同取值的布局效果,最后两个取值就是如何分配剩余的空白部分。

还有一个与justify-content相似的属性是align-items。

align-items

该属性定义项目在交叉轴上如何对齐。(如果主轴为水平,那么交叉轴就是垂直)

它可能取5个值。具体的对齐方式与交叉轴的方向有关,下面假设交叉轴从上到下。

  • flex-start:交叉轴的起点对齐。
  • flex-end:交叉轴的终点对齐。
  • center:交叉轴的中点对齐。
  • baseline: 项目的第一行文字的基线对齐。
  • stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。

**flex-start**、**flex-end**、**center与**justify-content中展示效果类似,只是一个是水平方向一个是垂直方向。各属性布局效果如下:

回到场景二,如果三个盒子的宽度占比总和大于100%,页面效果又是怎样的?

<style>
.left-content {
  box-sizing: border-box;
  /* 宽度使用 % ,实现自适应 */
  width: 40%;
  height: 200px;
  background: rgb(238, 119, 34);
}
.middle-content {
  box-sizing: border-box;
  /* 宽度使用 % ,实现自适应 */
  width: 40%;
  height: 200px;
  background: rgb(173, 40, 250);
}
  • 28
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值