【Web】Flex布局

转自:http://ife.baidu.com/note/detail/id/952

Flex布局是什么?

W3C针对布局设计的新标准,相对float和position会更加灵活处理父元素和子元素之间布局关系,让布局更加直观和灵活简单。有效的针对不同屏幕宽度大小的情况下,让元素自动有效合理处理布局结构。

适用范围
弹性盒子布局主要适用于应用程序的组件及小规模的布局,而(新兴的)栅格布局则针对大规模的布局。

Flex布局基本概念

Markdown

弹性容器(Flex container)

通过设置 display 属性的值为 flexinline-flex
来定义弹性容器。

弹性项目(Flex item)

弹性容器里子元素自动成为弹性项目,并且弹性项目的floatclearvertical-align属性将失效。

轴(Axis)
  • 主轴(main axis)
  • 交叉轴(cross axis)
    这个2个轴决定了容器里的项目整体布局效果。

Flex容器属性

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

flex-direction决定主轴方向,默认情况下,元素都是从左到右地分布在主轴上

4个取值:

flex-direction: row | row-reverse | column column-reverse;

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

Markdown
Markdown

flex-wrap

是否可以换行(默认不换行),以及如果可以换行,如何排列

3个取值

flex-wrap: nowrap | wrap | wrap-reverse;
nowrap: 默认不换行
wrap: 可以多行,第一行在上方
wrap-reverse: 可以多行,第一行在下方

Markdown

flex-flow

flex-direction 和 flex-wrap 的简写,默认row nowrap

flex-flow: <flex-direction> || <flex-wrap>;
justify-content

决定项目在主轴上的对齐方式

5种取值:

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

flex-start: 左对齐(默认)
flex-end: 右对齐
center: 居中对齐
space-between: 两端对齐,项目之间的间距相等
space-around: 均匀对齐,每个项目两端的间距相等

Markdown

align-items

决定交叉轴的对齐方式

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

flex-start: 交叉轴起点对齐
flex-end: 交叉轴终点对齐
center: 交叉轴居中对齐
baseline: 第一行文字的底部对齐
stretch: (默认)如果项目木有设置高度或者高度为auto,那么项目拉伸充满整个交叉轴空间

Markdown

注意:记住justify-content是沿着主轴的,align-items是沿着交叉轴的,而flex-direction是转换主轴的。这对整体移动元素很关键。

Markdown

align-content

定义多行轴线的对齐方式(如果只有一行,该属性不起作用)

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

flex-start: 交叉轴起点对齐
flex-end: 交叉轴终点对齐
space-between: 交叉轴两端对齐,行之间间距相等
space-around: 交叉轴均匀对齐,行两端间距相等
stretch: 平均分配交叉轴空间,相邻行间距相等(默认,前提如果项目木有设置高度或者高度为auto

注意:当项目的高度之和小于容器的高度并且项目高度固定时,会以交叉轴起点对齐并且项目之间间距相等,但不是flex-start对齐方式,如果此时设置flex-start是没有间距的。

这里项目设置了固定高度,所以stretch无效
Markdown


Flex项目属性

  • order
  • align-self
  • flex-grow
  • flex-shrink
  • flex-basis
order

根据order的值定义项目排列顺序。数值越小,排列越靠前,默认为0

Markdown

align-self

定义单个项目在交叉轴的对齐方式,可覆盖align-items属性
取值和align-items一样:

Markdown

flex-grow

定义项目放大比例,默认为0,当容器有剩余空间时不放大.
重点在于,每个方块的 flex-grow 和其他方块的是成比例的。

flex-grow: <number>; /* default 0 */

第3个项目flex-grow 为3,其他5个项目为1,共 5+3 = 8,第3个占比为3/8,其他为1/8.

Markdown

flex-shrink

定义项目缩小比例。默认为1,随着容器缩小而等比例缩小。
如果设置为0,项目将不缩小。
基本和flex-grow类似,不过一个是缩小,一个是放大。

flex-shrink: <number>; /* default 1 */

Markdown

flex-basis

定义项目占据的主轴空间(main size),默认是auto.
还有就是它可能被其他flex属性所影响。

 flex-basis: <length> | auto; /* default auto */

下面这个 GIF 表示的是它和 width 属性是可以互换的。(但是不完全是这样)
Markdown

注意:flex-basis 和 width 不同的地方是,它是和 flex 坐标轴保持一致的,flex-basis是影响主轴上大小。

下面保持flex-basis不变,改变主轴方向
Markdown

这个时候改变height,而不是width,flex-basis 根据 flex-direction 的不同会影响到 width 或者 height。

flex

flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。

/*简写
auto (1 1 auto) 
none (0 0 auto)
*/
.square#one {
  flex: 2 1 300px;
}
.square#two {
  flex: 1 2 300px;
}

Markdown

最后注意:主轴和交叉轴需要特别注意方向,因为flex属性大部分是作用与轴上的,而方向不同就会导致不同布局效果。

参考链接

通过动图形象地为你介绍 flexbox 是如何工作的(一)
通过动图形象地为你介绍 Flexbox 是如何工作的(二)
Flex 布局教程:语法篇
flex基础布局详解
使用 CSS 弹性盒子

Web中,Flex布局是一种用于创建灵活的、自适应的布局的技术。它使用了flex容器和flex项目来实现布局的灵活性和响应性。 Flex布局的基本概念包括以下几个部分: 1. Flex容器(Flex Container):使用`display: flex;`或`display: inline-flex;`将一个元素定义为Flex容器。Flex容器的子元素将成为Flex项目。 2. Flex项目(Flex Items):Flex容器的直接子元素被称为Flex项目。每个Flex项目都有自己的尺寸和位置,并根据Flex容器的设置进行布局。 3. 主轴(Main Axis)和交叉轴(Cross Axis):Flex容器具有主轴和交叉轴两个方向。主轴是Flex项目的排列方向,默认为水平方向(从左到右)。交叉轴是与主轴垂直的方向,默认为垂直方向(从上到下)。 4. Flex属性:通过设置Flex属性,可以控制Flex项目在主轴和交叉轴上的尺寸、位置和对齐方式。常用的Flex属性包括`flex-grow`、`flex-shrink`和`flex-basis`。 下面是一个使用Flex布局的示例: ```html <style> .container { display: flex; justify-content: center; align-items: center; height: 200px; border: 1px solid black; } .item { flex: 1; height: 100px; margin: 10px; background-color: lightblue; } </style> <div class="container"> <div class="item">Flex项目1</div> <div class="item">Flex项目2</div> <div class="item">Flex项目3</div> </div> ``` 在上面的示例中,我们创建了一个Flex容器,并在容器中放置了三个Flex项目。通过设置容器的`display: flex;`属性,我们将容器定义为Flex容器。然后,通过设置容器的`justify-content: center;`和`align-items: center;`属性,我们将Flex项目在主轴和交叉轴上居中对齐。每个Flex项目都具有相同的`flex: 1;`属性,使它们平均分配剩余的空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值