弹性布局

了解弹性

后盾人网站:houdunren.com
讲师:@ 向军大叔

Flex 是 Flexible Box 的缩写,意为"弹性布局",可以轻松的控制元素排列、对齐和顺序的控制。

现在的终端类型非常多,使用弹性盒模型可以让元素在不同尺寸终端控制尺寸。

响应体验

通过下面小米移动端中间区域水平排列元素,来体验一下响应布局带来的便利性。

image-20190826121529633

image-20190826122919354

布局对比

下面通过微信界面的例子来对比传统布局与弹性布局的不同。

Screenshot_20190826-115538

传统布局

1
2
3
弹性布局

1
2
3
弹性盒子
声明定义

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

声明块级弹性盒子

image-20190826013111496

1
2
3

声明内联级弹性盒子

image-20190826013016826

flex-direction

用于控制盒子元素排列的方向。

值 描述
row 从左到右水平排列元素(默认值)
row-reverse 从右向左排列元素
column 从上到下垂直排列元素
column-reverse 从下到上垂直排列元素
row-reverse

image-20190825153527624

后盾人
hdcms.com

houdunren.com

column-reverse

image-20190825153716282

article {

flex-direction: column-reverse;

}

flex-wrap

flex-wrap 属性规定flex容器是单行或者多行,同时横轴的方向决定了新行堆叠的方向。

选项 说明
nowrap 元素不拆行或不拆列(默认值)
wrap 容器元素在必要的时候拆行或拆列。
wrap-reverse 容器元素在必要的时候拆行或拆列,但是以相反的顺序
行元素换行

image-20190825160555944

1
2
3

水平排列反向换行

image-20190825160933131


flex-direction: row;
flex-wrap: wrap-reverse;

垂直元素换行

image-20190825161232847


flex-direction: column;
flex-wrap: wrap;

垂直元素反向换行

image-20190825161338307

flex-direction: column;
flex-wrap: wrap-reverse;

flex-flow

flex-flow 是 flex-direction 与 flex-wrap 的组合简写模式。

下面是从右向左排列,换行向上拆分行。

image-20190825163652754

flex-flow: row-reverse wrap-reverse;

轴说明

水平排列

下面是使用 flex-flow: row wrap 的主轴与交叉轴说明。

image-20190825175808514

下面是使用 flex-flow: row-reverse wrap-reverse 的主轴与交叉轴说明。

image-20190825180523789

垂直排列

下面是使用 flex-flow: column wrap 的主轴与交叉轴说明。

image-20190825181547815

justify-content

用于控制元素在主轴上的排列方式,再次强调是主轴的排列方式。

选项 说明
flex-start 元素紧靠主轴起点
flex-end 元素紧靠主轴终点
center 元素从弹性容器中心开始
space-between 第一个元素靠起点,最后一个元素靠终点,余下元素平均分配空间
space-around 每个元素两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍
space-evenly 元素间距离平均分配
水平排列元素,并使用 justify-content: flex-end 对齐到主轴终点

image-20190825185352912

1
2
3

使用 space-evenly 平均分配容器元素

image-20190825185730386


article {
border: solid 5px silver;
box-sizing: border-box;
display: flex;
flex-flow: row wrap;
justify-content: space-evenly;
}

垂直排列时对齐到主轴终点

image-20190825185912164


article {
height: 400px;
border: solid 5px silver;
box-sizing: border-box;
display: flex;
flex-flow: column wrap;
justify-content: flex-end;
}

align-items

用于控制容器元素在交叉轴上的排列方式。

选项 说明
stretch 元素被拉伸以适应容器(默认值)
center 元素位于容器的中心
flex-start 元素位于容器的交叉轴开头
flex-end 元素位于容器的交叉轴结尾
拉伸适应交叉轴

如果设置了 width | height | min-height | min-width | max-width | max-height ,将影响stretch 的结果,因为 stretch 优先级你于宽高设置。

image-20190825200555744

1
2
3

对齐到交叉轴的顶部

image-20190825200726661


flex-direction: row;
align-items: flex-start;

对齐到交叉轴底部

image-20190825200749905

flex-direction: row;
align-items: flex-end;

对齐到交叉轴中心

image-20190825200825585

flex-direction: row;
align-items: center;

纵向排列时交叉轴排列

image-20190825201614169

1
2
3
align-content

只适用于多行显示的弹性容器,它的作用是当flex容器在交叉轴上有多余的空间时,对元素的对齐处理。

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

image-20190825203551187

1
2
3

垂直排列时交叉轴的排列

image-20190825204416667

1
2
3
弹性元素

放在容器盒子中的元素即为容器元素。

不能使用float与clear规则
弹性元素均为块元素
绝对定位的弹性元素不参与弹性布局
#align-self
用于控制单个元素在交叉轴上的排列方式,align-items 用于控制容器中所有元素的排列,而 align-self 用于控制一个弹性元素的交叉轴排列。

选项 说明
stretch 将空间平均分配给元素
flex-start 元素紧靠主轴起点
flex-end 元素紧靠主轴终点
center 元素从弹性容器中心开始

1
2
3
flex-grow

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

下例中为三个DIV 弹性元素设置了1、3、6 ,即宽度分成10等份,第三个元素所占宽度为(宽度/(1+3+6)) X 6。

image-20190827162143519

1
2
3

如果弹性元素设置了宽度,将把(弹性盒子-弹性元素宽度和)后按照 flex-grow 进行分配 。

image-20190825220703377

flex-shrink

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

下例在600宽的弹性盒子中放了 1000 宽的弹性元素。并为最后两个元素设置了缩放,最后一个元素的缩放比例为 500 -( ( (1000-600) / (100X1+400x3+500X6) ) x 3 ) X 500 = 220.9,计算公式说明如下:

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

image-20190827172855382

1
2
3
flex-basis

flex-basis 属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。

可以是长度单位,也可以是百分比。flex-basis的优先级高于width、height属性。

优先级

flex-basis 优先级大于 width、height。

image-20190825233755635

1
2
3
flex

flex是flex-grow、flex-shrink 、flex-basis缩写组合。

建议使用 flex 面不要单独使用 flex-grow / flew-shrink / flex-basis 。

下例定义平均分配剩余空间,并不进行尺寸缩小,基础尺寸为200px。

image-20190825234839683

  • {
    padding: 0;
    margin: 0;
    }
    article {
    width: 600px;
    position: relative;
    height: 150px;
    margin-left: 100px;
    margin-top: 100px;
    outline: solid 5px silver;
    display: flex;
    padding: 20px;
    }
    article div {
    outline: solid 5px blueviolet;
    text-align: center;
    font-size: 28px;
    line-height: 5em;
    flex: 1 0 100px;
    }
order

用于控制弹性元素的位置,默认为 order:0 数值越小越在前面,可以负数或整数。

下面是通过J动态改变order属性产生移动效果,因为本章节是讲CSS所以JS功能没有完善,只是体验一下order。

image-20190827221628335

houdunren.com
up
hdcms.com
up
弹性文本

文本节点也在弹性布局操作范围内。

image-20190828131005994

后盾人 houdunren 后盾人
绝对定位

绝对定位的弹性元素不参与弹性布局

image-20190825215220729

1
2
3
微信公众号

下面来开发类似微信公众号布局,包括底部二级菜单的弹性布局。

image-20190828170233608

教程
  • PHP
  • LINUx
直播
自动空间

在弹性布局中对元素使用margin-right:auto 等形式可以自动撑满空间。下例为第一个ul设置 margin-right:auto 表示右侧空间自动撑满,第二个ul靠近父元素右边界。

image-20190930003328902

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值