CSS的传统布局解决方案,基于盒状模型,依赖display
属性、position
属性、float
属性,对于一些特殊的布局,例如垂直居中,往往要想很多hack的方法来解决。
2009年,W3C提出了一种新的方案--Flex布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。Flex布局的主要思想是为容器赋予控制容器内元素的高度、宽度以及如何分割容器空间的能力。
Flex是Flexible Box的缩写,表示“弹性布局”的意思,能够为盒状模型提供最大的灵活性。任何一个容器都可以指定为flex布局,使用flex布局以后,子元素的float
、clear
和vertical-align
元素都将失效。
.box {
display: flex;
}
行内元素也可以使用Flex布局。
.box {
display: inline-flex;
}
Webkit内核的浏览器,必须加上-webkit前缀。
.box{
display: -webkit-flex; /* Safari */
display: flex;
}
采用Flex布局的元素,称为Flex容器(flex container),简称”容器”。它的所有子元素自动成为容器成员,称为Flex项目(flex item),简称”项目”。容器默认存在两根轴:水平的主轴
(main axis)和垂直的交叉轴
(cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end。项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。
下面对这几个概念作简要介绍:
flex-direction
属性决定。Flex容器具有以下六个属性。
display:flex;
direction
和wrap
的组合属性,默认值是row nowrap
flex-direction属性决定主轴的方向(即容器元素的排列方向),有四个取值。
.box {
flex-direction: row | row-reverse | column | column-reverse;
}
熟悉wrap的同学应该知道,这个属性是决定如何处理一行显示不下的情况,有三个属性:
.box {
flex-wrap: nowrap | wrap | wrap-reverse;
}
flex-flow
是flex-direction
和flex-wrap
组合属性的简写,默认值为row nowrap
。
.box {
flex-flow: <flex-direction> || <flex-wrap>;
}
justify-content
定义项目在主轴上的对齐方式,还能够帮助我们分配容器项目以外的剩余空间,即便是没有剩余空间。有以下属性:
writing-mode
的开始writing-mode
的结束注意不同浏览器对这些属性的支持程度还不太一样,
space-between
从未在Edge浏览器上获得过支持,最安全的几个属性是flex-start
,flex-end
,center
。
.box {
justify-content: flex-start | flex-end | center | space-between | space-around;
}
align-items
该属性决定项目在交叉轴上如何对齐,有以下属性:
在flex布局中有主轴和侧轴的区分,和我们一般认为的横轴为主轴、纵轴为侧轴的固定认知不同,flex布局中主轴和侧轴会发生变化,这是由之前
flex-direction
属性决定的。当flex-direction:row
的时候,主轴就是横轴,要调整元素在横轴的排列就需要使用justify-content
属性。当flex-direction:column
的时候,主轴就是纵轴,要调整元素在横轴的排列就需要使用align-items
属性。
这个属性决定当容器在交叉轴方向还有剩余空间时,项目的排列方式。
这个属性在只有一行容器内项目时无效,在设置了
nowrap
时也无效。
项目包括6个属性
order
属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。通过css就能控制DOM元素的顺序,简直太方便了。
.item {
order: <integer>;
}
flex-grow
属性定义项目相对于其他项目进行扩展的量,默认为0。注意:如果项目不是flex item,则 flex-grow 属性不起作用。如果所有的项目都设置为1,则每个项目分到的空间都一样。如果有一个设置为2,则它分到的空间要比其他项目多一倍。负数无效。
.item {
flex-grow: <number>;
flex-shrink
属性定义项目相对于其他项目缩小的比例。负数无效。
.item {
flex-shrink: <number>
}
flex-basis
属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto
,即项目的本来大小。
.item {
flex-basis: <length> | auto;
}
flex
属性是flex-grow
,flex-shrink
,flex-basis
组合,默认值为0 1 auto
后两个属性可选。
.item {
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}
align-self
属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items
属性。默认值为auto
,表示继承父元素的align-items
属性,如果没有父元素,则等同于stretch
。属性支持的值包括:
flexbox
从出现到现在经历了多个版本,下图new
的含义表示现在的语法display:flex;
。tweener
表示2011年后出现的一个非官方的写法display:flexbox;
。old
表示2009年出现后的旧语法display:box;
。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有