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. iTerm2 都不会用,还敢自称老司机?(上)

    对于需要长期与终端打交道的工程师来说,拥有一款称手的终端管理器是很有必要的,对于 Windows 用户来说,最好的选择是 Xshell,这个大家都没有异议.但对于 MacOS 用户来说,仍然毋庸置疑, ...

  2. 通过mockjs来制作假数据

    需用用到的模块为express和mockjs //导入模块开启服务器模块 const express=require('express') //导入假数据模块 const mockjs=require ...

  3. 【设计思想】MVC模式

    MVC 模式 MVC 模式(三层架构模式) MVC模式(Model-View-Controller, MVC): 是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图( ...

  4. windows7免费永久激活方法分享

    前言 我相信,这里肯定有看过我上一篇博客的同学. 我说了,为解决windows7激活问题,我会找一个比较好的方法. 首先先让大家看一看激活前windows7的计算机属性: 显示是未激活的.下面就是方法 ...

  5. Js数组代替写循环的几个方法

    简介 循环是个不可避免的结构,而且不好复用,同时循环还很难加入其他操作中.更麻烦的是,使用循环就意味着在每一个新的迭代中有更多变化需要响应. 上了循环的控制结构会使代码看起来变得复杂,故而这里提几个替 ...

  6. [python]回答百度知道上的问题2000-2999之间的回文日

    因为百度知道的编辑器没有提供代码功能,将回复写入. 题目如下: 求2000到2999的所有回文日,例如20200202 用Python怎么做 回文年好求,回文日的话,年月日这咋存啊 思路一:遍历每一天 ...

  7. Cinemachine中噪音的应用

    两种默认产生噪音的方式 Nosie阶段的Component   Component在流水线中主要通过MuteCameraState来处理对State的计算.   对于Noise类型的Component ...

  8. nodejs中的并发编程

    从sleep的实现说起 在nodejs中,如果要实现sleep的功能主要是通过"setTimeout + promise"实现,也可以通过"循环空转"来解决.前 ...

  9. Java 并发原子操作类(转)

    转自:https://www.jianshu.com/p/3632a0f9f083 线程不安全的高并发实现 客户端模拟执行 5000 个任务,线程数量是 200,每个线程执行一次,就将 count 计 ...

  10. CUDA Pro Tip: Write Flexible Kernels with Grid-Stride Loops

    https://devblogs.nvidia.com/cuda-pro-tip-write-flexible-kernels-grid-stride-loops/ One of the most c ...