一、Flex 布局是什么?

CSS3引入了一种新的布局模式——Flexbox布局,即伸缩盒模型布局(Flexible Box)模型。用来提供一个更加有效的方式制定、调整和分布一个容器里的项目布局,即使它们的大小是未知或者动态的,这里简称Flex。

CSS3引入的布局模式Flex布局,主要思想是让容器有能力让其子项目能够改变其 宽度 、 高度 、 顺序 ,以最佳的方式填充可用空间。Flex容器会使子项目(伸缩项目)扩展来填满可用空间,或缩小它们以防止溢出容器。

任何一个容器都可以指定为 Flex 布局。

.box{

display: flex;

}

行内元素也可以使用 Flex 布局。

.box{

display: inline-flex;

}

采用 Flex 布局的元素,称为 Flex 容器(flex container),简称"容器"。它的所有子元素自动成为容器成员,称为 Flex 项目(flex item),简称"项目"。

设为 Flex 布局以后,CSS的 columns 在伸缩容器上没有效果。子元素(伸缩项目)的 float 、 clear 和 vertical-align 属性将失效

Flex布局在定义伸缩项目大小时伸缩容器会预留一些可用空间,可以调节伸缩项目的相对大小和位置。例如,可以 确保伸缩容器中的多余空间平均分配多个伸缩项目。如果伸缩容器没有足够大的空间放置伸缩项目时,浏览器会根据一定的比例减少伸缩项目的大小,使其不溢出伸缩容器。

二、Flex基本概念和模型中的术语

和CSS3其他属性不一样,Flexbox并不是一个属性,而是一个模块,包括多个CSS3属性,涉及东西较多,包括整个组属性,要了解新的术语和概念才能学好Flex布局。

在Flexbox模型中与布局计算偏向使用书写模式方向的块布局和行内布局不同,伸缩布局偏向使用伸缩流的方向。为了让描述伸缩布局变得更容易,本章定义一系列相对于伸缩流的术语。如下图:

图片介绍

主轴、主轴方向:沿着一个伸缩容器的主轴配置伸缩项目,主轴是主轴方向的延伸。伸缩容器额主轴,伸缩项目主要沿着这条轴进行布局。重要,它不一定是水平的,这主要取决于 flex-direction 属性。如果其取值为 column ,主轴的方向为纵向的。

主轴起点、主轴终点:伸缩项目的配置从容器的主轴起点边开始,往主轴终点边结束。也就是说,伸缩项目放置在伸缩容器内从主轴起点( main-start )向主轴终点( main-end )方向。

主轴长度、主轴长度属性:伸缩项目在主轴的方向的宽度或高度就是项目的主轴长度,伸缩项目的主轴长度属性是 width 或 height 属性,由哪一个对着主轴的方向决定。

侧轴、侧轴方向:与主轴垂直的轴称做侧轴,侧轴是侧轴方向的延伸。主要取决于主轴的方向。

侧轴起点、侧轴终点:伸缩项目的配置从容器的侧轴起点边开始,往侧轴终点边结束。也就是说,伸缩项目放置在伸缩容器内从侧轴起点( cross-start )向侧轴终点( cross-end )方向。

侧轴长度、侧轴长度属性:伸缩项目在侧轴的方向的宽度或高度就是项目的侧轴长度,伸缩项目的侧轴长度属性是 width 或 height 属性,由哪一个对着侧轴的方向决定。

通过设置 display 属性显式地给一个元素设置为 flex 或者 inline-flex ,这个容器就是一个伸缩容器。其中设置为 flex 的容器被渲染成为一个块级元素,而设置为 inline-flex 的容器则渲染为一个行内元素。若元素的 display 的指定值是 inline-flex 且元素是一个浮动或绝对定位元素,则display的计算值是flex。

一个伸缩容器的内容具有零个以上的伸缩项目——伸缩容器的每个子元素(除了需要盒修复的元素之外)都会成为一个伸缩项目。且浏览器会将任何直接在伸缩容器里的连续文字块包起来成为匿名伸缩项目。

总结:容器默认存在两根轴:水平的主轴( main axis )和垂直的交叉轴( cross axis )。主轴的开始位置(与边框的交叉点)叫做 main start ,结束位置叫做 main end ;交叉轴的开始位置叫做 cross start ,结束位置叫做 cross end 。

项目默认沿主轴排列。单个项目占据的主轴空间叫做 main size ,占据的交叉轴空间叫做 cross size 。

三、Flexbox模型规范状态

Flexbox布局的语法规范版本众多,浏览器支持不一致。Flex布局语法规范主要分成三种:

旧版本(Old),2009年版本。

混合版本(Hybird),2011年版本。

最新版本(Modern),使用 display:flex 或者 display:inline-flex 。

Flex布局旧版本和混合版本本章不做介绍,只对符合W3C规范的最新版本Flex属性做记录。如果有兴趣的同学可以参考大漠老师图解CSS3这本书第8章CSS3伸缩布局盒模型。

四、伸缩容器的属性

以下6个属性设置在容器上

flex-direction

flex-wrap

flex-flow

justify-content

align-items

align-content

4.1 flex-direction属性介绍

伸缩流方向。 flex-direction 属性是指伸缩容器的主轴方向,其决定了伸缩项目放置在伸缩容器的方向。其默认值为 row 。如果 flex-direction 设置为row,Flex项目从左到右排列。如果 flex-direction 设置为 column ,Flex项目从上到下排列。

flex-direction 属性它有4个值。

.box {

flex-direction: row | row-reverse | column | column-reverse;

}

从左到右依次是row | row-reverse | column | column-reverse

row :排版方式从左到右排列。

row-reverse :与 row 排列方向相反。从右向左排列。

column :类似于 row ,不过是从上到下排列。

column-reverse :类似于 row-reverse ,不过是从下到上排列。

4.2 flex-wrap属性介绍

伸缩流换行。伸缩项目在伸缩容器中有时候也会溢出伸缩容器。与传统的CSS盒模型一样,CSS允许使用 overflow:hidden 属性来处理溢出内容的显示方式。在伸缩容器中有一个伸缩换行属性,主要用来设置伸缩容器的伸缩项目是单行显示还是多行显示,以及决定侧轴的方向。使用此属性来启用溢出的伸缩容器的伸缩项目自动换行到下一行以及控制流动方向。在伸缩容器属性中,主要通过 flex-wrap 属性来设置伸缩项目是否换行,默认值为 nowrap 。

flex-direction 属性它有3个值。

.box {

flex-wrap: nowrap | wrap | wrap-reverse;

}

从上到下依次是nowrap | wrap | wrap-reverse;

nowrap:伸缩容器单行显示。

wrap:换行,第一行在上方。

wrap-reverse:换行,第一行在下方。

4.3 flex-flow属性介绍

伸缩方向与换行。 flex-flow 属性是 flex-direction 属性和 flex-wrap 属性的简写形式,默认值为 row nowrap 。

.box {

flex-flow: || ;

}

flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为 row nowrap 。

4.4 justify-content属性

主轴对齐。 justify-content 属性定义了伸缩项目在主轴上的对齐方式。指定如何在伸缩项目之前分布伸缩容器额外空间。当一行上的所伸缩项目不能伸缩或可伸缩但已经达到最大长度时,这一属性才会对伸缩容器额外空间进行分配。当伸缩项目溢出某一行时,这一属性也会在项目的对齐上施加一些控制。

justify-content 属性它有5个值。

.box {

justify-content: flex-start | flex-end | center | space-between | space-around;

}

从上到下依次是flex-start | flex-end | center | space-between | space-around;

flex-start:伸缩项目向一行的起始位置靠齐。

flex-end:伸缩项目向一行的结束位置靠齐。

center:伸缩项目向一行的中间位置靠齐。

space-between:伸缩项目会平均地分布在行里。第一个伸缩项目一行中的最开始位置,最后一个项目在一行中最终点位置。

space-around:伸缩项目会平均地分布在行里,两端保留一半的空间。(每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。)

4.5 align-items属性

侧轴对齐。 align-items 属性定义项目在伸缩容器的当前行的侧轴(垂直于主轴)上的对齐方式。可以把它想象成侧轴的 justify-content 。

.box {

align-items: flex-start | flex-end | center | baseline | stretch;

}

从上到下依次是flex-start | flex-end | center | baseline | stretch;

flex-start:伸缩项目在侧轴起点边的外边距紧靠住该行在侧轴起始边。(侧轴的起点对齐。)

flex-end:伸缩项目在侧轴终点边的外边距紧靠住该行在侧轴终点边。(侧轴的终点对齐。)

center:伸缩项目的外边距盒在该行的侧轴上居中放置。(侧轴的中点对齐。)

baseline:伸缩项目根据伸缩项目的基线对齐。(项目的第一行文字的基线对齐。)

stretch:默认值,伸缩项目拉伸填充整个容器。(如果项目未设置高度或设为auto,将占满整个容器的高度。)

4.6 align-content属性

堆栈伸缩行。用来定义伸缩容器中 伸缩项目行 在侧轴的对齐方式,类似于侧轴对齐,只不过这是用来控制伸缩项目行在布局轴的堆放方式。 align-content 属性会更改 flex-wrap 的行为。它和 align-items 相似,但不是对齐伸缩项目,它对齐的是伸缩行。简单来说, align-content 属性主要用来调准伸缩行在伸缩容器里的对齐方式。它接受的值也很类似。

.box {

align-content: flex-start | flex-end | center | space-between | space-around | stretch;

}

从左到右依次是:flex-start | flex-end | center | space-between | space-around | stretch

flex-start :各行向伸缩容器的起点位置堆叠。

flex-end :各行向伸缩容器的结束位置堆叠。

center :各行向伸缩容器的中间位置堆叠。

space-between :各行在伸缩容器中平均分布。

space-around :各行在伸缩容器中平均分布,在两边各有一半的空间。

stretch : align-content 的默认值,各行将会伸展以占用额外的空间。

这个属性只有伸缩项目有多行时才生效,这种情况只有display的flex-wrap为wrap时,并且没有足够的空间把伸缩项目行放在同一行中。也就是这个属性将对每一行起作用而不是每个伸缩项目。

五、伸缩项目的属性

以下6个属性设置在伸缩项目上

order

flex-grow

flex-shrink

flex-basis

flex

align-self

5.1 flex-grow属性

.box-item {

flex-grow: (默认值为0)

}

中间的元素设置为flex-grow的值为2

flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。如果所有伸缩项目的 flex-grow 设置为1,每个伸缩项目将设置为一个大小相等的额外空间。如果给其中一个伸缩项目设置 flex-grow 值为2,这个伸缩项目所占的额外空间是其他伸缩项目所占额外空间的2倍。

5.2 flex-shrink属性

.box-item {

flex-shrink: (默认值为1)

}

flex-shrink属性的值从左到右依次是:0,1,1

flex-shrink属性使用于伸缩项目,此属性根据需要来定义伸缩项目收缩的能力。如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。

5.3 flex-basis属性

.box-item {

flex-basis: | auto; (默认值为auto)

}

flex-basis属性使用于伸缩项目。这个属性用来设置伸缩项目的伸缩基准值,伸缩容器的额外空间按比列进行伸缩。在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。

它可以设为跟width或height属性一样的值(比如350px),则项目将占据固定空间。

5.4 flex属性

flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。

.box-item {

flex: none | [ ? || ]

}

5.5 align-self属性

.box-item {

align-self: auto | flex-start | flex-end | center | baseline | stretch;

}

伸缩项目第一个1元素设置align-self:flex-end;

align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。

5.6 order属性

.box-item {

order: ;

}

第一个元素设置order: 3,第二个元素设置order: 1,第三个元素设置order: 2

order属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。

六、使用Flex布局实现圣杯布局

圣杯布局

html

我是页眉

我是主内容

我是侧边栏

我是右边栏

我是页脚

CSS

* {

padding: 0;

margin: 0;

}

html,body{

width:100%;

height:100%;

overflow: hidden;

}

body{

display: flex;

flex-flow: column wrap;

}

header {

background: red;

/* 头、脚尺寸固定,不放大、不缩小 */

flex:0 0 50px;

}

section {

display: flex;

flex-flow: row wrap;

flex: 1;

background: green;

}

article {

flex: 1;

order: 2;

background: blue;

}

aside{

order: 3;

align-items: stretch;

background:yellow;

}

footer {

/* 头、脚尺寸固定,不放大、不缩小 */

flex:0 0 50px;

background: darkgoldenrod;

}

七、参考链接

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

html 伸缩盒子布局,详解CSS3伸缩布局盒模型Flex布局相关推荐

  1. css布局详解(一)——盒模型

    一.网页布局的几种情况 今天让我们总结一下在css布局的各种情况做一个总结,为我们以后布局网页时做一个参考. 先看一张图,这是去年cssConf大会时阿里的 @寒冬winter 老师放出来的: 如图所 ...

  2. CSS3 弹性布局盒模型 Flex布局

    Web 应用中,布局设计是非常重要的一部分.随着响应式设计的盛行,一般都要求 Web 应用能够适配不同尺寸的设备.响应式设计中最重要的一环就是布局,需要根据窗口尺寸来调整布局,从而改变元素的尺寸和位置 ...

  3. 怪异盒模型/flex布局

    传统盒模型(标准盒模型) 默认的都是标准盒模型;(border,padding,margin,content) box-sizing:content-box; 盒子的宽度/高度= width/heig ...

  4. css_flex弹性盒模型/flex布局/flex在线可视化工具

    文章目录 contents1: content 2: 测试你对flexbox的掌握 flex 模型 flex在线可视化工具(visual guide to css3 flexbox) flex布局 f ...

  5. 怪异盒模型flex布局

    怪异盒模型 box-sizing:border-box;为元素设定的宽度和高度决定了元素的边框盒.就是说,为元素指定的任何内边距和边框都将在已设定的宽度和高度内进行绘制.通过从已设定的宽度和高度分别减 ...

  6. 详解 CSS3中最好用的布局方式——flex弹性布局(看完就会)

    文章包含个人理解,错误请指出. 往期css3文章 CSS3基础属性大全 CSS3动画属性 animation详解(看完就会) CSS3 transform 2D转换之移动 旋转 缩放(详细讲解看完就会 ...

  7. 【C++】C++对象模型:对象内存布局详解(C#实例)

    C++对象模型:对象内存布局详解 0.前言 C++对象的内存布局.虚表指针.虚基类指针解的探讨,参考. 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个概念可 ...

  8. Android开发重点难点1:RelativeLayout(相对布局)详解

    前言 啦啦啦~博主又推出了一个新的系列啦~ 之前的Android开发系列主要以完成实验的过程为主,经常会综合许多知识来写,所以难免会有知识点的交杂,给人一种混乱的感觉. 所以博主推出"重点难 ...

  9. uni-app的flex盒模型与布局进阶写法(高手勿进)

    uni-app的flex盒模型与布局进阶写法(高手勿进) 官方文档 盒模型的进阶操作 flex布局 总结 官方文档 许多细节不多赘述,细枝末节还是看官方文档 盒模型 flex布局 盒模型的进阶操作 盒 ...

  10. (转)详解css3弹性盒模型(Flexbox)

    今天刚学了css3的弹性盒模型,这是一个可以让你告别浮动.完美实现垂直水平居中的新特性. Flexbox是布局模块,而不是一个简单的属性,它包含父元素和子元素的属性. Flexbox布局的主体思想是似 ...

最新文章

  1. 微软开源可解释机器学习工具包lnterpretML
  2. ARCGIS导入XY坐标的EXCEL文档,出现无法选择X和Y字段的问题
  3. Android SqliteManager 源码
  4. 课堂作业:返回一个二维整数组中最大子数组的和
  5. 从壹开始学习 NetCore 新篇章 ║ Blog.Core 开发社之招募计划书
  6. 收发一体超声波测距离传感器模块_芜湖低功耗超声波液位计物位计设备排名
  7. AE插件Aura Rowbyte Aura for Mac(AE几何粒子渲染效果插件)
  8. unity3d与eclipse集成开发android应用
  9. cluster oracle修改,Oracle 修改集群的资源属性(依赖关系)
  10. 响应式网站设计 - 最佳实践
  11. 学习3ds max插件开发过程中的一些小结
  12. 迅雷 linux 命令行 版本号,linux下完美运行迅雷5.8.9.662
  13. 编程语言的分类,以及网络瓶颈效应
  14. 软件设计——云原生12要素
  15. oracle控制台转圈进不去,老鸟帮你win10输完密码一直转圈圈进不去的具体方法
  16. 监控io性能、free命令、ps命令、查看网络状态、linux下抓包
  17. python3 selenium模块Chrome设置代理ip的实现
  18. android 卡顿、ANR优化(1)屏幕刷新机制
  19. 大华网络摄像头通过gstreamer 获取不到RTSP流
  20. 如何用CropBox实现头像裁剪并与java后台交互

热门文章

  1. C语言 3习题6 请编程序将China译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。 3习题7 设圆半径r=1.5
  2. 「75页PDF免费下载」面向所有人的机器学习科普大全
  3. 抖音怎么用计算机数字等于中文字,抖音数字表白公式怎么玩 抖音数字表白从1到100攻略...
  4. JAVA SE基础---kuangstudy
  5. Kafka高性能之页缓存(page cache)使用
  6. make_blobs
  7. 大学生程序设计邀请赛(华东师范大学)A
  8. android定时上传视频,【安卓按键精灵】定时执行指定任务
  9. 毕业生的档案都有什么意义,为什么说它那么重要|智测优聘总结
  10. 怒怨与忧虑,微信的双重危机来临!