Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:这个图很经典, 但却搞得有点复杂, 我是不太建议大家看的, 只要记住项目必须没主轴排列,且默认可自动收缩就可以了
Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。
采用 Flex 布局的元素,称为 Flex 容器(flex container),简称"容器"。它的所有子元素自动成为容器成员,称为 Flex 项目(flex item),简称"项目"。
容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end。
项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。
可以将任一元素添加display:flex
属性转为 flex 容器
允许应用到 flex 容器上的 6 个属性
序号 | 描述 | 属性/值 |
---|---|---|
1 | 方向 | flex-direction:row/column/row-reverse/column-reverse |
2 | 换行 | flex-wrap: wrap/nowrap/wrap-reverse |
3 | flex-flow 上面 2 个的简写 | flex-flow: flex-direction, flex-wrap |
4 | 主轴的对齐方向 | justify-content:center/flex-start/flex-end/space-around/space-between |
5 | 侧轴的对齐方向 | align-items:center/flex-end/flex-start/stretch/baseline |
6 | 多行列的对齐方向 | align-content |
序号 | 描述 | 属性/值 |
---|---|---|
1 | 增长比例 | flex-grow |
2 | 缩减比例 | flex-shrink |
3 | 默认大小 | flex-basis |
4 | 上述三者简写 | flex |
5 | 项目顺序 | order |
6 | 自身对齐方式 | align-self |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>FlexBox弹性盒布局快速预览</title>
<style>
/* 弹性盒子,要用火狐浏览器查看 */
.container {
width: 300px;
/* 如果这个容器中的内容要使用flexBox布局, 第一步就是必须将这个容器转为弹性盒子 */
display: flex;
}
.container > .item {
/* 一旦将父元素转为弹性容器,内部的“子元素”就会自动成为: 弹性项目 */
/* 不管这个项目标签之前是什么类型,统统转为“行内块” */
/* 行内:全部在一排显示 */
/* 块: 可以设置宽和高 */
/* 设置弹性项目空间平分分配,进行平均缩放,如果没有定义,可能会有剩余空间 */
/* flex: auto; */
/* 设置每个弹性项目宽度和高度 */
width: 40px;
height: 30px;
}
</style>
</head>
<body>
<!-- .container>.item{$}*3 -->
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>FlexBox弹性盒多行容器</title>
<style>
.container {
width: 300px;
/* 弹性容器 */
display: flex;
}
.container > .item {
/* 通过改变弹性项目宽度查看换行属性,默认不换行 */
width: 60px;
width: 120px;
width: 150px;
}
/* 换行显示:flex-wrap:wrap ,转换为多行容器*/
.container {
flex-wrap: wrap;
}
</style>
</head>
<body>
<!-- .container>.item{$}*3 -->
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>单行容器中的项目对齐方式</title>
<style>
.container {
/* 转为弹性盒 */
display: flex;
width: 300px;
/* justify-content: 控制所有项目在主轴上的对齐方式; */
/* 本质是:设置容器中的剩余空间在所有 “项目之间”的分配方案 */
/* 1. 容器剩余空间在所有项目“二边”的如何分配 ,将全部项目视为一个整体*/
justify-content: flex-start;
justify-content: flex-end;
justify-content: center;
/* 2. 容器剩余空间在所有项目“之间”的如何分配 ,将项目视为一个个独立的个体*/
/* 弹性项目两端对齐 */
justify-content: space-between;
/* 分散对齐: 剩余空间在所有项目二侧平均分配 */
justify-content: space-around;
/* 平均对齐分配空间 */
justify-content: space-evenly;
}
.container > .item {
/* 设置每个弹性项目宽度 */
width: 60px;
}
</style>
</head>
<body>
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>多行容器中的项目对齐方式</title>
<style>
.container {
/* 转为弹性盒 */
width: 300px;
display: flex;
/* 多行容器 */
flex-wrap: wrap;
height: 150px;
/* align-content: 设置多行容器中的项目排列; */
/* 1. 容器剩余空间在所有项目“二边”的如何分配 ,将全部项目视为一个整体*/
/* 默认值 */
align-content: stretch;
/* 从顶部左侧开始排列 */
align-content: flex-start;
/* 从底部部右侧开始排列 */
align-content: flex-end;
/* 居中排列 */
align-content: center;
/* 2. 容器剩余空间在所有项目“之间”的如何分配 ,将项目视为一个个独立的个体*/
/* 两端对齐 */
align-content: space-between;
/* 分散对齐 */
align-content: space-around;
/* 平均分配对齐 */
align-content: space-evenly;
}
.container > .item {
/* 设置每个弹性项目宽度 */
width: 60px;
}
</style>
</head>
<body>
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>主轴为垂直方向时的项目排列</title>
<style>
.container {
/* 转为弹性盒 */
width: 300px;
height: 150px;
display: flex;
/* 主轴方向:默认为行 */
flex-direction: row;
flex-direction: column;
/* 项目二边分配 */
justify-content: flex-start;
justify-content: flex-end;
justify-content: center;
/* 项目之间分配 */
justify-content: space-between;
justify-content: space-around;
justify-content: space-evenly;
}
.container > .item {
/* 设置每个弹性项目宽度 */
/* width: 60px; */
}
</style>
</head>
<body>
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>项目在交叉轴上的排列</title>
<style>
.container {
/* 转为弹性盒 */
display: flex;
width: 300px;
height: 200px;
/* 项目在交叉轴上默认是自动伸缩的 */
/* 默认值 */
align-items: stretch;
/* 项目交叉轴排列 */
align-items: flex-start;
align-items: flex-end;
align-items: center;
}
.container > .item {
/* 设置每个弹性项目宽度 */
width: 60px;
}
</style>
</head>
<body>
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>主轴方向与项目排列的简写</title>
<style>
.container {
/* 转为弹性盒 */
display: flex;
width: 300px;
height: 50px;
/* 默认值就不用写出来 */
/* 默认对齐方式 */
/* flex-direction: row; */
/* 禁止换行 */
/* flex-wrap: nowrap; */
/* 提换上面两行代码简写 */
/* flex-flow: row nowrap; */
/* 按列排列,可以设置换行和不换行(nowrap/wrap),换行就是多行容器 */
flex-flow: column wrap;
}
.container > .item {
/* 设置每个弹性项目宽度 */
width: 60px;
}
</style>
</head>
<body>
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>flex容器属性实战:快速撸一个主导航</title>
<style>
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
a {
text-decoration: none;
color: #ccc;
}
nav {
height: 40px;
line-height: 40px;
background-color: #333;
padding: 0 50px;
/* 转换为弹性盒布局 */
display: flex;
}
nav a {
height: inherit;
line-height: 40px;
padding: 0px 15px;
}
nav a:hover {
background-color: seagreen;
color: white;
}
/* 登录/注册放在最右边 */
nav a:last-of-type {
margin-left: auto;
}
</style>
</head>
<body>
<header>
<nav>
<a href="">首页</a>
<a href="">HTML</a>
<a href="">CSS</a>
<a href="">JavaScript</a>
<a href="">PHP</a>
<a href="">登录/注册</a>
</nav>
</header>
</body>
</html>
display:flex
属性转为 flex 容器