Flex布局

一、Flex布局与传统布局

传统布局依赖于盒模型,利用display、position、float属性来布局,但是其对于某些特殊布局,如垂直居中,就很不方便。这种情况下利用Flex布局就很方便。
注:设置了 Flex 布局以后,其子元素的float、clear和vertical-align属性将失效。

二、Flex布局的基本概念

轴.png

1、Flex布局

即“弹性布局”,是用来为盒模型提供最大的灵活性。

2、flex容器

指设置flex布局的元素:

.box{
    display:flex;
}

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

.box{
    display: -webkit-flex;
    display:flex;
}

3、flex项目

指flex容器的所有子元素。

4、主轴与交叉轴

  • 主轴(main axis):flex容器的水平轴;
  • 交叉轴(cross axis):flex容器的垂直轴;
  • main start、main end:主轴的开始与结束位置,主轴与边框的交叉点;
  • cross start、cross end:交叉轴的开始与结束位置,交叉轴与边框的交叉点;
  • main size:单个项目占据的主轴空间;
  • cross size:单个项目占据的交叉轴空间。

三、Flex布局的属性

Flex布局的属性有两种:设置在容器上的属性和设置在项目上的属性。

容器的属性

容器的属性有6种:flex-direction、flex-wrap、flex-flow、justify-content、align-items、align-content。这些属性均设置在容器上。
注:各属性解析均建立在以下代码基础上:

<style>
        #flex{
            display: flex;
        }
        #flex1{
            background-color: aquamarine;
            width: 100px;
            height: 100px;
        }
        
        #flex2{
            background-color: rgb(127, 136, 255);
            width: 100px;
            height: 100px;
        }
        #flex3{
            background-color: rgb(255, 127, 180);
            width: 100px;
            height: 100px;
        }
</style>
    
<div id="flex">
    <div id="flex1">flex1</div>
    <div id="flex2">flex2</div>
    <div id="flex3">flex3</div>
</div>

flex-direction属性:

flex-direction有4个属性值:row(默认) 、row-reverse、column、column-reverse;用于决定主轴的方向(即项目的排列方向)。

flex-direction: row ;

row.png

flex-direction: row-reverse ;

row-reverse.png

flex-direction: column ;

colum.png

flex-direction: column-reverse ;

column-reverse.png

flex-wrap属性:

flex-wrap有三个属性值: nowrap(默认)、wrap、wrap-reverse;用于规定一条轴线排不下时,如何换行。

flex-wrap:nowrap;不换行

nowrap.png

flex-wrap:wrap;换行,第一行在上方。

wrap.jpg

flex-wrap:wrap-reverse;换行,第一行在下方。

wrap-reverse.jpg

flex-flow属性

flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap。

justify-content属性

justify-content属性有5个属性值:flex-start (默认)、flex-end 、center 、space-between 、space-around;用于定义项目在主轴上的对齐方式。

justify-content:flex-start ;左对齐

flex-start.png

justify-content:flex-end ;右对齐

flex-end.png

justify-content:center ;居中

center.png

justify-content:space-between ;两端对齐,项目之间的间隔都相等

space-between.png

justify-content:space-around;每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍

space-around.png

align-items属性

align-items属性有5个属性值:flex-start 、flex-end 、center 、baseline 、stretch;用于定义项目在交叉轴上如何对齐。
注:设置align-items属性时,要求容器有高度。

<style>
        *{
            <!--将h1的外边距取消,否则会影响 flex-start 与 flex-end的效果-->
            margin:0;
        }
        #flex{
            height: 500px;<!--为容器设置高度-->
            display: flex;
        }
        #flex1{
            background-color: aquamarine;
            width: 100px;
            height: 100px;
        }
        
        #flex2{
            background-color: rgb(127, 136, 255);
            width: 100px;
            height: 100px;
        }
        #flex3{
            background-color: rgb(255, 127, 180);
            width: 100px;
            height: 100px;
        }
</style>
    
<div id="flex">
    <div id="flex1">flex1</div>
    <h1 id="flex2">flex2</h1>
    <div id="flex3">flex3</div>
</div>

align-items:flex-start;各项目于交叉轴的起点对齐

flex-start.png

align-items:flex-end;各项目于交叉轴的终点对齐

flex-end.png

align-items:center;各项目于交叉轴的中点对齐

center.png

align-items:baseline;各项目的第一行文字的基线对齐

baseline.png

align-items:stretch;如果项目未设置高度或设为auto,将占满整个容器的高度

  • 为项目设置高度的情况下:


    stretch-有高度.png
  • 项目没有高度:
<style>
    *{
        margin: 0;
    }
        #flex{
            height:300px ;
            display: flex;
            align-items: stretch;
        }
        #flex1{
            background-color: aquamarine;
        }
        
        #flex2{
            background-color: rgb(127, 136, 255);
        }
        #flex3{
            background-color: rgb(255, 127, 180);
        }
</style>
    
<div id="flex">
    <div id="flex1">flex1</div>
    <h1 id="flex2">flex2</h1>
    <div id="flex3">flex3</div>
</div>
stretch-无高度.png

align-content属性

align-content属性有6个属性值:flex-start 、flex-end 、center、space-between 、space-around 、stretch(默认);用于定义多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。

<style>
    *{
        margin: 0;
        padding: 0;
    }
    .flex{
            width: 240px;
            height: 200px;
            display: flex;
            flex-wrap: wrap;
            background-color: #8c8c8c;
        }
    .flex div{
            border: 2px solid #8c8c8c;
            width: 50px;
            height: 50px;
            background-color: #a0c8ff;
        }
</style>
    
<div class="flex">
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
</div>

align-content:flex-start;与交叉轴的起点对齐

flex-start.png

align-content:flex-end;与交叉轴的终点对齐

flex-end.png

align-content:center;与交叉轴的中点对齐

center.png

align-content:space-between;与交叉轴两端对齐,轴线之间的间隔平均分布

space-between.png

align-content:space-around ;每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍

space-around.png

align-content:stretch;轴线占满整个交叉轴

stretch.png

项目的属性

项目的属性有6种:order、flex-grow、flex-shrink、flex-basis、flex、align-self。

order属性

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

下例中,原本位于第一二三位的方块,在更改了其order数值后,现位于最后三位。

<style>
    *{
        margin: 0;
        padding: 0;
    }
    .flex{
            width: 240px;
            height: 300px;
            display: flex;
            flex-wrap: wrap;
            background-color: #8c8c8c;
        }
    .flex div{
            border: 2px solid #8c8c8c;
            width: 50px;
            height: 50px;
            background-color: #a0c8ff;
        }
    #f3,#f2{
            order: 1;
        }
    #f1{
            order: 5;
        }
</style>
    
<div class="flex">
    <div id="f1">1</div>
    <div id="f2">2</div>
    <div id="f3">3</div>
    <div id="f4">4</div>
    <div id="f5">5</div>
    <div id="f6">6</div>
</div>
order.png

flex-grow属性

用于定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。

下例中,为f1和f5设置同样的数值,由于其各自所在的主轴剩余的空间不等,因此最终的放大效果不等。所以flex-grow属性是一种瓜分项目所在主轴(即使剩余空间不足以支撑项目扩张相应倍数,也不会扩张到另外的主轴上)的剩余空间的属性。

<style>
    *{
        margin: 0;
        padding: 0;
    }
    .flex{
            width: 240px;
            height: 300px;
            display: flex;
            flex-wrap: wrap;
            background-color: #8c8c8c;
        }
    .flex div{
            border: 2px solid #8c8c8c;
            width: 50px;
            height: 50px;
            background-color: #a0c8ff;
        }
    #f1,#f5{
            flex-grow: 5;
        }
    #f3{
            flex-grow: 2;
        }
</style>
    
<div class="flex">
    <div id="f1">1</div>
    <div id="f2">2</div>
    <div id="f3">3</div>
    <div id="f4">4</div>
    <div id="f5">5</div>
    <div id="f6">6</div>
</div>
flex-grow.png

flex-shrink属性

用于定义项目的缩小比例,默认为1。

  • 如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小;
  • 如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。

flex-basis属性

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

flex属性

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

align-self属性

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


参考:Flex 布局教程:语法篇

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341