flex弹性布局

173 阅读4分钟

flex布局可以简便、完整、响应式地实现各种页面布局。目前也得到所有浏览器的支持,可以放心大胆地使用这项功能。以下做简单使用介绍。

任意一个容器都可以使用flex布局。display:flex;

概念

使用flex弹性布局之前,需要搞明白几个名词。就是名词,记住就行 (假设容器是个长方形的)

  • 主轴(main axis) 长
  • 交叉轴(cross axis) 宽
  • 主轴开始的位置(main start
  • 主轴结束的位置(main end
  • 交叉轴开始的位置(cross start
  • 交叉轴结束的位置(cross end

容器和项目各有6个属性,下面依次介绍

容器属性

容器的属性:就是指在该盒子下,控制内部元素排列方式的属性。

WeChata7059dce50bbf04ad29e53e31a5f0de3.png

flex-direction

flex-direction属性是决定主轴的方向。默认情况下,主轴方向是水平从左到右的。

flex-direction有四个值:

  • row:水平排列,元素从窗口左到右
  • row-reverse,水平排列,元素从窗口右到左
  • column,垂直排列,元素顺序从上到下
  • column-reverse,垂直排列,元素逆序从上到下
<div class="demo">
    <div>第一个块级元素</div>
    <div>第二个块级元素</div>
</div>
<style>
.demo{
    display: flex;
    flex-direction: row-reserve;
}
</style>

image.png

<div class="demo">
    <div>第一个块级元素</div>
    <div>第二个块级元素</div>
</div>
<style>
.demo{
    display: flex;
    flex-direction: column-reverse;
}
</style>

image.png 自己可以手动尝试rowcolumn,加深印象。

flex-wrap

默认情况下,容器内元素都是水平排放不会自动换行,如果超出窗口之外,会加横向滑动条。 flex-wrap属性决定如果一行放不下的情况下,如何换行。

flex-wrap有三个值:

  • nowrap 默认情况,不换行
  • wrap 换行,往下换行(正常人类书写方向)
  • wrap-reserve 换行,往上换行
<div class="demo">
    <div v-for="item in [1,2,3,4,5,6,7]" :key="item">{{item}}</div>
</div>
<style>
.demo{
    display: flex;
    flex-wrap: wrap;
    
}
.content {
    margin: 50px;
    width:150px;
    background-color: pink
}
</style>

image.png

<div class="demo">
    <div v-for="item in [1,2,3,4,5,6,7]" :key="item">{{item}}</div>
</div>
<style>
.demo{
    display: flex;
    flex-wrap: wrap-reverse;
    
}
.content {
    margin: 50px;
    width:150px;
    background-color: pink
}
</style>

image.png

flex-flow

flex-flow是flex-direction和flex-wrap的简写形式。 书写方式为,flex-flow:row wrap;(水平排列,元素从窗口左到右; 往下换行)

justify-content

justify-content属性是指定项目在主轴上的排列方式 它有六个值

  • flex-start:(也是默认情况),左对齐。
  • flex-end:右对齐。
  • center:居中对齐
  • space-around:项目两边的间隔相等,平分占据水平方向的空间
  • space-between:两端和窗口两边重叠,项目之间间隔相等,平分占据水平方向的空间
  • space-evenly:每个项目间隔和容器之间的间隔相等

截取space-aroundspace-evenly效果对比:

space-aroundimage.png space-evenlyimage.png

align-items

align-items定义项目在交叉轴上的排列方式 它有5个值:

  • flex-start :交叉轴的起点对齐,默认交叉轴起点在盒子顶部。
  • flex-end: 交叉轴的终点对齐,默认交叉轴终点在盒子底部。
  • center:交叉轴的中点对齐
  • baseline:依据第一个项目中的文字基线对齐
  • stretch: 如果项目没有设置高度或者高度设置为auto,则会占据容器的整个高度

align-content

align-content定义了多根轴线的对齐方式,前提是需要设置flex-wrap:wrap,否则不会生效。(如果项目都不换行了,哪还有多轴线的事儿呢) 它有6个值:

  • flex-start:以交叉轴的起点对齐。依次向下换行
  • flex-end:以交叉轴的终点对齐。依次向下换行
  • center:以交叉轴的中点对齐。依次向下换行
  • space-around:每根轴线两侧的间隔都相等
  • space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
  • stretch: 轴线占满整个交叉轴 没看懂space-aroundstretch的不同点

项目属性

项目属性:属性都设置在项目(元素)上 image.png

order

order属性定义项目的排列顺序,数值越小,排列越靠前,默认值为0.

<div class="flex-box">
    <div style="order:1">1</div>
    <div style="order:0">0</div>
    <div style="order:2">2</div>
    <div style="order:4">4</div>
    <div style="order:3">3</div>
    <div style="order:-1">-1</div>
</div>
<style>
.flex-box{
	display: flex;
}
.flex-box div{
	background-color: pink;
	margin:10px
}
</style>

image.png

flex-grow

flex-grow:定义元素的放大比例,默认情况为0(即使存在剩余空间,也不放大)。如果所有元素flex-grow的属性值都为1,则所有元素平分剩余空间,如果有元素的flex-grow属性值为3,则该元素占据剩余空间比其他为1的元素多两倍。

<div class="flex-box">
    <div style="flex-grow:1">1</div>
    <div style="flex-grow:1">0</div>
    <div style="flex-grow:3">2</div>
    <div style="flex-grow:1">4</div>
</div>
<style>
.flex-box{
	display: flex;
}
.flex-box div{
	background-color: pink;
	margin:10px
}
</style>

image.png

flex-shrink

flex-shrink:定义元素的缩小比例,默认为1(如果空间不足,该元素则缩小)。如果所有元素的flex-shrink的属性值都为1,空间不够时,都等比例缩小。如果有一个元素为0,则该元素不缩小。

与flex-grow类似,可手动尝试,这里不再展示。

flex-basis

flex-basis:定义元素在分配多余空间之间,元素占据主轴的空间(如果主轴水平方向,设置的元素的宽度。如果主轴垂直方向,设置元素的高度)

<div class="flex-box">
    <div style="flex-basis:40px">1</div>
    <div style="flex-basis:30px">0</div>
    <div style="flex-basis:50px">2</div>
    <div style="flex-basis:60px">3</div>
</div>
<style>
.flex-box{
	display: flex;
	width:500px
}
.flex-box div{
	width40px;
	background-color: pink;
	margin:10px
}
</style>

image.png

flex

flex:是flex-grow flex-shrink flex-basis的简写,默认值为 0 1 auto

align-self

:允许单个项目与其他项目不一样的对齐方式,可以覆盖align-items属性。默认为auto:表示继承父元素的align-items属性。

  • auto
  • flex-start
  • flex-end
  • center
  • baseline
  • stretch