1.flex布局体验
1.1 传统布局与flex布局
- 传统布局
- 兼容性好
- 布局繁琐
- 局限性,不能再移动端很好的布局
- flex 弹性布局
- 操作方便,布局极为简单,移动端应用很广泛
- PC 端浏览器支持情况较差
- IE 11或更低版本,不支持或仅部分支持
建议:
- 如果是PC端页面布局,我们还是传统布局。
- 如果是移动端或者不考虑兼容性问题的PC端页面布局,我们还是使用flex弹性布局
1.2 初体验
目标效果:
flex布局实现代码:
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
div {
display: flex;
width: 80%;
height: 300px;
background-color: pink;
justify-content: space-around;
}
div span {
/* width: 150px; */
height: 100px;
background-color: purple;
margin-right: 5px;
flex: 1;
}
</style>
</head>
<body>
<div>
<span>1</span>
<span>2</span>
<span>3</span>
</div>
</body>
</html>
2.flex布局原理
flex是flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性,任何一个容器都可以 指定为 flex 布局。
- 当我们为父盒子设为 flex 布局以后,子元素的 float、clear 和 vertical-align 属性将失效。
- 伸缩布局 = 弹性布局 = 伸缩盒布局 = 弹性盒布局 =flex布局
采用Flex布局的元素,称为Flex容器(flex container),简称"容器"。它的所有子元素自动成为容器成员,称为 Flex 项目(flex item),简称"项目"。
- 体验中 div 就是 flex父容器。
- 体验中 span 就是 子容器 flex项目
- 子容器可以横向排列也可以纵向排列
总结flex布局原理:
- 就是通过给父盒子添加flex属性,来控制子盒
- 子的位置和排列方式

3.flex布局父项常见属性
3.1 常见父项属性
| 属性 | 作用 | 常用值 | 说明 |
|---|---|---|---|
| display | 定义容器为Flex布局 | flex、inline-flex | 必须设置的属性,将容器设为Flex布局模式 |
| flex-direction | 设置主轴方向 | row、row-reversecolumn、column-reverse | 决定项目的排列方向 |
| flex-wrap | 设置项目是否换行 | nowrap、wrap、wrap-reverse | 控制单行/多行布局 |
| flex-flow | flex-direction和flex-wrap的简写 | <flex-direction> <flex-wrap> | 复合属性,推荐使用简写 |
| justify-content | 设置项目在主轴上的对齐方式 | flex-start、flex-endcenter、space-betweenspace-around、space-evenly | 水平对齐(主轴方向) |
| align-items | 设置项目在交叉轴上的对齐方式 | stretch、flex-startflex-end、centerbaseline | 垂直对齐(交叉轴方向) |
| align-content | 设置多根轴线的对齐方式 | stretch、flex-startflex-end、centerspace-between、space-around | 多行布局时才有效 |
3.2 flex-direction设置主轴的方向
- 主轴与侧轴 在 flex 布局中,是分为主轴和侧轴两个方向,同样的叫法有: 行和列、x轴和y轴
- 默认主轴方向就是 x 轴方向,水平向右
- 默认侧轴方向就是 y 轴方向,水平向下

- 属性值 flex-direction 属性决定主轴的方向(即项目的排列方向)
注意: 主轴和侧轴是会变化的,就看 flex-direction 设置谁为主轴,剩下的就是侧轴。而我们的子元素是跟着主轴来排列的
| 属性值 | 主轴方向 | 交叉轴方向 | 项目排列顺序 | 视觉图示 | 应用场景 |
|---|---|---|---|---|---|
row(默认值) | 水平方向 从左到右 | 垂直方向 从上到下 | 1 → 2 → 3 → 4 | [1][2][3][4] → | 水平导航栏、卡片水平排列 |
row-reverse | 水平方向 从右到左 | 垂直方向 从上到下 | 4 ← 3 ← 2 ← 1 | ← [4][3][2][1] | 从右向左的语言布局、特殊设计需求 |
column | 垂直方向 从上到下 | 水平方向 从左到右 | 1 ↓ 2 ↓ 3 ↓ 4 | [1] ↓<br>[2] ↓<br>[3] ↓<br>[4] | 垂直菜单、手机APP布局 |
column-reverse | 垂直方向 从下到上 | 水平方向 从左到右 | 4 ↑ 3 ↑ 2 ↑ 1 | [4] ↑<br>[3] ↑<br>[2] ↑<br>[1] | 倒序列表、时间线反向显示 |
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
div {
/* 给父级添加flex属性 */
display: flex;
width: 800px;
height: 300px;
background-color: pink;
/* 默认的主轴是 x 轴 行 row 那么y轴就是侧轴喽 */
/* 我们的元素是跟着主轴来排列的 */
/* flex-direction: row; */
/* 简单了解 翻转 */
/* flex-direction: row-reverse; */
/* 我们可以把我们的主轴设置为 y轴 那么 x 轴就成了侧轴 */
flex-direction: column;
}
div span {
width: 150px;
height: 100px;
background-color: purple;
}
</style>
</head>
<body>
<div>
<span>1</span>
<span>2</span>
<span>3</span>
</div>
</body>
</html>3.3 justify-content设置主轴上的子元素排列方式
justify-content 属性定义了项目在主轴上的对齐方式
注意: 使用这个属性之前一定要确定好主轴是哪个
| 属性值 | 作用 | 主轴排列效果(水平方向) | 代码示例 | 适用场景 |
|---|---|---|---|---|
flex-start(默认值) | 从主轴起点开始排列 | [1][2][3]__________(左对齐) | justify-content: flex-start; | 左对齐布局,默认排版 |
flex-end | 从主轴终点开始排列 | __________[1][2][3](右对齐) | justify-content: flex-end; | 右对齐布局,导航栏居右 |
center | 在主轴上居中对齐 | ____[1][2][3]____(居中) | justify-content: center; | 居中对齐,按钮组居中 |
space-between | 两端对齐,项目间间隔相等 | [1]____[2]____[3](两端贴边) | justify-content: space-between; | 导航栏两端分布,卡片等距分布 |
space-around | 每个项目两侧间隔相等 | _[1]__[2]__[3]_(两侧留白) | justify-content: space-around; | 卡片等距分布,两侧有间距 |
space-evenly | 项目与项目、项目与边框间隔均相等 | _[1]_[2]_[3]_(完全等距) | justify-content: space-evenly; | 完全等距分布,现代UI设计 |
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
div {
display: flex;
width: 800px;
height: 300px;
background-color: pink;
/* 默认的主轴是 x 轴 row */
flex-direction: row;
/* justify-content: 是设置主轴上子元素的排列方式 */
/* justify-content: flex-start; */
/* justify-content: flex-end; */
/* 让我们子元素居中对齐 */
/* justify-content: center; */
/* 平分剩余空间 */
/* justify-content: space-around; */
/* 先两边贴边, 在分配剩余的空间 */
justify-content: space-between;
}
div span {
width: 150px;
height: 100px;
background-color: purple;
}
</style>
</head>
<body>
<div>
<span>1</span>
<span>2</span>
<span>3</span>
<span>4</span>
</div>
</body>
</html>3.4 flex-wrap设置子元素是否换行
默认情况下,项目都排在一条线(又称”轴线”)上。flex-wrap属性定义,flex布局中默认是不换行的。
| 属性值 | 作用 | 换行效果 | 代码示例 | 适用场景 | 图示说明 |
|---|---|---|---|---|---|
nowrap(默认值) | 不换行,所有项目挤在一行 | [1][2][3][4][5](压缩项目宽度) | flex-wrap: nowrap; | 导航栏、按钮组 需要保持单行布局 | 不换行,项目可能溢出或被压缩 |
wrap | 正常换行,第一行在上方 | [1][2][3][4][5](从上到下换行) | flex-wrap: wrap; | 卡片布局、相册网格 响应式设计 | 从上到下换行,最常用 |
wrap-reverse | 反向换行,第一行在下方 | [4][5][1][2][3](从下到上换行) | flex-wrap: wrap-reverse; | 特殊设计需求 时间线倒序 | 从下到上换行,特殊布局 |
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
div {
display: flex;
width: 600px;
height: 400px;
background-color: pink;
/* flex布局中,默认的子元素是不换行的, 如果装不开,会缩小子元素的宽度,放到父元素里面 */
/* flex-wrap: nowrap; */
flex-wrap: wrap;
}
div span {
width: 150px;
height: 100px;
background-color: purple;
color: #fff;
margin: 10px;
}
</style>
</head>
<body>
<div>
<span>1</span>
<span>2</span>
<span>3</span>
<span>4</span>
<span>5</span>
</div>
</body>
</html>3.5 align-items设置侧轴上的子元素排列方式(单行)
该属性是控制子项在侧轴(默认是y轴)上的排列方式 在子项为单项(单行)的时候使用
| 属性值 | 作用 | 交叉轴排列效果 | 代码示例 | 适用场景 | 图示说明(以主轴为row为例) |
|---|---|---|---|---|---|
stretch(默认值) | 拉伸项目以填满容器高度 | [=======][=======][=======](高度拉伸) | align-items: stretch; | 等高布局、表单控件 | 项目高度拉伸至容器高度 |
flex-start | 从交叉轴起点开始排列 | [___][___][___](顶部对齐) | align-items: flex-start; | 顶部对齐、导航栏 | 所有项目顶部对齐 |
flex-end | 从交叉轴终点开始排列 | [___][___][___](底部对齐) | align-items: flex-end; | 底部对齐、页脚导航 | 所有项目底部对齐 |
center | 在交叉轴上居中对齐 | [___][___][___](垂直居中) | align-items: center; | 垂直居中布局 | 所有项目垂直居中 |
baseline | 项目的第一行文字的基线对齐 | [___][___][___](基线对齐) | align-items: baseline; | 文字对齐、表单标签 | 文字基线对齐 |
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
div {
display: flex;
width: 800px;
height: 400px;
background-color: pink;
/* 默认的主轴是 x 轴 row */
flex-direction: column;
justify-content: center;
/* 我们需要一个侧轴居中 */
/* 拉伸,但是子盒子不要给高度 */
/* align-items: stretch; */
align-items: center;
/* align-content: center; */
}
div span {
width: 150px;
height: 100px;
background-color: purple;
color: #fff;
margin: 10px;
}
</style>
</head>
<body>
<div>
<span>1</span>
<span>2</span>
<span>3</span>
</div>
</body>
</html>3.6 align-content设置侧轴上的子元素的排列方式(多行)
设置子项在侧轴上的排列方式 并且只能用于子项出现换行的情况(多行),在单行下是没有效果的。
| 属性值 | 作用 | 交叉轴分布效果 | 代码示例 | 适用场景 | 图示说明(3行布局) |
|---|---|---|---|---|---|
stretch(默认值) | 拉伸行以填满交叉轴空间 | [========][========][========](行间距为0) | align-content: stretch; | 网格布局、均匀分布 | 行高度平均分配 |
flex-start | 从交叉轴起点开始排列 | [___][___][___](顶部对齐) | align-content: flex-start; | 顶部对齐网格 | 所有行紧贴顶部 |
flex-end | 从交叉轴终点开始排列 | [___][___][___](底部对齐) | align-content: flex-end; | 底部对齐网格 | 所有行紧贴底部 |
center | 在交叉轴上居中对齐 | [___][___][___](垂直居中) | align-content: center; | 居中网格布局 | 所有行整体居中 |
space-between | 两端对齐,行间间隔相等 | [___][___][___](首尾行贴边) | align-content: space-between; | 两端分布网格 | 首尾行贴边,中间均匀分布 |
space-around | 每行两侧间隔相等 | [___][___][___](两侧留白) | align-content: space-around; | 四周留白网格 | 每行两侧有间距 |
space-evenly | 行与行、行与边框间隔均相等 | [___][___][___](完全等距) | align-content: space-evenly; | 完美等距网格 | 所有间距完全相等 |
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
div {
display: flex;
width: 800px;
height: 400px;
background-color: pink;
/* 换行 */
flex-wrap: wrap;
/* 因为有了换行,此时我们侧轴上控制子元素的对齐方式我们用 align-content */
/* align-content: flex-start; */
/* align-content: center; */
/* align-content: space-between; */
align-content: space-around;
}
div span {
width: 150px;
height: 100px;
background-color: purple;
color: #fff;
margin: 10px;
}
</style>
</head>
<body>
<div>
<span>1</span>
<span>2</span>
<span>3</span>
<span>4</span>
<span>5</span>
<span>6</span>
</div>
</body>
</html>align-content 和 align-items区别
- align-items 适用于单行情况下, 只有上对齐、下对齐、居中和 拉伸
- align-content 适应于换行(多行)的情况下(单行情况下无效), 可以设置 上对齐、 下对齐、居中、拉伸以及平均分配剩余空间等属性值。
- 总结就是单行找 align-items 多行找 align-content

3.7 flex-flow
flex-flow属性是 flex-direction 和 flex-wrap 属性的复合属性
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
div {
display: flex;
width: 600px;
height: 300px;
background-color: pink;
/* flex-direction: column;
flex-wrap: wrap; */
/* 把设置主轴方向和是否换行(换列)简写 */
flex-flow: column wrap;
}
div span {
width: 150px;
height: 100px;
background-color: purple;
}
</style>
</head>
<body>
<div>
<span>1</span>
<span>2</span>
<span>3</span>
<span>4</span>
<span>5</span>
</div>
</body>
</html>4. flex布局子项常见属性
- flex 子项目占的份数
- align-self 控制子项自己在侧轴的排列方式
- order属性定义子项的排列顺序(前后顺序)
4.1 flex属性
flex 属性定义子项目分配剩余空间,用flex来表示占多少份数。
html
.item {
flex: <number>; /* default 0 */
}html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
div {
display: flex;
width: 80%;
height: 300px;
background-color: pink;
justify-content: space-around;
}
div span {
/* width: 150px; */
height: 100px;
background-color: purple;
margin-right: 5px;
flex: 1;
}
</style>
</head>
<body>
<div>
<span>1</span>
<span>2</span>
<span>3</span>
</div>
</body>
</html>4.2 align-self 控制子项自己在侧轴上的排列方式
align-self 属性允许单个项目有与其他项目不一样的对齐方式,可覆盖 align-items 属性。
默认值为 auto,表示继承父元素的 align-items 属性,如果没有父元素,则等同于 stretch。
html
span:nth-child(2) {
/* 设置自己在侧轴上的排列方式 */
align-self: flex-end;
}4.3 order 属性定义项目的排列顺序
数值越小,排列越靠前,默认为0。
注意:和 z-index 不一样。
html
.item {
order: <number>;
}5. 案例:携程网首页案例制作
完整代码
aiignore
通过网盘分享的文件:H5
链接: https://pan.baidu.com/s/1yoLuzuXbzZaE2xlG2p4NGg 提取码: kjqh
--来自百度网盘超级会员v10的分享- 技术选型 方案:我们采取单独制作移动页面方案 技术:布局采取flex布局
- 搭建相关文件夹结构

- 设置视口标签以及引入初始化样式
html
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="css/normalize.css">
<link rel="stylesheet" href="css/index.css">
<title>携程在手,说走就走</title>- 常用初始化样式
html
body {
max-width: 540px;
min-width: 320px;
margin: 0 auto;
font: normal 14px/1.5 Tahoma, "Lucida Grande", Verdana, "Microsoft Yahei", STXihei, hei;
color: #000;
background: #f2f2f2;
overflow-x: hidden;
-webkit-tap-highlight-color: transparent;
}常见命名模块


常见flex布局思路

背景线性渐变

html
background: linear-gradient(起始方向, 颜色1, 颜色2, ...);
background: -webkit-linear-gradient(left, red , blue);
background: -webkit-linear-gradient(left top, red , blue);背景渐变必须添加浏览器私有前缀 起始方向可以是: 方位名词 或者 度数 , 如果省略默认就是 top
