CSS学习笔记:flex布局
参考资料:https://www.bilibili.com/video/BV1N54y1i7dG?p=4
一、Flex布局简介
1. Flex布局的主要作用
flex布局是flexible布局的缩写,字面意思就是弹性布局,它主要的作用是使用它可以非常方便地对html上的元素进行水平排布。
当flex布局还没有出现的时候,我们希望对网页元素进行水平布局往往是需要采用浮动(float)来实现的,但使用浮动会带来许多意想不到的问题:例如元素脱离标准流而造成父盒子坍缩,后面排列的元素需要使用clear:both等方式消除浮动来避免前面浮动元素带来的影响等等,此外浮动也没有提供使水平排列的元素等分父盒子的功能,程序员手动编写这样的功能费时费力,使我们编写页面过程中出现了许多不必要的麻烦。
2. Flex布局应用场景
和前面所说的一样,Flex布局就是为了开发人员能够更简单地进行元素的排版而生的,可以看到,很多大网站上水平排布元素的方式都由float实现改成了flex实现,因而学习flex布局是有益且必要的。
b站的主页:



jetbrains官网:

从这些大网站上可以看出flex布局已经应用到了非常多的页面之上,熟练掌握Flex布局应该是当前前端开发人员的必备技能之一。
二、Flex布局的使用
1. Flex布局的两种相关元素
Flex布局中,有两种相关的元素,一个是父元素(flex-container),即用于存放被放置元素的容器,例如上面b站和jetbrains官网上包围住所有小项目的父级元素;二是子元素(flex-item),即希望被有条理放置的各个元素项(通常是水平排列),即上面b站的每个选项和jetbrains官网上的各个介绍卡片。
因为布局的结果和父元素和子元素都相关,因此,我们需要分别对父元素和子元素分别进行设置才能得到想要的结果。
2. 父项属性
| 属性 | 作用 |
|---|---|
| flex- direction | 设置主轴的方向 |
| justify-content | 设置主轴上的子元素排列方式 |
| flex-wrap | 设置子元素是否换行 |
| align-content | 设置侧轴上的子元素的排列方式(多行) |
| align-items | 设置侧轴上的子元素排列方式(单行) |
| flex-flow | 复合属性,相当于同时设置了flex-direction和flex-wrap |
2.1 flex- direction
在flex布局中,是分为主轴和侧轴两个方向,同样的叫法有:行和列、x轴和y轴
- 默认主轴方向就是x轴方向,水平向右
- 默认侧轴方向就是y轴方向,水平向下
默认排列如下(从左到右):

此时修改flex-direction属性为:
.flex-container {
display: flex;
flex-direction: column; /*竖直排列*/
...
}
其作用是修改主轴为y轴,因此元素竖直排列,效果如下:

flex- direction的所有取值和效果:
| 属性值 | 说明 |
|---|---|
| row | 从左到右(默认值) |
| column | 从上到下 |
| row-reverse | 从右到左 |
| column-reverse | 从下到上 |
2.2 justify-content
作用是设置主轴上的元素排列,具体效果如下:
| 常用属性值 | 说明 | 效果 |
|---|---|---|
| flex-start | 从轴的头部开始排列(默认值) | ![]() |
| flex-end | 从轴的尾部开始排列 | ![]() |
| center | 在主轴居中对齐 | ![]() |
| space-around | 平分剩余空间 | ![]() |
| space-between | 先两边贴边,再平分剩余空间 | ![]() |
| space-evenly | 距离相等 | ![]() |
2.3 flex-wrap
可以发现,如果上面的元素如果再增加一个,绿色的容器的第一行就无法再装下了,但事实是怎样呢?

可以发现,加入这个元素之后,这个元素并没有放置在下一行,而是挤在了第一行,此外所有元素的宽度都被压缩了。
原因:默认情况下,item都排在一条线( 轴线) 上。flex-wrap属性定义 , flex布局中默认是不换行的(flex-wrap默认值为no-wrap)。
当排不下需要换行时,设置flex-wrap: wrap即可:
.flex-container {
flex-wrap: wrap;
...
}

2.4 align-items
作用:设置侧轴上子元素的排列方式(单行)
| 属性值 | 说明 | 效果 |
|---|---|---|
| flex-start | 从上到下(默认值) | ![]() |
| flex-end | 从下到上 | ![]() |
| center | 挤到一起居中(垂直居中) | ![]() |
| stretch | 拉伸(子元素不能设置高度) | ![]() |
2.5 align-content
和align-items的作用非常类似,都是用于设置侧轴上子元素的排列方式,但align-content是用于设置多行子元素的排列(单行元素无效),并且还有侧轴两边贴边等的效果。
| 属性值 | 说明 | 效果 |
|---|---|---|
| center | 多行元素居中 | ![]() |
| space-around | 平分剩余空间 | ![]() |
| space-between | 先上下行贴边,再平分剩余空间 | ![]() |
2.6 flex-flow
可以一次设置flex-direction和flex-wrap两个属性,如:
.flex-container {
flex-flow: wrap column;
}
3. 子项属性
| 属性名 | 作用 |
|---|---|
| flex | 子项目占的份数 |
| align-self | 控制子项自己在侧轴的排列方式 |
| order | 属性定义子项的排列顺序(前后顺序) |
3.1 flex
flex属性定义子项目分配剩余空间,用flex来表示占多少份数。
语法:
.item {
flex: <number>;
}
案例:模拟京东商城的搜索栏,即左右两个部分的宽度固定,而中间的宽度自适应。

<div class="flex-container">
<div></div>
<div></div>
<div></div>
</div>
.flex-container {
...
display: flex;
}
.flex-container > div:nth-child(1) {
width: 100px;
height: 100%;
background-color: plum;
}
.flex-container > div:nth-child(2) {
background-color: salmon;
flex: 1; /*这里取了全部的剩余空间*/
}
.flex-container > div:nth-child(3) {
width: 100px;
height: 100%;
background-color: #6ad281;
}
效果:

因为div1和div3分别占用了100px的宽度,而div2使用flex占据剩余空间,因此div2就占据了中间所有的空间。
此时改变页面的宽度,可以发现中间部分会自适应变化,而两边宽度不变。可见,使用flex布局非常容易就可以实现圣杯布局的核心部分。
因为flex可以按比例分,因此我们可以摆脱使用百分比分配的困扰:
.flex-container > div:nth-child(1) {
flex: 1;
background-color: plum;
}
.flex-container > div:nth-child(2) {
flex: 1;
background-color: salmon;
}
.flex-container > div:nth-child(3) {
flex: 2;
background-color: #6ad281;
}
效果如下:

可以看到紫色和橙色各占用一份空间,而绿色占用了两份的空间。
3.2 align-self
作用:改变单个元素在侧轴上的排列。
初始效果:

添加:
.flex-container > div:last-child {
align-self: flex-end;
}
效果:

3.3 order
子元素的order值都默认是0,设置的order值越小,就排列在flex容器的越前面的位置。
初始:

修改:
.flex-container > div:nth-child(3) {
order: -1;
}
效果:

CSS学习笔记:flex布局的更多相关文章
- CSS 学习笔记 - Flex 布局
传统布局方式的局限性 传统的网页布局方式,采用 display + position + float 的方式来实现.这种方式,无法实现一些复杂的布局,并且在实现某些布局时,会有一些局限性. 比如,最常 ...
- CSS学习笔记09 简单理解BFC
引子 在讲BFC之前,先来看看一个例子 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- css学习笔记四
广州天气变冷了,css学习笔记还是要总结. 总结: 1:几米页面静态页面主要是一列结构头部banner图,mainbody部分放文字内容和图书图片,底部是页面的版权信息 2:腾讯软件中心静态页面制作( ...
- CSS学习笔记10 相对定位,绝对定位与固定定位
文档流中的元素的位置由元素在 (X)HTML 中的位置决定,这就是最原始的普通流,前面讲到的浮动CSS学习笔记08 浮动可以改变元素在文档流中的位置,除了这个我们还可以通过使用CSS的position ...
- CSS学习笔记08 浮动
从CSS学习笔记05 display属性一文中,我们知道div是块元素,会独占一行,即使div的宽度很小,像下面这样 应用display属性的inline属性可以让div与div共享一行,除了这种方法 ...
- CSS学习笔记之选择器
目录 1.元素选择器 2.继承 3.选择器分组 4.声明分组 5.后代选择器 6.子元素选择器 7.相邻兄弟选择器 8.类选择器 9.ID 选择器 10.属性选择器 11.伪类 12.伪元素 1.元素 ...
- 2022-07-10 第五小组 pan小堂 css学习笔记
css学习笔记 什么是 CSS? CSS 指的是层叠样式表* (Cascading Style Sheets) CSS 描述了如何在屏幕.纸张或其他媒体上显示 HTML 元素 CSS 节省了大量工作. ...
- HTML+CSS学习笔记 (7) - CSS样式基本知识
HTML+CSS学习笔记 (7) - CSS样式基本知识 内联式css样式,直接写在现有的HTML标签中 CSS样式可以写在哪些地方呢?从CSS 样式代码插入的形式来看基本可以分为以下3种:内联式.嵌 ...
- HTML+CSS学习笔记 (6) - 开始学习CSS
HTML+CSS学习笔记 (6) - 开始学习CSS 认识CSS样式 CSS全称为"层叠样式表 (Cascading Style Sheets)",它主要是用于定义HTML内容在浏 ...
随机推荐
- 最详细STL(一)vector
vector的本质还是数组,但是可以动态的增加和减少数组的容量(当数组空间内存不足时,都会执行: 分配新空间-复制元素-释放原空间),首先先讲讲vector和数组的具体区别 一.vector和数组的区 ...
- Scala trait特质 深入理解
Scala trait特质 深入理解 初探Scala 特质trait 在Scala中,trait(特质)关键字有着举足轻重的作用.就像在Java中一样,我们只能在Scala中通过extends进行单一 ...
- 洛谷2387 NOI2014魔法森林(LCT维护最小生成树)
本题是运用LCT来维护一个最小生成树. 是一个经典的套路 题目中求的是一个\(max(a_i)+max(b_i)\)尽可能小的路径. 那么这种的一个套路就是,先按照一维来排序,然后用LCT维护另一维 ...
- JAR文件
目录 JAR文件 创建JAR文件 jar程序选项 清单文件 注释 可执行JAR文件 警告 多版本JAR文件 注释 关于命令行选项的说明 警告 警告 JAR文件 在将应用程序打包时,你一定希望只向用户提 ...
- suricata的模块和插槽
参考资料 suricata官方文档https://suricata.readthedocs.io/en/latest/performance/runmodes.html#different-runmo ...
- 学习笔记-React的简单介绍&工作原理
一.React简单介绍 1.React起源于Facebook内部项目,与2013年5月 2.是一个用于构建用户界面的JavaScript库 二.React特点 1.声明式设计-React采用声明范式, ...
- Windows10使用技巧
Windows10配置技巧 新机配置 "我的电脑"图标设置 在桌面右击鼠标=>个性化=>点击左侧"主题"=>点击相关的设置中的"桌面 ...
- 剑指offer:JZ9 用两个栈实现队列
JZ9 用两个栈实现队列 描述 用两个栈来实现一个队列,使用n个元素来完成 n 次在队列尾部插入整数(push)和n次在队列头部删除整数(pop)的功能. 队列中的元素为int类型.保证操作合法,即保 ...
- leetcode 6/300 Z字型变换 py
目录 题目说明 方法一:利用flag 题目说明 方法一:利用flag 简单来说就是利用flag来表示方向,真的神来之笔. class Solution: def convert(self, s: st ...
- Scrum Meeting 0505
零.说明 日期:2021-5-5 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 qsy PM&前端 完成邮箱注册页面功 ...












