欢迎访问我的个人博客:http://www.xiaolongwu.cn

1. 前言

flex弹性盒,是一种布局方式,当页面需要适应不同的屏幕大小以及设备类型时,它依然能确保元素

拥有更恰当的排布行为,弹性盒属于 CSS 3 部分,IE9 以下不支持,现代浏览器指的就是 IE9 及以上的浏览器

2. flex的优势

举个例子:这里我们要实现一个功能,让一个dom元素水平垂直居中;

2.1 传统实现方式(1),居中元素的宽高已知
    .box1{
position: relative;
background: darkcyan;
width: 800px;
height: 300px;
} .box1-son{
position: absolute;
border: 1px solid seashell;
width: 200px;
height: 200px;
top: 50%;
left: 50%;
transform: translate(-100px,-100px);
} <div class="box1">
<div class="box1-son">传统布局1</div>
</div>
2.2 传统实现方式(2),居中元素的宽高未知
    .box2{
position: relative;
background: darkcyan;
width: 800px;
height: 300px; } .box2-son{
position: absolute;
border: 1px solid seashell;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
} <div class="box2">
<div class="box2-son">传统布局2</div>
</div>

当然这种方式同时以可以实现方式一的功能

2.3 flex方式实现
    .flex-container {
background-color: #FECE3F;
width: 600px;
height: 220px;
display: flex;
justify-content: center;
align-items: center;
} .flex-item {
width: 120px;
height: 120px;
background-color: blue;
}

这种方式很简单,我们只需要给容器添加三个属性即可,即:

    display: flex;
justify-content: center;
align-items: center;

就是这么简单,display: flex表示容器为弹性盒,justify-content: center表示子元素在主轴方向居中,align-items: center表示子元素在侧轴方向居中;

这里的主轴和侧轴不理解没关系,请看下面介绍;

3. flex的基本理解

首先理解flex的几个概念:

  1. 弹性容器 (Flex container)即父容器,包含着弹性项目的父元素,通过设置 display 属性的值为 flex

    来定义弹性容器;
  2. 弹性项目 (Flex item)即子容器,弹性容器的每个子元素都称为弹性项目;
  3. 一个弹性容器可以包含多个弹性项目,但是一个弹性项目 只有一个直接弹性容器;
  4. 主轴 (main axis)和侧轴 (cross axis,也称交叉轴),弹性项目依次排列的轴为主轴,与其垂直的那根轴为侧轴,flex默认水平方向为主轴
  5. 我们可以通过改变弹性容器的flex-direction属性来改变它的主轴方向
  6. flex 布局涉及到 12 个 CSS 属性(不含 display: flex),其中父容器、子容器各 6 个。不过常用的属性只有 4 个,父容器、子容器各 2 个;

4. 父容器的属性 共6个

前两个为常用属性,我们先说常用的

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

该属性定义了子容器在主轴上的排列对齐方式。它有5个取值

.box {
justify-content: flex-start | flex-end | center | space-between | space-around;
} flex-start(默认值):左对齐
flex-end:右对齐
center: 居中
space-between:两端对齐,项目之间的间隔都相等。
space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。

4.2 align-items

该属性定义了子容器在侧轴上的排列对齐方式。它有5个取值

.box {
align-items: flex-start | flex-end | center | baseline | stretch;
} flex-start:交叉轴的起点对齐。
flex-end:交叉轴的终点对齐。
center:交叉轴的中点对齐。
baseline: 项目的第一行文字的基线对齐。
stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。

4.3 flex-direction

该属性指定了内部元素是如何在 flex 容器中布局的,定义了主轴的方向(正方向或反方向)

.box {
flex-direction: row | row-reverse | column | column-reverse;
} row(默认值):主轴为水平方向,起点在左端。
row-reverse:主轴为水平方向,起点在右端。
column:主轴为垂直方向,起点在上沿。
column-reverse:主轴为垂直方向,起点在下沿。

4.4 flex-wrap

flex-wrap属性定义,如果一条轴线排不下,如何换行

.box{
flex-wrap: nowrap | wrap | wrap-reverse;
} nowrap(默认):不换行。
wrap:换行,第一行在上方。
wrap-reverse:换行,第一行在下方。
4.5 flex-flow

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

4.6 align-content

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(默认值):轴线占满整个交叉轴。

5. 子容器属性 共6个

前两个为常用的属性,我们先说常用的属性

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

flex 属性,是flex-grow,flex-shrink,felx-basis三个属性的简写:

属性 默认值 描述
flex-grow 0 定义弹性盒子项的拉伸因子,即子项分配父项剩余空间的比,默认值为 0
flex-shrink 1 指定了 flex 元素的收缩规则,子项的收缩所占的份数,默认值为1 [ 当所有子项相加的宽度大于父项的宽度,每个子项减少的多出的父项宽度的 1/n ]
felx-basis auto 指定了 flex 元素在主轴方向上的初始大小,即子项的宽度
如果属性值为none        则表示 0 0 auto
如果属性值为1或者auto 则表示 1 1 auto

属性值可以为1-3个值连用,他们的具体用法请看下面单独属性的详解

5.2 flex-grow

flex-grow 属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。

我们通过下面的例子来更直观的认识一下flex-grow

.flex {
display: flex;
width: 600px;
margin: 0;
padding: 0;
list-style: none;
}
.flex li:nth-child(1) {
width: 200px;
background-color: red;
}
.flex li:nth-child(2) {
flex-grow: 1;
width: 50px;
background-color: blue;
}
.flex li:nth-child(3) {
flex-grow: 3;
width: 50px;
background-color: green;
} <ul class="flex">
<li>a</li>
<li>b</li>
<li>c</li>
</ul>

结果如下

上面的例子中 b,c 两项都定义了 flex-grow属性,
flex容器的剩余空间分成了4份其中 b 占 1 份,c 占 3 份,即 1:3,
flex 容器的剩余空间长度为600-200-50-50=300px
所以最终abc的长度分别为:a: 200px;b: 50+(300*1/4)=125px;c: 50+(300*3/4)=275px
5.3 flex-shrink

flex-shrink 属性的默认值为1,如果没有显示定义该属性,将会自动按照默认值 1 在所有子项宽度相加之后计算比率来进行空间收缩

这个属性正好和flex-grow相反,为缩小时所占的份数,这里我们可以自己动手写一下,自己感受一下,我就不再举例了

5.4 flex-basis

flex-basis 属性的初始值为auto,设置或检索弹性盒伸缩基准值,如果所有子元素的基准值之和大于剩余空间,则会根据每项设置的基准值,按比率伸缩剩余空间

取值可以为百分比,也可以为具体的数值,如(20%,或者300px)

这里需要注意的是 ,如果子容器设置了flex-basis属性,则他自己的width属性将会失效,这里可以理解为flex-basis属性的权重高于width的权重

5.5 order

order 属性规定了弹性容器中的可伸缩项目在布局时的顺序,元素按照 order 属性的数值的增序进行布局,数值小的排在前面,可以为负值,默认值为 0,拥有相同 order 属性值的元素按照它们在源代码中出现的顺序进行布局

5.6 align-self

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

该属性可能取6个值,除了auto,其他都与align-items属性完全一致。

.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}

文章到这里就结束了,感谢阅读。

github资源地址:https://github.com/深入理解弹性盒flex布局.md

我的个人博客:http://www.xiaolongwu.cn

csdn博客地址:https://blog.csdn.net/wxl1555

如果您对我的博客内容有疑惑或质疑的地方,请在下方评论区留言,或邮件给我,共同学习进步。

邮箱:wuxiaolong802@163.com

css基础--深入理解弹性盒flex布局的更多相关文章

  1. 响应式布局(CSS3弹性盒flex布局模型)

    传统的布局方式都是基于盒模型的 利用display.position.float来布局有一定局限性 比如说实现自适应垂直居中 随着响应式布局的流行,CSS3引入了更加灵活的弹性布局模型 flex弹性布 ...

  2. 87.CSS Flex 弹性盒模型布局教程(共用的css在48篇文章gird)

    CSS Flex 弹性盒模型布局教程 Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. flex布局就是给任何一个容器添加 dis ...

  3. 彻底搞懂flex弹性盒模型布局

    为什么要用flex 基于css3简单方便,更优雅的实现,浏览器兼容性好,传统的css实现一个div居中布局要写一堆代码,而现在几行代码就搞定了,没有理由不用flex. 兼容性: Base Browse ...

  4. CSS3弹性盒模型布局模块介绍

    来源:Robert’s talk原文:http://robertnyman.com/2010/12/02/css3-flexible-box-layout-module-aka-flex-box-in ...

  5. css基础--深入理解opacity和rgba的区别

    欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 首先这两个都与透明度有关,那么他们之间有什么具体的区别呢?在实际工作中我们需要注意什么呢?请您接着往下看 语法 1. rg ...

  6. CSS学习笔记(11)--Flex 布局教程:语法篇

    原文--阮一峰博客 作者: 阮一峰 日期: 2015年7月10日 网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 ...

  7. css3弹性盒子 flex布局

    CSS3 弹性盒 1.display:flex 说明: 设置为弹性盒(父元素添加) 2.flex-direction(主轴排列方式) 说明: 顺序指定了弹性子元素在父容器中的位置 row 默认在一行内 ...

  8. 使用Sass优雅并高效的实现CSS中的垂直水平居中(附带Flex布局,CSS3+SASS完美版)

    实现css水平垂直居中的方法有很多,在这里我简单的说下四种比较常用的方法: 1.使用CSS3中的Flex布局 对于flex,我们要了解的是它是一个display的属性,而且必须要给他的父元素设置fle ...

  9. CSS学习笔记(12)--Flex 布局教程:实例篇

    原文--阮一峰博客 作者: 阮一峰 日期: 2015年7月14日 上一篇文章介绍了Flex布局的语法,今天介绍常见布局的Flex写法. 你会看到,不管是什么布局,Flex往往都可以几行命令搞定. 我只 ...

随机推荐

  1. JavaScript进阶(六)用JavaScript读取和保存文件

    用JavaScript读取和保存文件 因为Google还不提供同步插件数据的功能,所以导入和导出插件配置就必须和文件打交道了.而出于安全原因,只有IE才提供访问文件的API:但随着HTML 5的到来, ...

  2. 《java入门第一季》之面向对象面试题

    1:方法重写和方法重载的区别?方法重载能改变返回值类型吗? 方法重写: 在子类中,出现和父类中一模一样的方法声明的现象. 方法重载: 同一个类中,出现的方法名相同,参数列表不同的现象. 方法重载能改变 ...

  3. 《java入门第一季》之二维数组

    /* 格式2: 数据类型[][] 数组名 = new 数据类型[m][]; m:表示这个二维数组有多少个一维数组. 列数没有给出,可以动态的给.这一次是一个变化的列数. */ class Array2 ...

  4. android 向webview传值

    android中可以使用WebView加载网页,同时Android端的java代码可以与网页上的javascript代码之间相互调用. 效果图: (一)Android部分: 布局代码: <spa ...

  5. Material Design5.x动画实现解析篇一

    Material Design设计语言动画篇共推出六种类型的动画效果: 1.Touch feedback(触摸反馈) 2.Reveal effect(揭露效果) 3.Activity transiti ...

  6. 安卓TV开发(概述) 智能电视之视觉设计和体验分析

         转载说明出处 :http://blog.csdn.net/sk719887916, 作者:skay 前言:移动智能设备的发展,推动了安卓另一个领域,包括智能电视和智能家居,以及可穿戴设备的大 ...

  7. Socket层实现系列 — bind()的实现(一)

    bind()函数的使用方法很简单,但是它是怎么实现的呢? 笔者从应用层出发,沿着网络协议栈,分析了bind()的系统调用.Socket层实现,以及它的TCP层实现. 本文主要内容:bind()的系统调 ...

  8. 【Qt编程】基于Qt的词典开发系列<十五>html特殊字符及正则表达式

    1.html特殊字符的显示 我们知道html语言和C语言一样也有一些特殊字符,它们是不能正常显示的,必须经过转义,在网上可以查到如何显示这些字符,如下图所示: 上图给了最常用的特殊字符的显示,下面我们 ...

  9. Http的会话跟踪和跨站攻击(xss)

    会话跟踪 什么是会话? 客户端打开与服务器的连接发出请求到服务器响应客户端请求的全过程称之为会话. 什么是会话跟踪? 会话跟踪指的是对同一个用户对服务器的连续的请求和接受响应的监视. 为什么需要会话跟 ...

  10. ELF 动态链接 - so 的 .dynamic 段

    动态链接文件中最重要的段就是 .dynamic段 这个段里保存了动态链接器需要的最基本的信息 比如:1.  依赖于哪些共享对象, d_tag = DT_NEED,  d_ptr 表示共享对象文件名 2 ...