传统的页面布局

  在flex出现之前,双列布局,三列布局,动态盒居中,绝对居中布局等常见的布局均是采用dispaly+float+定位来布局的,一般包括以下几种布局策略:

  1. normal flow(文档流:块级元素从上到下,行内元素从左到右)
  2. float + clear
  3. position relative + absolute
  4. display inline-block
  5. 负margin(扩大宽度,产生位移,如一行里的多个column)

flex来了

  flex-即flexible,弹性的,灵活的,又叫弹性盒布局(flexible box layout),这种布局方式主要有以下特点:

  1. 块级布局侧重垂直方向,行内布局侧重水平方向,而flex是与方向无关的(来源于后续提到的一个重要属性flex-direction)
  2. flex布局可以实现空间自动分配、自动对齐(弹性灵活的体现,与后续提到的flex-grow,flex-shrink,flex-basis属性有很大关系)
  3. flex适用于简单的线性布局(左右或上下布局),更复杂的布局需要用grid布局(如瀑布流布局)

基本概念

  关于flex布局中,有以下几个基本常识值得注意:

  1. 如图所示flex布局中有两条轴线贯穿了外层容器,分别为主轴和侧轴(这里主轴不一定是水平方向的轴线,具体有flex-direction而定,即主轴和侧轴的方向是不一定的,也印证了flex布局是方向无关的)
  2. 主轴的尺寸为main size,侧轴的尺寸为cross size
  3. 主轴的起点和终点分别为main start和main end,对应的侧轴的起点和终点分别为cross start和cross end
  4. 应用了display:flex属性的元素叫做 flex container,即flex容器,它里面的子元素叫做flex item
  5. flex 容器的宽度总是自动扩张到最大值(注意是宽度,不管主轴是哪个方向,它的宽度总是会扩张到最大值,即使这个容器元素是行内元素如span,而子元素的宽度受多个属性影响,如flex-direction,align-items,flex-grow等,有时候看起来容器元素的宽度并不等于item元素宽度的和,如下图2所示)
  6. flex 容器内的子元素即flex-item在不指定height,width的情况下总是自动收缩的(height本来就自动收缩,但当父元素display:flex后,这些子元素的宽度也都自动收缩,而没有了原本块级元素在宽度上自动扩张的特性),同样的,这里不区分主轴的方向,height,width总是自动收缩
  7. display:flex以后 float,clear,vertical-align等属性均失效

flex container的六大属性

flex-direction—方向

  flex-direction 指定了子元素排列的方式,可以为row(按行展示)/column(按列展示)/inherit/row-reverse/column-reverse

例1. 当flex-direction为row时,显示效果如下:

图2

其中html和css代码如下:

<div class="container">
<div class="item">item1</div>
<div class="item">item2</div>
</div> .container{
display:flex;
border:1px solid red;
height:300px;
}
.item{
border:1px solid black;
}

例2.当为.container添加flex-direction:cloumn属性后,排列效果如下:

图3

  图2,图3中的flex-item都没有指定width和height值,但我们通过border可以看到看到,图2中的垂直方向的空间自动填满了container的宽度,即container此时在主轴方向的长度,图3中的水平方向的空间自动填满了container的高度,同样的,这也是container此时在侧轴方向的长度,这个现在和后续提到的align-items有关,不过我们暂时可以做出如下总结: 默认情况下,flex-item元素在其侧轴方向的长度总是自动扩张的(当然,后续会知道,只是默认情况,稍微改变align-items属性值,表现就会不一样~)

flex-wrap

  用于控制是否可以换行(按row排列时)/列(按column排列时),当flex-wrap是nowrap时,所有items总是自动缩小而不会换行(列)

flex-flow

  flex-direction和flex-wrap的缩写,如flex:row wrap实际上同时设置了 flex-direction:row和flex-wrap:wrap;

justify-content

  主轴方向的对齐方式,可取:flex-start/flex-end/center/space-around/space-between,默认为flex-start

align-items

  侧轴方向的对齐方式,可取:flex-start/flex-end/center/stretch/baseline,默认为stretch(填满父空间,前提是不指定height值,当指定了height值时,会以该值为主),也就是之前提到的默认情况下,flex-item元素在其侧轴方向的长度总是自动扩张的

align-itmes:stretch和height同时存在时

  为了测试指定height时,align-items:stretch还是否会对元素项产生效果,进行了以下测试:

 <div class="outer">
<div>item1</div>
<div>item2</div>
<div>item3</div>
<div>item4</div>
</div> .outer{
align-items:stretch;
}
.outer div:nth-child(1){
height:200px;
}

  如图所示,由于align-items是stretch(也是默认值),所以除item1元素外的所有元素在侧轴方向都自动拉伸到最大了,而item1之所以没有自动拉伸,是因为对其显示设置了高度,此时可以理解为height属性的优先级要更高。

align-content

  align-content属性和justify-content,align-items是类似的,都是控制item元素之间的摆放方式,只是该属性只有在主轴方向上有多个轴线时才有效,如flex-direction是row时,如果item有换行则align-cnotent属性值有效,当flex-direction是clolumn时,如果item有换列,则align-content有效,其中属性值可以取flex-start/flex-end/center/space-around/space-between/stretch

注意:justify-content是用于控制属于不同的主轴线(可以想象为平行与主轴线)的元素在侧轴方向的的排列方式,其属性值包含space-around/space-between,没有stretch,而align-items是用于控制单个元素在侧轴方向的摆放的,其属性值包含stretch,不含space-around/space-between,align-content则用于控制当同一个侧轴有多个元素时,这些元素之间的摆放方式,它们即可取space-around/space-between,又可取stretch(当每一个侧轴都只穿过一个元素时(即没有多个主轴线,没换行/列),该属性失效)

align-content和align-items属性同时指定时

  以flex-direction:row时为例,当item有多行时,align-content和align-items是同时有效的,align-content控制行于行之间的排列关系,align-items控制元素在一行中的位置,可以看下以下例子:

html和css部分如下:


<div class="outer">
<div>item1</div>
<div>item2</div>
<div>item3</div>
<div>item4</div>
</div> .outer{
display:flex;
border:1px solid red;
height:300px;
align-items:center;
flex-wrap:wrap;
align-content:flex-end;
}
.outer div{
width:200px;
border:1px solid black;
}
.outer div:nth-child(1){
height:200px;
}

效果如下所示:

图4

  可以看到,现在item1和item2是处于一行的,item3和item4是处于一行的,由于align-content是flex-end,所以所有行依次排列在侧轴的终点处,同时由于align-items为center,所以item2处于它所在行的垂直方向的中点处(原来并非相对于它的父元素垂直居中,而是相对于它所在的行垂直居中)

  接下来,再看一下把align-items:center去掉的效果

图5

  如图5所示,和刚才不同的是,item2在没有指定高度的情况下自动拉伸为何item1的高度(指定了200px)一样了,其实还是因为align-items的效果,它虽然没有显示指定,但它的默认值是stretch,所以在它所处的行中在垂直方向自动拉伸了。

  所以,当align-content有效时,不要以为align-items就无效了,只是它们的作用不同而已,一个控制不同行元素相对于父元素(flex-container)的排列方式,一个用于控制元素在所处行中的垂直方向的位置(这里指的flex-direction为row,flex-direction为column时请自行推算~)

flex item的六大属性

flex-grow:多余空间自动分配比例

  用于控制当主轴方向空间过多时,元素在主轴方向的长度自动增加;如果多个元素同时指定了flex-grow,则多余的空间会按照各自flex-grow值的比例自动分配

默认值:0

flex-shrink:超出空间自动收缩比例

  当主轴方向空间不够时,使元素在主轴方向的长度自动收缩(即使为元素项设置了显示宽度width值,依然会根据需要自动收缩,不同于之前container中的align-items属性值stretch会低于height的优先级),以使得总长度能够适应container的长度(当应用了flex-wrap:wrap时,一般是不会自动收缩的,因为这时候自动换行/列了,不会空间不够)

默认值:1

flex-shrink和flex-wrap配合使用

  flex-shrink的概念已经明了,看上去功能比较单一,不过不同的属性值之间的搭配还是会带来很多样化得效果的,尤其是这里就来看一下flex-shrink和flex-wrap的配合使用。

flex-shrink:0和flex-wrap:nowrap

  下面看一下flex-shrink为0并且container没有设置flex-wrap属性时的效果:

  html和css如下:

 <div class="outer">
<div>item1</div>
<div>item2</div>
<div>item3</div>
<div>item4</div>
</div> .outer{
display:flex;
border:1px solid red;
height:300px;
align-content:flex-end;
}
.outer div{
width:150px; border:1px solid black;
flex-shrink:0;
}
.outer div:nth-child(1){
height:200px;
}
.outer div:nth-child(2){
}
图6

  如上图所示,当设置item的flex-shrink为0时,说明子元素项不会自动收缩,造成的结果就是所有元素项按自身原本的尺寸依次排列,可能会有主轴上总长度超出container在该放向的长度的可能。

flex-shrink:1和flex-wrap:nowrap

  接下来,将css中设置的flex-shrink:0去掉(等同于设置了flex-shrink:1,因为这是默认值),此时效果如下:

图7

  如上图所示,此时,各子元素项的宽度(在主轴方向的长度)明显收缩了(小于为其设置的width:150px),这就是因为默认的flex-shrink:1使得超出的部分均分在了所有子元素项的宽度上。

flex-shrink:1和flex-wrap:wrap

  最后,再为container添加flex-wrap:wrap看下是否又会有什么不同呢?

图8

  如图8所示,此时子元素项懂得在合适的位置自动换行了,因此也就不存在宽度超出父元素宽度范围的情况了,所以即使设置了flex-shrink也不会出现长度收缩了~

flex-basis 原始大小

  我们都知道为container设置了display:flex后,子元素项的宽度正是恰好包裹自身内容的宽度,相当于是自动的,设置flex-basis后则类似于设置了width值,可以显示指定宽度,取值可以为绝对单位或是百分比(可用于栅格效果)

默认值:auto

flex 缩写

  flex属性即为flex-grow,flex-shrink,flex-basis三个属性的缩写

order 指定次序

  order用于指定子元素项在兄弟元素中排列的顺序,应用该属性可以简单的实现双飞翼布局

align-self 自身的对齐方式(特殊化自身元素)

  align-self指定元素自身在侧轴上的对齐方式,可以用来覆盖align-items属性的值对自身设置的效果

图9

  如图9所示,当align-items为stretch,item1的align-slef为center时,除item1外的所有元素在侧轴方向的对齐方式都是自动延伸的,而item1元素因为应用了align-slef:center,明显是垂直居中的。

  总结 :容器 ,项目都是6属性

flex入门----基础知识的更多相关文章

  1. React Native 入门基础知识总结

    中秋在家闲得无事,想着做点啥,后来想想,为啥不学学 react native.在学习 React Native 时, 需要对前端(HTML,CSS,JavaScript)知识有所了解.对于JS,可以看 ...

  2. USB入门基础知识(转)

    源:USB入门基础知识 相关名词: 主机(Host) 设备(Device) 接口(Interface) 管道(Pipe) 管道是主机与设备端点数据传输的连接通道,代表了主机的数据缓冲区与设备端点之间交 ...

  3. Linux入门基础知识

    注:内容系兄弟连Linux教程(百度传课:史上最牛的Linux视频教程)的学习笔记. Linux入门基础知识 1. Unix和Linux发展历史 二者就像父子关系,当然Unix是老爹.1965年,MI ...

  4. Greenplum入门——基础知识、安装、常用函数

    Greenplum入门——基础知识.安装.常用函数 2017年10月08日 22:03:09 在咖啡里溺水的鱼 阅读数:8709    版权声明:本文为博主原创,允许非商业性质转载但请注明原作者和出处 ...

  5. 1)Linux程序设计入门--基础知识

    )Linux程序设计入门--基础知识 Linux下C语言编程基础知识 前言: 这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将 会学到以下内容: 源程序编译 Makef ...

  6. React入门---基础知识-大纲-1

    -----------------在慕课网学习react入门笔记-------------- ---------博主边学边记录,手把手进行学习及记录---------- --------------- ...

  7. PHP基础入门(二)---入门基础知识必备

    前言 在上一章中,我们初步了解了PHP的网页基础和PHP的入门基础,今天继续给大家分享更多有关PHP的知识. 理论知识看起来可能比较枯燥一些,但是我们的实践(敲代码)毕竟离不开它. 只有理论与实践相结 ...

  8. CodeMix入门基础知识

    CodeMix在线订购年终抄底促销!火爆开抢>> CodeMix入门 CodeMix是一个Eclipse插件,可以直接从Eclipse访问VS Code和为Code OSS构建的附加扩展的 ...

  9. Vue 2.0入门基础知识之全局API

    3.全局API 3-1. Vue.directive 自定义指令 Vue.directive用于自定义全局的指令 实例如下: <body> <div id="app&quo ...

随机推荐

  1. pymongo.errors.OperationFailure: Authentication failed.

    mongoDB有不同的认证机制,3.0版本以后采用的是'MONGODB-CR', 之前的版本采用的是'MONGODB-CR'. 所以,以我的版本情况,显然应该用'SCRAM-SHA-1' from p ...

  2. Django中ORM系统多表数据操作

    一,多表操作之增删改查 1.在seting.py文件中配置数据库连接信息 2.创建数据库关联关系models.py from django.db import models # Create your ...

  3. vs2015 VS-Visual Studio-IIS Express 支持局域网访问

    使用Visual Studio开发Web网页的时候有这样的情况:想要在调试模式下让局域网的其他设备进行访问,以便进行测试.虽然可以部署到服务器中,但是却无法进行调试,就算是注入进程进行调试也是无法达到 ...

  4. 学习笔记49—matlab FDR校正

    matlab自带函数mafdr,当ttest数较多时,可直接用[FDR, Q]=mafdr(P):但是Storey procedure在p值少于1000个时会崩溃,此时应改用BH FDR方法:mafd ...

  5. CSS opacity的兼容写法

    opacity{ opacity:0.5; filter:alpha(opacity=50);  //filter 过滤器   兼容IE678 }

  6. lua中产生 1 - n 之间不重复随机数

    local function GetRandomNumList(len) local rsList = {} ,len do table.insert(rsList,i) end local num, ...

  7. RabbitMQ消息发布时的权衡

    在进行本篇文章的学习之前,你需要先阅读 https://www.cnblogs.com/duanjt/p/10057330.html.以便对Java访问RabbitMQ的基础用法有所了解. 一.失败通 ...

  8. mysqlsh : mysql shell tutorial

    MySQL Shell 是一个高级的命令行客户端以及代码编辑器for Mysql. 除了SQL,MySQL Shell也提供脚本能力 for JS and Python. When MySQL she ...

  9. 20171205xlVBA往返航班组合

    'ClassPlan Public Org As String Public Des As String Public FlyNo As String Public StartDate As Vari ...

  10. 4.1.4 Nim

    Problem description: 有n堆石子,每堆各有ai颗石子.A和B轮流从非空的石子堆中取走至少一颗石子.A先取,取光所有石子的一方获胜.当双方都采用最佳策略时,谁会获胜? 1<=n ...