CSS3之flex布局演示

文章目录

0. 前言
1. 基础概念
2. 容器属性(父属性:Properties for the Parent)
 2.1. flex-direction属性
 2.2. flex-wrap属性
 2.3. flex-flow属性
 2.4. justify-content属性
 2.5. align-items属性
 2.6. align-content属性
3. 项目属性(子属性:Properties for the Children)
 3.1. order属性
 3.2. flex-grow属性
 3.3. flex-shrink属性
 3.4. flex-basis属性
 3.5. flex属性
 3.6. align-self属性
参考文献:


【关键词】:flex 布局 demo 牛刀小试

0、前言

笔者布局时常用float,inline-block,对于flex,仅限于了解,却一直没有应用,遂决定抽出些时间学习一下,初次写难免有漏洞,欢迎指正,后期不定期持续持续更新补充。
  咱们首先从定义入手,flex到底是个什么东西呢?
  flex(flexible box):弹性布局盒子模型,是W3C中新增的属性,在写之前demo练习中,明显感觉到flex,非常的便捷,短短几行代码便可以达到布局的效果,功能也非常的强大,既然吹得这么厉害,俗话说无码无真相,下面我们一起看一下神奇的flex吧!
1、基础概念
  首先要介绍下flex容器和flex项目,当某个元素采用flex布局时,元素自动转化为Flex容器(flex-container),简称容器。元素内的子元素自动转化为容器内的项目,即Flex项目(flex items),简称项目。
  容器内默认有两轴四点,两轴分别为纵向的主轴(main axis)和垂直主轴的交叉轴(cross axis),两轴分别有各自的起点及中点,主轴起点为main start,主轴的终点为main end,交叉轴的起点称为cross start,终点称为cross end, 项目按照主轴或者交叉轴进行排布,项目沿着主轴方向的尺寸称为main size,项目沿着交叉轴方向的尺寸为cross size,项目默认是按照主轴方向排布的,并且默认不折行,(以主轴排布)当项目宽度总和大于容器宽度时,各个项目宽度压缩,即使设置固定宽度。

图一 主轴-交叉轴示意图(转)

图 二 主轴-交叉轴示意图(转)

  flex布局中项目既可以是行内元素(span)也可以是块级元素(div),项目为行内元素时(见图二),可以对项目进行宽高的设置。此外,需注意使用flex容器内元素,即flex item的float,clear(清浮动)、vertical-align属性将失效,position属性可以正常使用。

2、容器属性(父属性:Properties for the Parent)

容器属性包含有六个属性:

1. flex-direction
2. flex-wrap
3. flex-flow
4. justify-content
5. align-items
6. align-content
2.1、flex-direction属性

flex-direction属性为项目排列方向,其中包含4个值。

1.row(默认项目排列方向)  //容器主轴为水平方向,其中项目自左向右按顺序依次排布;(left-to-right)
2. row-reverse      //容器主轴仍为水平方向,其中项目自右向左依次排布;(right-to-left)
3.column//容器主轴为垂直方向,项目自上而下排布;(*top-to-bottom*)
4.column-reverse//容器主轴为垂直方向,项目自下而上排布;(*bottom-to-top*)
图 二 row属性值演示
图 三 row-reverse属性值演示
图 四 column属性值演示
图 五 column-reverse属性值演示

四幅图分别对应flex-direction属性的4个值,(demo信息:\color{#ff6600}{容器尺寸为宽500px,高300px},每个项目为直径100px的圆)图二,图三容器主轴为水平方向演示,当项目总宽度大于容器宽度时项目宽度被压缩,容器主轴为垂直方向时,同理。项目总宽度/高度小于容器时,按照设置宽高沿着主轴排布。
  图四,图五不难看出并不符合,我们所说的项目总高度大于容器高度,项目被均匀压缩情况即图二,图三。这是因为我们设置了line-height: 100px,在flex布局中行高的影响并没有被消除,导致项目并没有被压缩在容器中,设置行高后,项目累计高度大于容器部分的内容,在容器之外显示,由于设置了over-flow:hidden;所以在图四图五中,没有显示,仔细看不难发现图四中的三弟圆显示不完成,图五中的三弟同理。所以在flex布局中要小心使用行号;
  flex布局中行高和高度同时使用结果分析:
  1)只设置行高:项目总行高小于容器高度时,项目按照垂直轴方向在容器内排列,当项目总行高大于容器高度时,大于容器高度项目溢出容器。
  2)只设置高度:项目总高度小于容器高度时,项目按照垂直轴方向在容器内排列,当项目总高度大于容器高度时候,项目在容器中均匀排列,项目总高度最大值为容器高度,不随高度增加无限增加,项目不会溢出容器。
  3)行高高度同时设置:项目行高及高度总值均小于容器高度时,按高度排列,行高不影响span高度,只改变内容位置。项目总高度及总行高均大于容器高度时,项目溢出容器,见图四图五;

2.2、flex-wrap属性

flex-wrap属性为当总项目宽度超过容器宽度时候是否换行及换行方式,其中包含3个值。(以主轴水平为例)

1.nowrap                //默认属性不换行,各个项目在容器内被压缩;
2.wrap                    //项目总宽度超过容器时进行换行;
3.wrap-reverse  //超出部分自下而上,沿主轴方向排列;
图 六 flex-wrap属性值演示
2.3、flex-flow属性

flex-flow属性值为flex-direction || flex-wrap两种属性的缩写,默认值为row || nowrap。

1.box {
2     flex-flow: row wrap-reverse;
3  }
2.4、justify-content属性

flex-flow属性值为沿主轴对齐方式,其中包含5种属性值;(主轴为水平轴为例)

1.  flex-start//项目以主轴起点对齐;(左对齐)
2.  flex-end         //项目以主轴终点对齐;(右对齐)
3.  center//项目在主轴居中对齐;
4.  space-between//项目以主轴起点终点为起始点,中间等分对齐;5.  space-around//项目等分对齐,首尾项目距离边框之和为中间项目间距一半;
图 七 justify-content属性值演示

justify-content属性值space-around中关于结论“首个及末尾项目距离边框距离为中间项目间距一半”验证。
  下面我们有请圆圈家族中的四兄弟,验证过程演示如下:首先选取前三个项目,图八中的第一幅图,其中容器宽度为500px,圆形直径为100px,可以推断出,项目间距约等于66.66px,根据我们的结论首末项目距离边框距离应为33.33px,在下面的第二幅图中加入了四弟,并且设置了它的定位属性,将left值设置为33.33px,变有了我们第三幅图的结果,四弟将三弟覆盖。


图 八 space-around项目与border距离验证
2.5、align-items属性

flex-flow属性值为沿交叉轴对齐方式,其中包含5种属性值;(交叉轴为垂直方向为例)

1. flex-start   //项目以交叉轴起点对齐;(上对齐)
2. flex-end    //项目以交叉轴终点对齐;(下对齐)
3. center     //项目在交叉中居中对齐;
4. baseline    //项目沿着其中第一行文字基线对齐; 
5. stretch    //项目未设置交叉轴方向具体尺寸时(本例子为高度),项目该尺寸占满整个容器;
(stretch有换行时,例如项目为两行,项目高度都为容器高度1/2)
图 九 align-items属性值演示
2.6、align-content属性

align-content属性值为多行项目时沿交叉轴对齐方式,项目为单行时,属性值无效应使用align-items,其中包含6种属性值;(交叉轴为垂直方向为例)

1. flex-start      //多行项目以交叉轴起点对齐;(上对齐)2. flex-end       //多行项目以交叉轴终点对齐;(下对齐)
3. center        //项目在交叉轴中间居中对齐;
4. space-between    //首末行项目分别位于交叉轴起点终点,中间行等分,进行对齐;
5. space-around     //项目等分对齐,首末行距离边框为中间项目间距的一半;  
6. stretch        //未设置高度时,项目占满整个容器,有多行时,等分容器高度;
图 十 align-content部分属性值演示(1-3)

图 十一 align-content部分属性值演示(4-6)

3、项目属性(子属性:Properties for the Children)

项目属性包含有六个属性:

1. order
2. flex-grow
3. flex-shrink
4. flex-basis
5. flex
6. align-self
3.1、order属性

order属性可以用来定义项目的顺序,order的值越小,项目在主排列中的顺序越靠前,所有项目默认值为0;

图 十二 order属性值演示
3.2、flex-grow属性

flex-grow属性为项目的放大比例,规定了项目在各自占用多少剩余可用空间大小,属性值为数字没有单位,\color{#ff6600}{负数(Negative numbers)是无效的,默认为0},此时项目size为自身尺寸,不会方法。
  如果所有项目flex-grow设置为1,容器中剩余空间将被等分给项目,若其中有一个项目的value值为2,该项目占据的空间,则为其它项目的2倍。
  If all items have flex-grow set to 1, the remaining space in the container will be distributed equally to all children. If one of the children has a value of 2, the remaining space would take up twice as much space as the others (or it will try to, at least)。(转)

图 十三 flex-grow属性值演示(各项目flex-grow: 1;)

图 十四 flex-grow属性值演示(大哥flex-grow: 2;其余为1)

  容器宽度为500px,圆设置直径为100px,不难算出剩余宽度为100px,图十三中圆形各自宽度为125px,图十四中大哥宽度为140px,其余宽度为120px,从而不难看出,flex-grow属性值是将容器剩余空间宽度按flex-grow值得比例分配。

3.3、flex-shrink属性

flex-shrink属性为项目的缩小比例,只有在项目宽度之和大于容器的时候才会依据flex-shrink值发生收缩,\color{#ff6600}{默认值(default value)为1,负数(negative numbers)无效},默认情况下所有项目都可以被缩放,但是如果设置为0,该项目将维持最初设置尺寸,不被压缩。

图 十五 flex-shrink属性值演示(default:1)

  图十五中的七兄弟被flex-shrink均为默认值缩放后的效果,不难算出每个宽度为500/7=71.43px,项目宽度按照容器宽度压缩值相等。虽然我们知道当flex-shrink值不同时也会被压缩,那么是根据什么进行的压缩呢?压缩值又是多少呢?
图 十六 flex-shrink属性值演示(首个项目flex-shrink:2)

  从图十七中我们可以看出兄弟中大哥宽度为500px,其余六兄弟宽度为75px,flex-shrink属性和flex-grow属性定义正好相反,是将项目size之和超出容器部分尺寸根据flex-shrink值按比例进行压缩,以沿宽度方向压缩为例进行分析:
  圆设置宽度为100px,项目个数为7个,总宽度应为700px,实际容器宽度为500px,超出容器部分为200px,压缩因子(flex-shrink值)分别为2:1:1:1:1:1:1;

**压缩值分别为:**
大哥    200/(2+1+1+1+1+1+1)*2=50px;          
二弟    200/(2+1+1+1+1+1+1)*1=25px;      
三弟    200/(2+1+1+1+1+1+1)*1=25px;  
四弟    200/(2+1+1+1+1+1+1)*1=25px;  
五弟    200/(2+1+1+1+1+1+1)*1=25px;  
六弟    200/(2+1+1+1+1+1+1)*1=25px;  
七弟    200/(2+1+1+1+1+1+1)*1=25px;

项目实际宽度分别为50px,75px,75px,75px,75px,75px,75px。注意:宽度计算时边框包含在内。


图 十七 压缩后项目宽度值
3.4、flex-basis属性

flex-basis属性定义了在项目按照缩放因子(shrink factor)或者放大因子(grow factor)分配剩余空间之前,项目的最初尺寸,可以和宽度和高度属性取相同的值(例如200px),flex-basis设置的长度值优先级高于width,不会被width,height覆盖。它的默认值为auto,即项目原来的size。

image
image
3.5、flex属性

flex属性是flex-grow,flex-shrink,flex-basis属性的简写,默认值0 1 auto, 第二个和第三个参数是可选的(flex-shrink,flex-basis)。这个属性还可以设置为auto(1 1 auto)和none(0 0 auto),建议优先W3C推荐使用这种简短属性,而不是单独的三个分离的属性,浏览器会自己解析剩余部分。








图 十七 flex属性值取值规律

有以下三种情况:
  1)当flex为单一非负数字值(无法取到负值,被禁止),对flex-grow进行设置flex-shrink值为1,flex-basis值为0%;
  2)当flex为两位非负数字时,分别对flex-grow和flex-shrink进行设置,flex-basis值仍为0%;
   3)当flex单一非负长度或者百分比,对flex-basis值进行设置;
3.6、align-self属性
  align-self属性值定义某个项目在容器内与交叉轴的对其方式,项目设置的align-self值可以覆盖align-items的值,默认值为auto,代表继承父元素的align-items属性值,该属性有6个属性值,除了auto其余属性值和容器属性的align-items值相同。(详见2.5、align-items属性)

1. auto
2. flex-start
3. flex-end 
4. center  
5. baseline 
6. stretch
图 十八 align-self属性值实例(center)

参考文献:
【0】Flex 布局教程:语法篇  
http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html
【1】Flex 布局教程:实例篇  
http://www.ruanyifeng.com/blog/2015/07/flex-examples.html
【2】弹性布局各种坑爹兼容  
https://www.cnblogs.com/yangjie-space/p/4856109.html
【3】A Complete Guide to Flexbox[h]  
https://css-tricks.com/snippets/css/a-guide-to-flexbox/
【4】A Visual Guide to CSS3 Properties 
https://scotch.io/tutorials/a-visual-guide-to-css3-flexbox-properties

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