10分钟理解CSS3 FlexBox弹性布局


Posted in HTML / CSS onDecember 20, 2018

基本介绍

特点

  • flexbox是一种css display类型,提供一种更简单高效的布局方式;
  • flexbox可以对元素相对于父元素、兄弟元素进行定位、控制尺寸、控制间距;
  • flexbox对响应式有很好的支持;

工作原理

设置父元素的display属性为flex,则子元素都变成flex item,由此可以控制子元素的排列方式、尺寸、间距等;

兼容性

10分钟理解CSS3 FlexBox弹性布局

Flex Container

先来看一个最简单的flex示例,外层div设置display: flex成为一个flex container,内部的3个div则自动变为flex item:

html:

<div class="flex-container">
  <div class="box one"></div>
  <div class="box two"></div>
  <div class="box three"></div>
</div>

css:

.flex-container{ max-width: 960px; margin: 0 auto; display:flex; }
.box{ height: 100px; min-width: 100px; }
.one{ background: pink; }
.two{ background: lightgreen; }
.three{ background: skyblue; }

效果:

10分钟理解CSS3 FlexBox弹性布局

效果与浮动布局类似,但是如果用浮动实现的话需要写更多的代码,而flex一行就搞定了。

1. Justify Content

如果我们想让flex item居中排列呢,我们可以给flex container增加一个css属性:justify-content,它控制flex item在主轴方向(main axis,由flex-drection决定,默认为水平方向)上的对齐方式:

.flex-container{
  ...
  justify-content: center;
}

效果如图:

10分钟理解CSS3 FlexBox弹性布局

除此之外justify-content还可以设置为flex-start, flex-end, space-around, space-between, space-even等值,具体效果请自行实验。

2. Align Items

实现了flex方向的居中后,垂直于主轴方向(cross axis)的居中可以用align-items实现。

css:

.flex-container{
  max-width: 960px;
  margin: 0 auto;
  display:flex;
  justify-content: center;
  height: 200px;
  background-color: white;
  align-items: center;
}

效果:

10分钟理解CSS3 FlexBox弹性布局

使用flex解决了以往css垂直居中实现复杂的问题!相应的,align-items还有flex-start, flex-end等其他值。

3. Flex Direction

flex-direction决定了主轴方向即flex item排列方向,除了默认的row方向之外,还可以纵向、反向(row-reverse/column-reverse)排列flex item:

css:

.flex-container{
  ...
  
  flex-direction: column;
  align-items: center;
}

效果:

10分钟理解CSS3 FlexBox弹性布局

4. Flex Wrap

如果我们不想在窗口变窄的情况下压缩flex item,而是让超出边界的flex item换行显示那我们可以设置flex container的flex-wrap

.flex-container{
  max-width: 960px;
  margin: 0 auto;
  display:flex;
  flex-wrap: wrap;
}

.box{
  height: 100px;
  min-width: 300px;
  flex-grow: 1;
}

当我们压缩窗口的时候,效果如下:

10分钟理解CSS3 FlexBox弹性布局

flex wrap还有一个值:wrap-reverse,设置该值后,被wrap的元素会排到其他元素上面:

10分钟理解CSS3 FlexBox弹性布局

由此可见,flex wrap一定程度上可以取代media query了。

5. Flex Row

最后,flex-directionflex-wrap可以合并为一个属性flex-flow,比如:flex-flow: row-reverse wrap

Flex Item

1. Flex Grow

在上面所有的例子中,三个flex item只占据了flex container小部分空间,如果想让flex item占满flex container我们需要给flex item设置flex-grow属性。顾名思义,grow意味着增长,用于控制flex item的尺寸的伸展。

将css修改为:

.box { 
    height: 100px; 
    min-width: 100px; 
    flex-grow:1; 
}

效果:

10分钟理解CSS3 FlexBox弹性布局

可以看到三个子元素平分了父元素的空间,因为此时它们的flex-grow都是1。如果只有一个子元素设置了flex-grow呢?

css:

.box{ height: 100px; min-width: 100px; }
.one{ background: pink; flex-grow: 1; }

效果:

10分钟理解CSS3 FlexBox弹性布局

此时two和three的大小不变,而one占据了父元素剩余空间。

如果将one的flex-grow改为2,而two和three改为1,我们看看会发生什么:

css:

.box{ height: 100px; min-width: 100px; flex-grow:1; }
.one{ background: pink; flex-grow: 2; }

效果:

10分钟理解CSS3 FlexBox弹性布局

可以看到one的宽度变成了two和three的两倍,因此flex item的尺寸和flex-grow的值成正比。

2. Flex Shrink

flex-grow相对的是flex-shrinkflex-shrink用于控制子元素尺寸超过flex container后,对子元素的压缩。请看示例:

修改box的宽度为flex container的1/3,one、two、three的flex-shrink分别为1,2,3:

.box{ height: 100px; width: 320px; }
.one{ background: pink; flex-shrink: 1; }
.two{ background: lightgreen; flex-shrink: 2; }
.three{ background: skyblue; flex-shrink: 3; }

当窗口正常尺寸时,效果如下:

10分钟理解CSS3 FlexBox弹性布局

当我们压缩窗口使其变得更窄后,效果如下:

10分钟理解CSS3 FlexBox弹性布局

当flex container宽度变为540px后,子元素都被不同程度的压缩了。压缩后的one、two、three的宽度分别为250px、180px、110px,所以相比于初始宽度320px被压缩掉的宽度分别为70px、140px、210px,70 : 140 : 210 = 1 : 2 : 3,与flex shrink的值成反比。实际上压缩率和flex item的初始尺寸也有关系,只不过当初始尺寸一样时它带来的影响被忽略了。

假设flex shrink为fs,flex item的初始尺寸为is,flex item被压缩的尺寸为ss,则正确的表达式为:

fs ∝ is/ss

3. Flex Basis

flex-basis用于设置flex item的初始宽/高。为什么有width和height还需要重新加一个flex-basis呢?flex-basis和width/height有如下的区别:

  1. flex-basis只能用于flex-item,而width/height可以应用于其他类型的元素;
  2. flex-basis和flex-direction有关,当flex-direction为row的时,flex-basis设置的是宽度,当flex-direction为column时,flex-basis设置的是高度;
  3. 当flex item被绝对定位后(absolute position),flex-basis不起作用,而width/height可以;
  4. flex-basis可以用于flex的简写形式,如:flex: 1 0 200px;

我们来看一下flex-basis的作用,将css修改如下:

.box{
  height: 100px;
  flex-grow: 1;
}
.one{
  background: pink;
  flex-basis: 100px;
}
.two{
  background: lightgreen;
  flex-basis: 200px;
}
.three{
  background: skyblue;
  flex-basis: 300px;
}

3个flex item都在原来的初始宽度基础上增加了相同的宽度:

10分钟理解CSS3 FlexBox弹性布局

当然,这个例子如果换成使用width也是一样的效果,但是虽然效果一样但意义不一样,所以使用flex布局时还是应该尽量遵守规范,选合适的人去干正确的事。

4. Order

通过order属性我们可以改变flex item的排列顺序,例如:

html:

<section id="blocks">
  <div class="one">1</div>
  <div class="two">2</div>
  <div class="three">3</div>
  <div class="four">4</div>
</section>

css:

#blocks{
  display: flex;
  margin: 10px;
  justify-content: space-between;
}

#blocks div{
  flex: 0 0 100px;
  padding: 40px 0;
  text-align: center;
  background: #ccc;
}

默认排列顺序是按照flex item在html中的出现顺序:

10分钟理解CSS3 FlexBox弹性布局

当我们修改flex item的order值后,flex item会按照order值升序排列:

css:

.one{ order: 4; }
.two{ order: 3; }
.three{ order: 2; }
.four{ order: 1; }

效果:

10分钟理解CSS3 FlexBox弹性布局

结语

flex就先简单介绍到这里,flex很强大也很简单,希望大家用的开心。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
css3实现一个div设置多张背景图片及background-image属性实例演示
Aug 10 HTML / CSS
使用CSS媒体查询(Media Queries)和JavaScript判断浏览器设备类型的方法
Apr 03 HTML / CSS
使用CSS3的font-face字体嵌入样式的方法讲解
May 13 HTML / CSS
css3实现元素环绕中心点布局的方法示例
Jan 15 HTML / CSS
html5使用canvas实现跟随光标跳动的火焰效果
Jan 07 HTML / CSS
HTML5新特性之用SVG绘制微信logo
Feb 03 HTML / CSS
有关HTML5中背景音乐的自动播放功能
Oct 16 HTML / CSS
基于html5 canvas做批改作业的小插件
May 20 HTML / CSS
CSS 新特性 contain控制页面的重绘与重排问题
Apr 30 HTML / CSS
详解CSS不受控制的position fixed
May 25 HTML / CSS
HTML+CSS 实现顶部导航栏菜单制作
Jun 03 HTML / CSS
HTML5页面音频自动播放的实现方式
Jun 21 HTML / CSS
详解如何在css3打包后自动追加前缀插件:autoprefixer
Dec 18 #HTML / CSS
CSS3田字格列表的样式编写方法
Nov 22 #HTML / CSS
纯css3实现思维导图样式示例
Nov 01 #HTML / CSS
CSS3 Flex 弹性布局实例代码详解
Nov 01 #HTML / CSS
CSS3 创建网页动画实现弹跳球动效果
Oct 30 #HTML / CSS
css3实现椭圆轨迹旋转的示例代码
Oct 29 #HTML / CSS
纯css3实现宠物小鸡实例代码
Oct 08 #HTML / CSS
You might like
用php实现百度网盘图片直链的代码分享
2012/11/01 PHP
PHP strtotime函数用法、实现原理和源码分析
2015/02/04 PHP
php给图片添加文字水印方法汇总
2015/08/27 PHP
PHP MVC框架skymvc支持多文件上传
2016/05/26 PHP
TP5框架实现的数据库备份功能示例
2020/04/05 PHP
javascript 处理事件绑定的一些兼容写法
2009/12/24 Javascript
jQuery 常见开发使用技巧总结
2009/12/26 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
2014/06/24 Javascript
jQuery中detach()方法用法实例
2014/12/25 Javascript
JavaScript数据结构与算法之栈与队列
2016/01/29 Javascript
jQuery实现鼠标悬停3d菜单展开动画效果
2017/01/19 Javascript
详解mpvue scroll-view自动回弹bug解决方案
2018/10/01 Javascript
JS 实现获取验证码 倒计时功能
2018/10/29 Javascript
vue使用过滤器格式化日期
2021/01/20 Vue.js
Python实现发送email的几种常用方法
2014/08/18 Python
Python实例一个类背后发生了什么
2016/02/09 Python
Python 中urls.py:URL dispatcher(路由配置文件)详解
2017/03/24 Python
正确理解python中的关键字“with”与上下文管理器
2017/04/21 Python
Python实现一个简单的验证码程序
2017/11/03 Python
python下10个简单实例代码
2017/11/15 Python
Python+树莓派+YOLO打造一款人工智能照相机
2018/01/02 Python
对python中的*args与**kwgs的含义与作用详解
2019/08/28 Python
Flask项目中实现短信验证码和邮箱验证码功能
2019/12/05 Python
Python新手学习装饰器
2020/06/04 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
2021/01/21 Python
Ubuntu20.04环境安装tensorflow2的方法步骤
2021/01/29 Python
采购部岗位职责
2013/11/24 职场文书
总经理工作职责范文
2014/03/14 职场文书
“向国旗敬礼”活动策划方案(4篇)
2014/09/27 职场文书
2014年帮扶工作总结
2014/11/26 职场文书
人事任命通知书
2015/04/21 职场文书
有关三国演义的读书笔记
2015/06/25 职场文书
创业计划书之熟食店
2019/10/16 职场文书
vue基于Teleport实现Modal组件
2021/05/31 Vue.js
教你利用Nginx 服务搭建子域环境提升二维地图加载性能的步骤
2021/09/25 Servers
UNION CREATIVE《Re:从零开始的异世界生活》雷姆手办
2022/03/20 日漫