弹性布局flex

后盾人CSS课程学习笔记

CSS3 弹性盒模型(Flex Box)

弹性盒子是 CSS3 的一种新的布局模式。

CSS3 弹性盒( Flexible Box 或 flexbox),是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式。

引入弹性盒布局模型的目的是提供一种更加有效的方式来对一个容器中的子元素进行排列、对齐和分配空白空间。

浏览器支持

表格中的数字表示支持该属性的第一个浏览器的版本号。

紧跟在数字后面的 -webkit- 或 -moz- 为指定浏览器的前缀。

属性 Chrome Edge Fire Fox Safari Opera
Basic support (single-line flexbox) 29.0 21.0 -webkit- 11.0 22.0 18.0 -moz- 6.1 -webkit- 12.1 -webkit-
Multi-line flexbox 29.0 21.0 -webkit- 11.0 28.0 6.1 -webkit- 17.0 15.0 -webkit- 12.1

弹性盒模型

声明定义

容器盒子里面包含着容器元素,使用 display:flexdisplay:inline-flex 声明为弹性盒子。

使用display: flex进行声明定义的元素将可以看作是一个弹性盒容器,容器内的元素将可以使用后续的一些样式进行处理。当然,flex容器下的子元素也可以使用display: flex将它定义成弹性盒容器,即容器中还有容器。

<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>声明flex布局</title>

        <style>
            * {
                margin: 0;
                padding: 0;
            }

            footer {
                /* 使用 display: flex 或 display: inline-flex 将元素设置成弹性盒模型 */
                /* display: flex 将元素设置成块状的弹性盒模型 */
                /* display: inline-flex 将元素设置成行状的弹性盒模型 */
                display: flex;
                /* display: inline-flex; */
                background-color: #ccc;
                height: 100px;
            }
        </style>
    </head>
    <body>
        <footer>
            <div>moxuan</div>
            <div>max</div>
            <div>xyx</div>
        </footer>
    </body>
</html>

flex-direction

flex-direction:用于控制弹性盒子的元素排列方向(用于控制弹性盒子主轴的方向)

flex-direction 功能描述
row 从左到右水平排列元素(默认值)
row-reverse 从右向左排列元素
column 从上到下垂直排列元素
column-reverse 从下到上垂直排列元素
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>flex-direction</title>

        <style>
            * {
                margin: 0;
                padding: 0;
            }

            body {
                margin: 10px 20px;
            }

            main {
                /* 将 mian 元素定义成 flex 容器 */
                display: flex;
                /* flex-direction 定义容器的主轴方向,默认是 row ,即水平方向 */
                flex-direction: row;
                /* flex-direction: row-reverse; */
                /* flex-direction: column; */
                /* flex-direction: column-reverse; */

                border: 2px solid #cccccc;
            }

            main div {
                width: 100px;
                height: 100px;
                background-color: red;
                margin: 10px;
            }
        </style>
    </head>
    <body>
        <main>
            <div>1</div>
            <div>2</div>
            <div>3</div>
        </main>
    </body>
</html>

flex-direction示例

flex-wrap

flex-wrap:规定flex容器在某一方向长度不够时是否换行,默认flex-wrap: nowarp不换行,此时对容器内的元素进行压缩处理(用于控制交叉轴(副轴)的方向)

flex-wrap按行换行,正常wrap方向是从上到下,wrap-reverse方向是从下到左

flex-wrap按列换行,正常wrap方向是从左到右,wrap-reverse方向是从右到左

flex-wrap 功能说明
nowrap 元素不拆行或不拆列(默认值)
wrap 容器元素在必要的时候拆行或拆列。
wrap-reverse 容器元素在必要的时候拆行或拆列,但是以相反的顺序
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>flex-wrap</title>

        <style>
            * {
                margin: 0;
                padding: 0;
            }

            body {
                margin: 10px 20px;
            }

            main {
                /* 容器宽度为280 < 3*100 */
                width: 280px;

                /* 将 mian 元素定义成 flex 容器 */
                display: flex;
                /* flex-direction 定义容器的主轴方向,默认是 row ,即水平方向 */
                flex-direction: row;
                /* flex-wrap 规定flex容器是否换行,默认是 nowrap 不换行 */
                /* 此时当容器的指定方向装不下时,容器会对容器内的元素进行压缩处理 */
                flex-wrap: nowrap;
                /* flex-wrap: wrap; */
                /* flex-wrap: wrap-reverse; */

                border: 2px solid #cccccc;
            }

            main div {
                width: 100px;
                height: 100px;
                background-color: red;
                background-clip: content-box;
                padding: 10px;
                box-sizing: border-box;
            }
        </style>
    </head>
    <body>
        <main>
            <div>1</div>
            <div>2</div>
            <div>3</div>
        </main>
    </body>
</html>

flex-wrap示例

flex-flow

flex-flow: <flex-direction> <flex-wrap>,即flex-flow是flex-direction和flex-wrap的组合

flex容器中轴的概念

flex容器中有两种轴:主轴、副轴(交叉轴)

flex-direction规定主轴的方向;flex-wrap规定副轴的方向

例如:

  • flex-direction: row; flex-wrap: wrap时,主轴为从左到右的水平轴(元素排列方向),副轴为从上到下的垂直轴(元素的换行方向);
  • flex-direction: row-reverse; flex-wrap: wrap-reverse时,主轴为从右到左的水平轴,副轴为从下到上的垂直轴;
  • flex-direction: column; flex-wrap: wrap时,主轴为从上到下的垂直轴,副轴为从左到右的水平轴;
  • 。。。。。。

对齐方式

<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>flex容器对齐方式</title>

        <style>
            * {
                margin: 0;
                padding: 0;
            }

            body {
                margin: 10px 20px;
            }

            main {
                height: 150px;

                display: flex;
                /* 根据 flex-direction: row; 当前主轴为从左到右 */
                flex-direction: row;
                /* 根据 flex-wrap: wrap; 当前副轴为从上到下 */
                flex-wrap: wrap;

                justify-content: flex-start;
                /* justify-content: flex-end; */
                /* justify-content: center; */
                /* justify-content: space-between; */
                /* justify-content: space-around; */
                /* justify-content: space-evenly; */
                /* justify-items: center; */
                /* align-content: stretch; */
                /* align-items: stretch; */

                border: 2px solid #cccccc;
            }

            main div {
                width: 100px;
                height: 100px;
                background-color: red;
                /* background-clip: content-box; */
                padding: 10px;
                box-sizing: border-box;
            }
        </style>
    </head>
    <body>
        <main>
            <div>1</div>
            <div>2</div>
            <div>3</div>
            <div>4</div>
            <div>5</div>
        </main>
    </body>
</html>

justify-content

justify-content:设置主轴内容的对齐方式

justify-content 功能说明
flex-start 元素紧靠主轴起点对齐
flex-end 元素紧靠主轴终点对齐
center 元素沿主轴方向居中对齐
space-between 第一个元素靠起点,最后一个元素靠终点,余下元素平均分配空间
space-around 每个元素两侧的间隔相等。所以,元素之间的间隔比元素与容器的边距的间隔大一倍
space-evenly 元素间距离平均分配(这个样式好看)
justify-content示例
align-items

align-items:控制元素在行上的对齐方式(副轴)

align-items 功能说明
stretch 元素被拉伸以适应容器(默认值)(优先级低于width、height之类)
center 元素位于容器的中心
flex-start 元素位于容器的交叉轴开头
flex-end 元素位于容器的交叉轴结尾
align-items示例
align-content

align-content:控制行在副轴上的对齐方式

align-content 功能说明
stretch 将空间平均分配给元素
flex-start 元素紧靠副轴起点
flex-end 元素紧靠副轴终点
center 元素从弹性容器中心开始
space-between 第一个元素靠副轴起点,最后一个元素靠副轴终点,余下元素平均分配空间
space-around 每个元素两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍
space-evenly 元素间距离平均分配
align-content示例

弹性元素

align-self

align-self:对单个元素的副轴对齐方式控制,控制方式同align-items,不同之处在于align-self是作用在flex容器的元素上,而align-items直接作用在flex容器上。

flex-grow

flex-grow:用于将弹性盒子的可用空间,分配给弹性元素。可以使用整数或小数声明。

<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>flex容器对齐方式</title>

        <style>
            * {
                margin: 0;
                padding: 0;
            }

            body {
                margin: 10px 20px;
            }

            main {
                width: 560px;
                height: 150px;

                display: flex;
                /* 根据 flex-direction: row; 当前主轴为从左到右 */
                flex-direction: row;
                /* 根据 flex-wrap: wrap; 当前副轴为从上到下 */
                flex-wrap: wrap;

                border: 2px solid #cccccc;
            }

            main div {
                width: 100px;
                height: 100px;
                background-color: red;
                background-clip: content-box;
                padding: 10px;
                box-sizing: border-box;
                border: 1px solid red;
            }

            /* main 下的三个 div 元素 */
            /* flex-grow 属性值分别为 0 1 3 */
            /* 它们共同分配主轴方向的剩余空间 */
            /* 首先按照 flex-grow 的值的总和将剩余空间拆分 */
            /* flex-grow 值为 0 则表示不分配剩余空间 */
            /* flex-grow 值为 1 则表示分配一份空间 */
            /* flex-grow 值为 3 则表示分配 3 分空间 */
            main div:first-child {
                flex-grow: 0;
            }
            main div:nth-child(2) {
                flex-grow: 1;
            }
            main div:nth-child(3) {
                flex: 3;
            }
        </style>
    </head>
    <body>
        <main>
            <div>1</div>
            <div>2</div>
            <div>3</div>
        </main>
    </body>
</html>

flex-grow示例
flex-shrink

flex-grow 相反 flex-shrink 是在弹性盒子装不下元素时定义的缩小值。

缩小比例 = 不足的空间 / (元素1宽度 x 缩小比例) + (元素2宽度 x 缩小比例) ...
最终尺寸 = 元素3宽度 - (缩小比例 x  元素3的宽度) X 元素宽度
flex-basis

flex-basis:主轴的基准尺寸

flex

flex: <flex-grow> <flex-shrink> <flex-basis>,flex是flex-grow、flex-shrink和flex-basis的组合

order

order用于做元素的排序,默认order值为 0

order的值越大,元素越靠后

使用margin自动撑满空间技巧

margin-right: auto

比如对于顶部header,左边有一部分内容,右边有一部分内容

当所有的元素都是用的display: flex弹性盒模型的时候

此时,可以在左边的元素上使用margin-right: auto让左侧的元素自动撑满

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

推荐阅读更多精彩内容