flex深入浅出—基本属性、优势特色、性能影响

1. flex基本属性需知

1.1 flex是什么

== flex是一个可以简便、完整、响应式地实现各种页面布局的布局方式==
例如:垂直居中、两栏布局就可以使用flex布局简便的实现

<div class="wrap">
  <div class="box"></div>
</div>

.wrap {
  width: 300px;
  height: 300px;
  border: 1px solid red;
  display:flex;
  justify-content:center;
  align-items:center;
}

.box {
  height: 100px;
  width: 100px;
  border: 1px solid blue;
}

在这里插入图片描述

.wrap { display: flex; }
.left { width: 200px; }
.right { flex: 1; }

在这里插入图片描述

1.2 开启flex布局

1.2.1 flex属性

flex元素分为两大类

  • 开启了flex布局的元素称为 flex-container,也就是父元素
  • flex-container里面的直接子元素被称为flex items,即子元素

1.2.2 设置display属性

  • display: flex; flex-container的属性为block-level 块级元素
  • display: inline-flex; flex-container的属性为inline-level 行内块元素
    如果一个元素的父元素开启了flex布局,其子元素的display属性对自身的影响会失效,但是对其内容的影响依旧存在

1.3 父元素flex-container上的属性

flex-flow

flex-direction和flex-wrap的缩写 flex-flow: column wrap;

flex-direction

决定主轴的方向

  • row(左到右)
  • row-reverse(右到左)
  • column(上到下)
  • column-reverse(下到上)

flex-wrap

  • wrap
  • nowrap(父盒子宽度不变、子盒子宽度变化,这也是flex布局成为弹性布局的原因)
  • wrap-reverse 交叉轴起点和终点相反

justify-content

决定子元素在主轴上的对齐方式,

  • flex-start(从主轴起始点开始)
  • flex-end(从主轴终点开始)
  • center(主轴上居中对齐)
  • space-between(与主轴起始点、终点连接,子元素之间的距离相等)
  • space-evently(子元素和子元素、起始点、终点间隔大小相等)
  • space-around(子元素之间距离相同、子元素与起始点终点距离为子元素间距的一半)

align-items

决定子元素在交叉轴上的对齐方式

  • stretch 自动拉伸填充(默认值)
  • flex-start 与起始点对齐
  • flex-end 与终点对齐
  • center 居中对齐
  • baseline 与基准线对齐

align-content

多行子元素在交叉轴上的对齐方式

  • stretch 自动拉伸填充(默认值)
  • flex-start 与起始点对齐
  • flex-end 与终点对齐
  • center 居中对齐
  • space-between(与主轴起始点、终点连接,子元素行之间的距离相等)
  • space-around(子元素行之间距离相同、子元素行与起始点终点距离为子元素行间距的一半)

1.4 子元素 flex items上的属性

flex

flex是flex-grow flex-shrink flex-basis的简写,参数可以为1个、2个、3个,剩下的为默认值。参数值按顺序赋值

  • 默认值为flex: 0 1 auto(不放大但会缩小)
  • none: 0 0 auto(既不放大也不缩小)
  • auto:1 1 auto(放大且缩小)
  • n:n 1 0
  • n(带尺寸):1 1 n

flex-grow

决定子元素 flex items的扩大值

  • 可以设置任何非负数字(正整数、正小数、0),默认值为0
  • 只有当flex container在主轴上有剩余的size时,该属性才会生效
  • flex-grow属性值总和sum小于或等于1,每个flex item扩展的size就为flex container剩余size * flex-grow + 原来size
  • flex-grow属性值总和sum超过1,每个flex item的size就为flex container剩余size * flex-grow / sum + 原本size

flex-shrink

决定子元素flex items的缩小值

  • 当flex items在主轴方向上超过了flex container的size之后,flex-shrink属性才会生效
  • 收缩比例 = flex-shrink * flex item的原始宽度 base size,base size就是flex item放入flex container之前的size
  • 每个flex item收缩的size为flex items超出flex container的size * 收缩比例 / 所有flex items 的收缩比例之和

flex-basis

  • 只有一个参数,限制flex items的长度,flex-shrink、flex-grow的初始值
  • 参数可以为百分比,也可以带单位
  • 决定最终base size优先级,max-width/max-height/min-width/min-height > flex-basis > width/height > 内容本身的size

order

order决定了flex items的排布顺序

  • 可以设置为任意整数(正整数、负整数、0),值越小就排在越前面
  • 默认值为0,当flex items的order一致时,则按照渲染的顺序排列

align-self

flex items可以通过align-self修改父元素flex container设置的align-items

  • 默认值为auto:默认遵从flex container的align-items设置
  • align-items有什么属性,align-self就有哪些属性

2. flex的优缺点

优点:flex布局容易上手,根据flex规则很容易达到某个布局效果。
缺点:浏览器兼容性比较差,只能兼容到ie9及以上。

3. flex对性能的影响

  • 相比传统margin,可伸缩性强(不算性能)
  • 相比float,关联性重绘好很多
  • 相比tranform,子元素和父元素样式控制操作更少

flex对前端脑力的解放是革命性的,它是简洁的,弹性的,又是可控的。在此之前,想要实现“弹性”的布局,多半会用到float。
比如设计一个行内三个元素两个靠边一个居中,传统的方法怎么搞,外面两个浮动,中间那个margin计算位移到中间,而这一切,flex只需要在父类加两句,

display:flex;
justify-content: space-between;

而且不用算高,这如果用传统方法,子元素得挨个添加css,最少三倍css代码,可想而知性能如何(我很肤浅),而且float不可控因素太多,已经被高度坍塌整疯了,时不时要清除浮动,都关联到上下dom了,性能能好到哪里去。这还只是靠边对称居中,要是留空对称居中,margin算到地老天荒。还有水平垂直居中,传统方法就是算margin,兼容性好,但是高度变化咋整,又有人想到用>transformposition:absolute;

top:50%;
left:50%;
tranform:translate:(-50%,-50%);

还得给父类定义相对布局,否则直接以整页为父级,但是flex完美解决了这个问题:

display: flex;
justify-content: center;
align-items: center;

宽高随便改,自适应居中,从代码简洁程度上看,flex性能好情理之中啊。顺便提一下,bootstrap连网格布局都全面拥抱flex了,在此之前均分都是用float做的,clear float随处可见,改为flex后焕然一新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值