css3提出了一种新的布局方式.她并没有以摧枯拉朽之势博得我的喜爱.我和她的故事总是伴随着苦涩的味道.世道变了,总要做出些选择才能跟紧步伐.她很强大,能满足你天马行空的需求而不必抓掉一大把头发.她却很复杂,属性之多让我多次在门外观望.一回生,二回熟.来往多了,竟也混熟了. 原来了解其核心思想和原理便可拨开云雾见明月.

以前都是用float + position 来定位布局.用过float的都知道,会涉及到清除浮动的问题以及BFC(块级格式化上下文),容易出现问题开发也麻烦.后来使用inline-block 布局规避掉清除浮动的问题,还能自适应内容宽度. 还能通过vertical-align:middle 来解决垂直居中的问题,但是移动开发的大潮来袭,inline-block对响应式布局上终究显得力不从心.伸缩盒模型应运而生,能轻松的解决诸如垂直居中,自适应,拉伸,响应式等等问题.让开发者从各种hack和多版本开发的重复劳动中解脱. 我个人认为这是非常有意义的.为了有一个直观的理解,咱们来看一些常见的布局,用flexbox是怎么做的:

1.  几个div水平排列,类似inline-block的效果

可见只需要在父容器上设定一个display:flex 便可实现该效果,非常简单.

2.  垂直居中

3.  2栏自适应布局

4.  圣杯布局

Flexbox--弹性盒模型

弹性盒子模型的出现是为了满足当今各种设备尺寸的自适应问题.它规定了一系列语法来表述项目如何在一个弹性盒子模型中自适应排列.这个盒子相对于其他元素是独立的,可以把它看成一个block元素,也可以是inline元素.它的语法可以分成2部分来看:

对于弹性盒子的描述

  • flex-direction
  • flex-wrap
  • flex-flow
  • justify-content
  • align-items
  • align-content

对于盒子中元素的描述

  • order
  • flex-grow
  • flex-shrink
  • flex-basis
  • flex
  • align-self

按术语分类

flexbox的属性比较多,我们需要配合它的基本设计概念来辅助记忆.根据上图,我们按术语进行分类:

  • 弹性容器(Flex container)  

   包含着弹性项目的父元素。通过设置 display 属性的值为 flex 或 inline-flex 来定义弹性容器。

  • 弹性项目(Flex item)

    弹性容器的每个子元素都成为弹性项目。弹性容器直接包含的文本将包覆成匿名弹性项目。

  • 轴(Axis)

    每个弹性框布局包含两个轴。弹性项目沿其依次排列的那根轴称为主轴(main axis)。垂直于主轴的那根轴称为侧轴(cross axis)

    • flex-direction 属性确立主轴。
    • justify-content 属性定义了在当前行上弹性项目沿主轴如何排布。
    • align-items 属性定义了在当前行上弹性项目沿侧轴默认如何排布。
    • align-content 属性定义了在多行上弹性项目沿侧轴默认如何排布.
    • align-self 属性定义了单个弹性项目在侧轴上应当如何对齐,这个定义覆盖由align-items 所确立的默认值。
  • 方位(Direction)

    弹性容器的各个边(主轴起点(main start)/主轴终点(main end)侧轴起点(cross start)/侧轴终点(cross end))描述了弹性条目流的起点与终点。它们具体取决于弹性容器的主轴与侧轴以及由 writing-mode 确立的方向(从左到右、从右到左,等等)。

    • order 属性将元素与序号组关联起来,并决定哪些元素先出现。
    • flex-flow 属性是 flex-direction 和 flex-wrap 属性的简写,决定弹性项目如何排布。     
  • 行(Line)

    根据 flex-wrap 属性,弹性项目可以排布在单个行或者多个行中。此属性控制侧轴的方向和新行排列的方向。

  • 尺寸(Dimension)

    根据弹性容器的主轴与侧轴,弹性项目的宽和高相应称为主轴尺寸(main size) 与 侧轴尺寸(cross size)

新旧语法对比

了解概念是学习一个东西的基石.可是要完成一个东西,经验是最宝贵的.学习的目的就是去使用,提高效率.纸上谈兵毫无意义.由于伸缩盒的规范经历了好几次大版本的修改,造成多个版本共同存在.

2009年7月 工作草案 (display: box;)  https://www.w3.org/TR/2009/WD-css3-flexbox-20090723/
    2011年3月 工作草案 (display: flexbox;)
    2011年11月 工作草案 (display: flexbox;) https://www.w3.org/TR/2011/WD-css3-flexbox-20110322/
    2012年3月 工作草案 (display: flexbox;)
    2012年6月 工作草案 (display: flex;)

2012年9月 候选推荐 (display: flex;)  https://www.w3.org/TR/2012/WD-css3-flexbox-20120612/

上图列出了09年版和2012版的语法对比,11年的过渡语法版本就不说了. 目前就IE11支持.

由于09年版语法对多行支持不好,因此你最好在一个flex容器内仅包含一行子元素。

跨浏览器兼容

比较有趣的是,09年版支持情况非常好,除了ie.

兼容性方案的处理是,写09年,和12年版本伸缩盒标准语法,以及相应的浏览器厂商前缀.跨浏览器写法支持任意安卓和ios

09年版:

12年版:

经验tips

伸缩盒兼容

  1. .page-wrap {
  2. display: -webkit-box; /* OLD - iOS 6-, Safari 3.1-6 */
  3. display: -moz-box; /* OLD - Firefox 19- (buggy but mostly works) */
  4. display: -ms-flexbox; /* TWEENER - IE 10 */
  5. display: -webkit-flex; /* NEW - Chrome */
  6. display: flex; /* NEW, Spec - Opera 12.1, Firefox 20+ */
  7. }

子元素按比例分配兼容

  1. .page-item {
  2. width: 20%; /* For old syntax, otherwise collapses. */
  3. -webkit-box-flex:; /* OLD - iOS 6-, Safari 3.1-6 */
  4. -moz-box-flex:; /* OLD - Firefox 19- */
  5. -webkit-flex:; /* Chrome */
  6. -ms-flex:; /* IE 10 */
  7. flex:; /* NEW, Spec - Opera 12.1, Firefox 20+ */
  8. } 

其中的width属性非常重要,你可以设置任意值,但必须要有.如果不设,在某些浏览器上会出现无法正确按设定的比例分配剩余空间的情况.

参考

  • 伸缩盒新旧语法详细查询 flexbox
  • 我个人比较推荐阮一峰的2篇文章Flex布局-语法篇,Flex布局-实例篇. 看过之后基本就知道如何使用flexbox布局了. 在此不做详细探讨.
  • W3C制定标准流程:

    工作草案(Working Draft)
    最终公示(Last Call)
    候选推荐标准(Candidate Recommendation)
    提名推荐标准(Proposed Recommendation)
    推荐标准(Recommendation)

Flexbox 自由的布局的更多相关文章

  1. Flexbox制作CSS布局实现水平垂直居中

    Flexbox实现一个div元素在body页面中水平垂直居中: <!DOCTYPE html><html lang="en"><head>  & ...

  2. flexbox弹性伸缩布局

    <!doctype html><html lang="en"><head> <meta charset="UTF-8" ...

  3. H5 - flexbox 弹性盒布局和布局原理

    新版的flexbox规范分两部分:一部分是container,一部分是 items. flexbox是一整套布局规范,包含了多个css属性,所以学习起来比`float: left;` 这样简单的布局要 ...

  4. flexbox弹性盒子布局

    混合划分 demo1,css: #demo1{ width: 100%; background: #ccc; display: -webkit-flex;/*表示使用弹性布局*/ } #demo1 . ...

  5. Flexbox盒子弹性布局

    Can I Use? 2. 概念: 当你给一个元素使用了flexbox模块,那么它的子元素就会指定的方向在水平或者纵向方向排列.这些子元素会按照一定的比例进行扩展或收缩来填补容器的可用空间. < ...

  6. FlexBox弹性盒布局

    网页布局(layout)是 CSS 的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂 ...

  7. CSS多列布局Multi-column、伸缩布局Flexbox、网格布局Grid详解

    新css属性为我们提供了更加便捷的网页布局方式.来自微软的thomas lewis将带你认识去Grid Alignment,Flexibox Box以及Multi-column Layout这三大领域 ...

  8. 潜入FLEXBOX——CSS弹性布局

    介绍 Flexbox是CSS3中的一种新的布局模式,旨在满足现代Web的更复杂的需求.本文将详细介绍新近稳定化的Flexbox语法.浏览器支持将迅速增长,因此,当支持范围足够使Flexbox实用时,您 ...

  9. 使用 Flexbox 的居中布局

随机推荐

  1. [虾扯蛋] android界面框架-Window

    从纯sdk及framwork的角度看,android中界面框架相关的类型有:Window,WindowManager,View等.下面就以这几个类为出发点来概览下安卓开发的"界面架构&quo ...

  2. 哪种缓存效果高?开源一个简单的缓存组件j2cache

    背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...

  3. TODO:macOS上ThinkPHP5和Semantic-UI集成

    TODO:macOS上ThinkPHP5和Semantic-UI集成 1. 全局安装 (on OSX via homebrew)Composer 是 homebrew-php 项目的一部分 2. 把X ...

  4. win7安装时,避免产生100m系统保留分区的办法

    在通过光盘或者U盘安装Win7操作系统时,在对新硬盘进行分区时,会自动产生100m的系统保留分区.对于有洁癖的人来说,这个不可见又删不掉的分区是个苦恼.下面介绍通过diskpart消灭保留分区的办法: ...

  5. LeetCode 7. Reverse Integer

    Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return -321 Have you ...

  6. C#多线程之线程同步篇1

    在多线程(线程同步)中,我们将学习多线程中操作共享资源的技术,学习到的知识点如下所示: 执行基本的原子操作 使用Mutex构造 使用SemaphoreSlim构造 使用AutoResetEvent构造 ...

  7. Hawk 4.7 单步调试

    单步调试的意义 已经编写的工作流,可能会因为某些外界环境的变化而出错,此时需要排除错误,我们可以使用单步调试. 单步调试的本质,相当于只使用前n个模块,这样就能看到每个步骤下,流的改变. 例子 还是上 ...

  8. 玩转spring boot——结合jQuery和AngularJs

    在上篇的基础上 准备工作: 修改pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...

  9. 【踩坑速记】开源日历控件,顺便全面解析开源库打包发布到Bintray/Jcenter全过程(新),让开源更简单~

    一.写在前面 自使用android studio开始,就被它独特的依赖方式:compile 'com.android.support:appcompat-v7:25.0.1'所深深吸引,自从有了它,麻 ...

  10. notepad++设置默认打开txt文件失效的解决方法

    1.系统环境 win10企业版,64位系统 2.初步设置 设置txt默认为notepad++打开,菜单:设置->首选项->文件关联 选择对应的文件扩展,点击"关闭"按钮 ...