Flex 是 CSS3 推出的一种布局方式,到现在为止已经有超过十年时间了,所有现代浏览器都已经支持了,详细参考CanIUse

给一个元素的 display 属性设置为 flex 就可以给这个元素开启 Flex 布局,其内部的子元素将会受到影响

.box {
display: flex;
}

给这个容器内添加几个元素就可以看到效果

<div class="box">
<div class="item-1">1</div>
<div class="item-2">2</div>
<div class="item-3">3</div>
</div>

可以看到的是默认情况下应该独占一行的 <div> 元素现在全部挤在了一行,这就是 flex 的效果,display 的值除了 flex 还有一个 inline-flex,两者的区别就像 blockinline-block 类似

flex-direction

在平面上布局有 4 个方向,由 flex-direction 属性指定

.box {
flex-direction: row | column | row-reverse | column-reverse;
}

一旦布局方向确定后,则该方向将成为 flex 的主轴,和主轴垂直的一个方向称为交叉轴,图中箭头是用来表示主轴方向的

flex-direction: row

flex-direction: column

flex-direction: row-reverse

flex-direction: column-reverse

justify-content

元素在轴线上有 3 种普通对齐方式,其中 justify-content 属性定义元素在主轴上的位置,align-itemsalign-content 属性定义元素在交叉轴上的位置,值分别有起点,居中和终点

.box {
align-content: flex-start | flex-end | center;
align-items: flex-start | center | flex-end;
justify-content: flex-start | center | flex-end;
}

align-items: flex-start|center|flex-end

align-content: flex-start|flex-end|center

还有 3 种在轴线上均匀分布的方式,由 justify-content 定义在主轴上的分布方式,align-content 定义在交叉轴上的分布方式

.box {
align-content: space-between | space-evenly | space-around;
justify-content: space-between | space-evenly | space-around;
}

align-content: space-between|space-evenly|space-around

align-items

不同于主轴,元素在交叉轴上默认是拉伸的

.box {
align-items: stretch;
}

align-items: stretch

另外还有一个特殊对齐方式是 baseline,这是根据文字的基线对齐,改变每一项文字的大小可以看出效果

align-items: baseline

flex-wrap

当容器无法容纳所有元素的时候,可以通过 flex-wrap 属性设置是否折叠

.box {
flex-wrap: nowrap | wrap | wrap-reverse;
}

flex-wrap: wrap

flex-wrap: wrap-reverse

需要注意的是 wrap-reverse 值会改变交叉轴的方向,下面例子可以说明这一点

align-items: flex-start; flex-wrap: wrap-reverse

前面的属性都是设置在容器上的,接下来的属性都是设置到容器中的元素上的

order

order 可以改变元素的顺序,默认值为 0,按从小到大顺着主轴排列

.item-2 {
order: -1;
}

align-self

单独改变一个元素在交叉轴上的对齐方式,值和 align-items 一致

.item-2 {
align-self: flex-start | center | flex-end;
}

align-self: flex-end

能不能在主轴上单独改变一个元素的对齐方式呢,比如有没有一个 justify-self 属性,浏览器中有是有,但是好像没什么用。

flex

flex 是一个组合属性,由 flex-growflex-shrinkflex-basis 组成

.item {
flex: flex-grow | flex-shrink | flex-basis;
}

flex-grow 属性规定分配容器剩余空间的比例,数值越大就越多

.item-1 {
flex: 2;
} .item-2 {
flex: 1;
} .item-3 {
flex: 3;
}

全部设置为 1 这样所有元素就会平分容器的空间

.item {
flex: 1;
}

默认值是 0,不占用剩余空间

flex-shrink 属性规定当元素空间不足以容纳这所有元素的时候,每个元素应该如何缩小来腾出足够的空间,数值越大需要缩小越多

.item {
flex: 0 1;
}

默认值是 1

flex-basis 规定这个元素在主轴上占据的空间,默认值是 auto,表示元素占据的空间由其自身决定,其值可以是各种长度单位

.item {
flex: 0 1 60px;
}

flex 属性分开写就像这样

.item {
flex-grow: 0;
flex-shrink: 1;
flex-basis: 60px;
}

实际应用

Flex 可以更方便地使用栅格布局以及响应式布局,比如可以在屏幕宽的时候按行布局,屏幕窄的时候按列布局,只需要简单修改一下 flex-direction 属性即可

垂直居中

万恶的垂直居中在 CSS 的世界里实际实现并不像说出来那么简单,不过那都成为过去了,有了 Flex 之后,这个需求将变得非常容易

.box {
display: flex;
} .item {
align-self: center;
}

学习 Flex 布局的更多相关文章

  1. 在微信小程序中学习flex布局

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

  2. 学习flex布局(弹性布局)

    Flex是Flexible Box的缩写,意为弹性布局.是W3C早期提出的一个新的布局方案.可以便捷的实现页面布局,目前较高版本的主流浏览器都能兼容,兼容情况如下: Flex在移动端开发上已是主流,比 ...

  3. CSS flex 布局学习笔记

    写在前面 Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为 Flex 布局. 采用 Flex 布局的元素 ...

  4. CSS学习笔记:flex布局

    目录 一.Flex布局简介 1. Flex布局的主要作用 2. Flex布局应用场景 二.Flex布局的使用 1. Flex布局的两种相关元素 2. 父项属性 2.1 flex- direction ...

  5. Flex布局(引用阮一峰大神)

    Flex 布局教程:语法篇 http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html Flex 布局教程:实例篇 http://www.ruan ...

  6. flex布局小记

    越来越深刻的感到日事日毕的必要性,很久之前就做了备忘说要深刻学习flex布局,没想到一拖就拖到了这个时候! 一,什么是flex布局: flex布局即flexible box布局,也就是弹性盒模型或者弹 ...

  7. 玩游戏 学Flex布局

    大家好,今天推荐一个学习Flex布局的网页小游戏,非常不错,是国外的牛人开发的,值得一试,重复几次,就会大概了解Flex的属性了! 地址: http://flexboxfroggy.com/#zh-c ...

  8. display: flex; 布局

    废话不多说,供上我学习Flex布局的启蒙文章,一切的答案,尽在这里,仔细阅读,多多回味!保证你有所收获! http://www.ruanyifeng.com/blog/2015/07/flex-gra ...

  9. 30 分钟学会 Flex 布局

    30 分钟学会 Flex 布局 有酒   617 人赞同了该文章 为什么我要写这一篇关于 Flex 布局的教程? 因为它十分简单灵活,区区简单几行代码就可以实现各种页面的的布局,以前我在学习页面布局的 ...

随机推荐

  1. Flutter环境搭建以及快捷命令

    Flutter环境搭建 配置环境变量 用户变量 FLUTTER_STORAGE_BASE_URL : https://storage.flutter-io.cn PUB_HOSTED_URL : ht ...

  2. for循环结合range使用方法

    range概念:表示一个数据范围 基本的语法格式:range(开始数据,结束数据(不包括结束数据),步长) 记住一个公式:下一个数据=开始数据+步长 步长:表示的是数据前后的间隔 OK,基本的概念和语 ...

  3. 智慧港口——基于二三维一体化GIS的港口可视化监管平台

    “智慧港口”是以现代化基础设施设备为基础,以云计算.大数据.物联网.移动互联网.智能控制等新一代信息技术与港口运输业务深度融合为核心,以港口运输组织服务创新为动力,以完善的体制机制.法律法规.标准规范 ...

  4. SpringBoot框架——从SpringBoot看IoC容器初始化流程之方法分析

    目录 一.概观Spring Boot 二.Spring Boot应用初始化 2.1 初始化入口 2.2 SpringApplication的run方法 2.3 方法分析 三.容器创建与初始化 3.1 ...

  5. iview Checkbox 多选框 单个的时候 如果需要change 以后进行赋值 就要用value 不要用v-modal 然后用updateModel 方法

    noSuchSituationSetFalse () { this.noSuchSituationOne = false this.$refs.noSuchSituationRef.updateMod ...

  6. Asp.net 的输入框的 Enabled属性 与 ReadOnly属性

    控件不管是设置 Enabled="false" 还是ReadOnly="true",后台都取不到前台的值,值为“空”: 在界面视觉上,Enabled=" ...

  7. iOS开发:十六进制颜色转UIColor

    Objective-C UIColor * __nullable UIColorFromHexValue(NSUInteger hexValue) { CGFloat red = (hexValue ...

  8. ArrayList,HashSet,SortedSet之间的区别是什么?

    今天看Redis官方案例,出现了列表和集合概念,列表在Java中指的就是List,集合在Java中指的就是Set,那么怎么实现列表和集合,以及它们有什么区别呢? 我写了个Demo演示下: import ...

  9. Cisco二层交换机命令

    1.二层交换机基本配置 Switch >Switch >enable   # 进入特权模式 Switch#configure terminal   # 进入全局配置模式 Switch(co ...

  10. Selenium系列(三) - 针对元素常见的简单操作

    如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...