1. 初识flex布局
flex布局分两种, 一种是flex容器独占一行的布局方式(flex), 另一种是类似行内块元素布局的方式(inline-flex).
<!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>
/* 2.设置容器样式 */
.container {
width: 300px;
height: 150px;
}
/* 3.设置项目样式 */
.item {
width: 100px;
height: 50px;
background-color: bisque;
font-size: 1.5rem;
}
/* 4.将容器/父元素设置为flex容器 */
.container {
display: flex;
/* 4.1.行内块形式的flex容器 */
/* display: inline-flex; */
}
</style>
</head>
<body>
<h2>初识flex布局</h2>
<!-- 1.先写好元素 -->
<!-- 1.1.flex容器 -->
<div class="container">
<!-- 1.2.flex容器中的元素, 又叫"项目", 都会被当做行内块元素来处理 -->
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div>
<!-- 4.1.演示行内块形式的flex容器用 -->
<!-- <div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div> -->
</body>
</html>
2. 设置flex的主轴方向
flex的主轴可以是水平的,也可以是垂直的.可以使用flex-direction属性设置其主轴方向.
<!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>
/* 2.设置容器样式 */
.container {
width: 300px;
height: 150px;
}
/* 3.设置项目样式 */
.item {
width: 100px;
height: 50px;
background-color: bisque;
font-size: 1.5rem;
}
/* 4.将容器/父元素设置为flex容器 */
.container {
display: flex;
}
/* 5.设置主轴方向 */
.container {
flex-direction: row; /* 水平方向, 从左到右; 默认值 */
/* flex-direction: row-reverse; */ /* 水平方向, 从右到左 */
/* flex-direction: column; */ /* 垂直方向, 从上到下 */
/* flex-direction: column-reverse; */ /* 垂直方向, 从下到上 */
}
</style>
</head>
<body>
<h2>设置flex的主轴方向</h2>
<!-- 1.先写好元素 -->
<!-- 1.1.flex容器 -->
<div class="container">
<!-- 1.2.flex容器中的元素, 又叫"项目", 都会被当做行内块元素来处理 -->
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div>
</body>
</html>
3. 设置flex布局主轴方向的项目布局方式
使用flex-wrap属性设置主轴方向的布局方式.其值有:
- nowrap:不换行(默认值),即当前容器容纳不下时,项目自动收缩
- wrap:换行布局, 若当前容器容纳不下, 多出的项目往交叉轴的结束端方向拆行显示; 此时, 创建的flex容器叫: 多行容器
wrap-reverse:反向多行容器, 多出的项目往交叉轴的开始端方向拆行显示.
<!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>
/* 2.设置容器样式 */
.container {
width: 300px;
height: 150px;
}
/* 3.设置项目样式 */
.item {
width: 100px;
height: 50px;
background-color: bisque;
font-size: 1.5rem;
}
/* 4.将容器/父元素设置为flex容器 */
.container {
display: flex;
/* 4.1.主轴以水平方向, 从左到右为例; */
flex-direction: row;
}
/* 5.设置主轴方向的项目布局形式 */
.container {
/* 不换行(默认值), 若当前容器容纳不下, 项目自动收缩 */
flex-wrap: nowrap;
/* 换行布局, 若当前容器容纳不下, 多出的项目往交叉轴的结束端方向拆行显示; 此时, 创建的flex容器叫: 多行容器 */
/* flex-wrap: wrap; */
/* 反向多行容器, 多出的项目往交叉轴的开始端方向拆行显示. */
/* flex-wrap: wrap-reverse; */
}
</style>
</head>
<body>
<h2>设置flex主轴方向的项目布局方式</h2>
<!-- 1.先写好元素 -->
<!-- 1.1.flex容器 -->
<div class="container">
<!-- 1.2.flex容器中的元素, 又叫"项目", 都会被当做行内块元素来处理 -->
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div>
</body>
</html>
4. 用flex-flow属性同时设置主轴方向和主轴方向的项目布局方式
- flex-flow属性使用格式: flex-flow: 主轴方向 主轴上项目布局方式;
flex-flow属性的值为两个属性值时, 是flex-direction和flex-wrap属性值的排列组合.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>用flex-flow属性同时设置主轴方向和主轴方向的项目布局方式</title>
<style>
/* 2.设置容器样式 */
.container {
width: 300px;
height: 150px;
}
/* 3.设置项目样式 */
.item {
width: 100px;
height: 50px;
background-color: bisque;
font-size: 1.5rem;
}
/* 4.将容器/父元素设置为flex容器 */
.container {
display: flex;
}
/* 5.同时设置主轴方向和主轴方向的项目布局方式 */
.container {
/* 两个值, 第一个值是主轴方向, 第二个值是布局方式 */
/* 水平方向,从左到右,不折行 */
flex-flow: row nowrap;
/* 水平方向,从左到右,折行 */
/* flex-flow: row wrap; */
/* 水平方向,从左到右,反向折行 */
/* flex-flow: row wrap-reverse; */
/* 水平方向,从右到左,不折行 */
/* flex-flow: row-reverse nowrap; */
/* 就是主轴属性值和布局方式属性值的排列组合, 其他略... */
}
</style>
</head>
<body>
<h3>用flex-flow属性同时设置主轴方向和主轴方向的项目布局方式</h3>
<!-- 1.先写好元素 -->
<!-- 1.1.flex容器 -->
<div class="container">
<!-- 1.2.flex容器中的元素, 又叫"项目", 都会被当做行内块元素来处理 -->
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div>
</body>
</html>
5. 设置flex布局主轴方向的项目对齐方式
- 使用justify-content属性完成设置.
- 其值有:
- flex-start:跟主轴的起始线对齐
- flex-end:跟主轴的结束线对齐
- center:主轴方向居中对齐
- space-between:两端对齐: 左右两个项目抵到主轴的起始线和结束线,中间的项目间距平均分
- space-around:分散对齐: 各个项目左右分配的间距相等, 且相邻项目的间距不重叠
- space-evenly:平均对齐: 各个项目左右分配的间距相等, 相邻项目的间距重叠(类似margin)
<!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>
/* 2.设置容器样式 */
.container {
width: 300px;
height: 150px;
}
/* 3.设置项目样式 */
.item {
width: 50px;
height: 50px;
background-color: bisque;
font-size: 1.5rem;
}
/* 4.将容器/父元素设置为flex容器 */
.container {
display: flex;
/* 4.1.主轴以水平方向, 从左到右为例; */
flex-direction: row;
/* 4.2.主轴项目布局以不折行为例 */
flex-wrap: nowrap;
}
/* 5.设置主轴方向的项目对齐形式 */
.container {
/* 跟主轴的起始线对齐, 本例的条件设置,就是左对齐 */
justify-content: flex-start;
/* 跟主轴的结束线对齐, 本例的条件设置,就是右对齐 */
/* justify-content: flex-end; */
/* 主轴方向居中对齐, 本例的条件设置,就是水平居中 */
/* justify-content: center; */
/* 两端对齐: 左右两个项目抵到主轴的起始线和结束线,
中间的项目间距平均分 */
/* justify-content: space-between; */
/* 分散对齐: 各个项目左右分配的间距相等, 且相邻项目的间距不重叠 */
/* justify-content: space-around; */
/* 平均对齐: 各个项目左右分配的间距相等, 相邻项目的间距重叠(类似margin) */
/* justify-content: space-evenly; */
}
</style>
</head>
<body>
<h2>设置flex主轴方向的项目对齐方式</h2>
<div style="margin-bottom: 20px; font-size: small;">
注意:只有flex容器主轴方向上还有剩余空间的时候才有效
</div>
<!-- 1.先写好元素 -->
<!-- 1.1.flex容器 -->
<div class="container">
<!-- 1.2.flex容器中的元素, 又叫"项目", 都会被当做行内块元素来处理 -->
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div>
</body>
</html>
6. 设置flex交叉轴方向的项目对齐方式(单行容器)
- 使用align-items设置单行flex容器交叉轴的项目对齐方式.其值有:
- flex-start:跟交叉轴的起始线对齐
- flex-end:跟交叉轴的结束线对齐
- center:交叉轴方向居中对齐
<!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>
/* 2.设置容器样式 */
.container {
width: 300px;
height: 150px;
}
/* 3.设置项目样式 */
.item {
width: 50px;
height: 50px;
background-color: bisque;
font-size: 1.5rem;
}
/* 4.将容器/父元素设置为flex容器 */
.container {
display: flex;
/* 4.1.主轴以水平方向, 从左到右为例; */
flex-direction: row;
/* 4.2.主轴项目布局以不折行为例 */
flex-wrap: nowrap;
}
/* 5.设置交叉轴方向的项目对齐形式 */
.container {
/* 跟交叉轴的起始线对齐, 本例的条件设置,就是上对齐 */
align-items: flex-start;
/* 跟交叉轴的结束线对齐, 本例的条件设置,就是下对齐 */
/* align-items: flex-end; */
/* 交叉轴方向居中对齐, 本例的条件设置,就是垂直居中 */
/* align-items: center; */
}
</style>
</head>
<body>
<h2>设置flex交叉轴方向的项目对齐方式</h2>
<div style="margin-bottom: 20px; font-size: small;">
注意1:只有flex容器交叉轴方向上还有剩余空间的时候才有效<br />
注意2:只针对flex容器为单行容器有效.即, flex-wrap: nowrap;
</div>
<!-- 1.先写好元素 -->
<!-- 1.1.flex容器 -->
<div class="container">
<!-- 1.2.flex容器中的元素, 又叫"项目", 都会被当做行内块元素来处理 -->
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div>
</body>
</html>
7. 设置flex交叉轴方向的项目对齐方式(多行布局)
- 使用align-content设置多行flex容器交叉轴的项目对齐方式.其值有:
- flex-start:跟交叉轴的起始线对齐
- flex-end:跟交叉轴的结束线对齐
- center:交叉轴方向居中对齐
- space-between:两端对齐: 上下两个项目抵到交叉轴的起始线和结束线,中间的项目间距平均分
- space-around:分散对齐: 各个项目上下分配的间距相等, 且相邻项目的间距不重叠
- space-evenly:平均对齐: 各个项目上下分配的间距相等, 相邻项目的间距重叠(类似margin)
<!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>
/* 2.设置容器样式 */
.container {
width: 100px;
height: 350px;
}
/* 3.设置项目样式 */
.item {
width: 100px;
height: 50px;
background-color: bisque;
font-size: 1.5rem;
}
/* 4.将容器/父元素设置为flex容器 */
.container {
display: flex;
/* 4.1.主轴以水平方向, 从左到右为例; */
flex-direction: row;
/* 4.2.主轴项目布局以折行为例 */
flex-wrap: wrap;
}
/* 5.设置交叉轴方向的项目对齐形式 */
.container {
/* 自动拉伸, 默认的对齐方式(要把.item的height属性(line16)去掉才能看到效果) */
align-content: stretch;
/* 跟交叉轴的起始线对齐, 本例的条件设置,就是上对齐 */
/* align-content: flex-start; */
/* 跟交叉轴的结束线对齐, 本例的条件设置,就是下对齐 */
/* align-content: flex-end; */
/* 交叉轴方向居中对齐, 本例的条件设置,就是垂直居中 */
/* align-content: center; */
/* 交叉轴方向两端对齐, 上下(本例属性设置,交叉轴为垂直方向,所以为上下)两个项目抵到交叉轴的起始线和结束线,
中间的项目间距平均分 */
/* align-content: space-between; */
/* 交叉轴方向分散对齐, 各个项目上下(本例...)分配的间距相等, 且相邻项目的间距不重叠 */
/* align-content: space-around; */
/* 交叉轴方向平均对齐, 各个项目上下(本例...)分配的间距相等, 相邻项目的间距重叠(类似margin) */
/* align-content: space-evenly; */
}
</style>
</head>
<body>
<h2>设置flex交叉轴方向的项目对齐方式</h2>
<div style="margin-bottom: 20px; font-size: small;">
注意1:只有flex容器交叉轴方向上还有剩余空间的时候才有效<br />
注意2:只针对flex容器为多行容器有效.即, flex-wrap为wrap/wrap-reverse时有效;
</div>
<!-- 1.先写好元素 -->
<!-- 1.1.flex容器 -->
<div class="container">
<!-- 1.2.flex容器中的元素, 又叫"项目", 都会被当做行内块元素来处理 -->
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div>
</body>
</html>
8. 设置flex主轴方向的项目排序
- 在flex容器上,使用order属性可以设置所有项目的排序权值.
在项目上,使用order属性可以设置该项目的排序权值.权值可以是正数,0,负数.
<!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>
/* 2.设置容器样式 */
.container {
width: 300px;
height: 150px;
}
/* 3.设置项目样式 */
.item {
width: 100px;
height: 50px;
background-color: bisque;
font-size: 1.5rem;
}
/* 4.将容器/父元素设置为flex容器 */
.container {
display: flex;
/* 4.1.主轴以水平方向, 从左到右为例; */
flex-direction: row;
/* 4.2.设置主轴方向不折行 */
flex-wrap: nowrap;
}
/* 5.设置容器中的项目的默认排序权值(排序规则为:朝主轴布局方向按照排序权值 升序) */
.container {
/* 在容器中设置order值,这样所有.item的order值初始都是0 */
order: 0;
}
/* 6.修改单个项目的order值, 实现项目排序顺序调整 */
/* 6.1.修改第二个.item的order值为2, 根据排序规则, 它就拍到最后了 */
.item:nth-child(2) {
order: 2;
}
/* 6.2.修改第四个.item的order值为-1, 根据排序规则, 它就排在第一个了(-1比0小) */
.item:last-child {
order: -1;
}
</style>
</head>
<body>
<h2>设置flex主轴方向的项目排序</h2>
<div>排序规则为:朝主轴布局方向按照"排序权值(order样式值)"升序排列</div>
<!-- 1.先写好元素 -->
<!-- 1.1.flex容器 -->
<div class="container">
<!-- 1.2.flex容器中的元素, 又叫"项目", 都会被当做行内块元素来处理 -->
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div>
</body>
</html>
9. 设置flex交叉轴方向的某个项目单独的对齐方式
- 就是某个项目的个性化设置.
只针对flex容器为单行容器有意义.即, flex-wrap: nowrap; 多行容器,虽然有些单独样式也有效果,但是好像意义不大(个人测试得出的结论)。
<!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>
/* 2.设置容器样式 */
.container {
width: 300px;
height: 150px;
}
/* 3.设置项目样式 */
.item {
width: 50px;
/* height: 50px; */
background-color: bisque;
font-size: 1.5rem;
}
/* 4.将容器/父元素设置为flex容器 */
.container {
display: flex;
/* 4.1.主轴以水平方向, 从左到右为例; */
flex-direction: row;
/* 4.2.主轴项目布局以不折行为例 */
flex-wrap: nowrap;
/* 4.3.设置各项目默认跟交叉轴的起始线对齐, 本例的条件设置,就是上对齐 */
align-items: flex-start;
}
/* 5.设置交叉轴方向的某个项目单独的对齐形式 */
/* 5.1.第一个项目拉伸显示(要记得把.item的height属性去掉, 或设置为iherit) */
.item:first-child {
align-self: stretch;
}
/* 5.2.第二个项目在交叉轴方向居中/靠交叉轴结束线显示 */
.item:nth-child(2) {
/* 居中 */
align-self: center;
/* 靠结束线 */
/* align-self: flex-end; */
}
/* 5.3.第三个项目设置为自动 */
.item:nth-child(3) {
align-self: auto;
}
</style>
</head>
<body>
<h2>设置flex交叉轴方向的某个项目单独的对齐方式</h2>
<div style="margin-bottom: 20px; font-size: small;">
注意1:只有flex容器交叉轴方向上还有剩余空间的时候才有效<br />
注意2:只针对flex容器为单行容器有意义.即, flex-wrap: nowrap; 多行容器,虽然有些单独样式也有效果,但是好像意义不大。
</div>
<!-- 1.先写好元素 -->
<!-- 1.1.flex容器 -->
<div class="container">
<!-- 1.2.flex容器中的元素, 又叫"项目", 都会被当做行内块元素来处理 -->
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div>
</body>
</html>
10. 设置flex主轴方向的项目放大因子
当所有项目在主轴上的长度之和小于容器在主轴上的长度时,可以通过放大因子(flex-grow属性)来计算每个项目拉伸的长度.
<!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>
/* 2.设置容器样式 */
.container {
width: 300px;
height: 150px;
}
/* 3.设置项目样式 */
.item {
width: 50px;
height: 50px;
background-color: bisque;
font-size: 1.5rem;
/* 3.1.设置项目默认不放大(initial或0) */
flex-grow: 0;
}
/* 4.将容器/父元素设置为flex容器 */
.container {
display: flex;
/* 4.1.主轴以水平方向, 从左到右为例; */
flex-direction: row;
/* 4.2.主轴项目布局以不折行为例 */
flex-wrap: nowrap;
/* 4.3.设置项目默认跟主轴的起始线对齐, 本例的条件设置,就是左对齐 */
justify-content: flex-start;
}
/* 5.设置主轴方向的各个项目的放大因子 */
/* 5.1.设置第一个项目的放大因子是1 */
.item:first-child {
flex-grow: 1;
}
/* 5.2.设置第二个项目的放大因子是2 */
.item:nth-child(2) {
flex-grow: 2;
}
/* 5.3.设置最后一个项目的放大因子是3 */
.item:last-child {
flex-grow: 3;
}
/*
5.4.计算:
没放大前,每个项目的宽度是50px,flex容器主轴长度(本例设置,指width)为300px,
则,可供放大填充的剩余空间是:300-50*3=150px;
每个项目获取的放大空间是:(可供放大填充的剩余空间/所有项目放大因子之和)*当前项目放大因子
则,第一个项目获取的放大空间是:(150px/(1+2+3))*1 = 25px;
第二个项目获取的放大空间是:(150px/(1+2+3))*2 = 50px;
第三个项目获取的放大空间是:(150px/(1+2+3))*3 = 75px;
因此,放大后,第一个项目在主轴上的长度(本例设置,指width)为:50+25=75px;
第二个项目在主轴上的长度(本例设置,指width)为:50+50=100px;
第三个项目在主轴上的长度(本例设置,指width)为:50+75=125px;
*/
</style>
</head>
<body>
<h2>设置flex主轴方向的项目放大因子</h2>
<div style="margin-bottom: 20px; font-size: small;">
注意:只有flex容器主轴方向上还有剩余空间的时候才有效
</div>
<!-- 1.先写好元素 -->
<!-- 1.1.flex容器 -->
<div class="container">
<!-- 1.2.flex容器中的元素, 又叫"项目", 都会被当做行内块元素来处理 -->
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
</body>
</html>
11. 设置flex主轴方向的项目收缩因子
- 当所有项目在主轴上的长度之和大于容器在主轴上的长度时,可以通过缩小因子(flex-shrink属性)来计算每个项目缩放的长度.
<!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>
/* 2.设置容器样式 */
.container {
width: 180px;
height: 150px;
}
/* 3.设置项目样式 */
.item {
width: 100px;
height: 50px;
background-color: bisque;
font-size: 1.5rem;
/* 3.1.设置项目默认不收缩 */
flex-shrink: 0;
}
/* 4.将容器/父元素设置为flex容器 */
.container {
display: flex;
/* 4.1.主轴以水平方向, 从左到右为例; */
flex-direction: row;
/* 4.2.主轴项目布局以不折行为例 */
flex-wrap: nowrap;
/* 4.3.设置项目默认跟主轴的起始线对齐, 本例的条件设置,就是左对齐 */
justify-content: flex-start;
}
/* 5.设置主轴方向的各个项目的收缩因子 */
/* 5.1.设置第一个项目的收缩因子是1 */
.item:first-child {
flex-shrink: 1;
}
/* 5.2.设置第二个项目的收缩因子是2 */
.item:nth-child(2) {
flex-shrink: 2;
}
/* 5.3.设置最后一个项目的收缩因子是3 */
.item:last-child {
flex-shrink: 3;
}
/*
5.4.计算:
没收缩前,每个项目的宽度是100px,flex容器主轴长度(本例设置,指width)为180px,
则,可供收缩的剩余空间是:100*3 - 180 = 120px;
每个项目获取的收缩空间是:(可供收缩的剩余空间/所有项目收缩因子之和)*当前项目收缩因子
则,第一个项目获取的收缩空间是:(120px/(1+2+3))*1 = 20px;
第二个项目获取的收缩空间是:(120px/(1+2+3))*2 = 40px;
第三个项目获取的收缩空间是:(120px/(1+2+3))*3 = 60px;
因此,收缩后,第一个项目在主轴上的长度(本例设置,指width)为:100-20=80px;
第二个项目在主轴上的长度(本例设置,指width)为:100-40=60px;
第三个项目在主轴上的长度(本例设置,指width)为:100-60=40px;
*/
</style>
</head>
<body>
<h2>设置flex主轴方向的项目收缩因子</h2>
<div style="margin-bottom: 20px; font-size: small;">
注意:只有flex容器主轴方向上空间不足的时候才有效
</div>
<!-- 1.先写好元素 -->
<!-- 1.1.flex容器 -->
<div class="container">
<!-- 1.2.flex容器中的元素, 又叫"项目", 都会被当做行内块元素来处理 -->
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
</body>
</html>
12. 设置flex项目在主轴方向所占的长度
- 假设主轴为水平方向,则影响项目宽度的属性优先级为:max-width/min-width > flex-basis > width;
假设主轴为垂直方向,影响项目高度的属性优先级是否为:max-height/min-height > flex-basis > height,需要自己另写demo来验证.
<!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>
/* 2.设置容器样式 */
.container {
width: 300px;
height: 150px;
}
/* 3.设置项目样式 */
.item {
width: 50px;
height: 50px;
background-color: bisque;
font-size: 1.5rem;
}
/* 4.将容器/父元素设置为flex容器 */
.container {
display: flex;
/* 4.1.主轴以水平方向, 从左到右为例; */
flex-direction: row;
/* 4.2.主轴项目布局以折行为例 */
flex-wrap: wrap;
/* 4.3.设置各项目默认跟交叉轴的起始线对齐, 本例的条件设置,就是上对齐 */
align-items: flex-start;
}
/* 5.设置主轴方向所占的长度(可以每个.item单独设置,本例采用统一设置) */
.item {
/* 5.1.flex-basis值为auto时, 本例而言,在主轴所占长度=.item的width */
flex-basis: auto;
/* 5.2.值为像素值时,主轴所占长度=70px,将忽略.item的width */
flex-basis: 70px;
/* 5.3.值为百分比时,主轴所占长度=20%*flex容器主轴方向的长度(本例为width)
即:20%*300=60px */
flex-basis: 20%;
/* 5.4.值为倍数时,(rem)是跟根元素(html)的font-size数值的倍数 */
flex-basis: 5rem;
/* 5.5.当设置了min-width/max-width时,若flex-basis的计算值不在min-width或max-width
范围内,则以min-width/max-width值为主. (若主轴在垂直方向,应该是min-height/max-height?) */
/* max-width:100px;*/
/* 超过max-width了,以100px显示 */
/* flex-basis: 150px; */
/* 5.6.结论: 在flex容器中,项目的属性优先级(应该是主轴为水平方向时吧?):max-width/min-width > flex-basis > width*/
}
</style>
</head>
<body>
<h2>设置flex主轴方向所占的长度</h2>
<!-- 1.先写好元素 -->
<!-- 1.1.flex容器 -->
<div class="container">
<!-- 1.2.flex容器中的元素, 又叫"项目", 都会被当做行内块元素来处理 -->
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div>
</body>
</html>
13. 使用项目的flex属性同时设置放大因子,缩小因子和主轴长度
- 使用flex属性同时设置3个属性.
<!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>
/* 2.设置容器样式 */
.container {
width: 300px;
height: 150px;
}
/* 3.设置项目样式 */
.item {
width: 50px;
height: 50px;
background-color: bisque;
font-size: 1.5rem;
}
/* 4.将容器/父元素设置为flex容器 */
.container {
display: flex;
/* 4.1.主轴以水平方向, 从左到右为例; */
flex-direction: row;
/* 4.2.主轴项目布局以折行为例 */
flex-wrap: wrap;
/* 4.3.设置各项目默认跟交叉轴的起始线对齐, 本例的条件设置,就是上对齐 */
align-items: flex-start;
}
/* 5.使用项目的flex属性同时设置放大因子,缩小因子和主轴长度 */
.item {
/* ### 1.3 单值语法
| 序号 | 属性值 | 描述 |
| ---- | -------- | ----------------------- |
| 1 | 整数 | `flex-grow` |
| 2 | 有效宽度 | `flex-basis` |
| 3 | 关键字 | `initial | auto | none` |
举例:
| 序号 | 案例 | 描述 |
| ---- | ------------- | ----------------- |
| 1 | `flex: 1` | `flex: 1 1 auto` |
| 2 | `flex: 180px` | `flex: 1 1 180px` |
| 3 | `initial` | `flex: 0 1 auto` |
| 4 | `auto` | `flex: 1 1 auto` |
| 5 | `none` | `flex: 0 0 auto` | */
/* 三值 */
/* flex 放大因子 缩小因子 主轴上的长度 */
/* 放大因子:1;缩放因子:1;主轴上的长度:100px(有放大因子和缩放因子,似乎主轴上的长度没有用了) */
flex: 1 1 100px;
/* 大:不放大;小:不缩放;主轴上的长度=width(主轴为水平时) */
flex: 0 0 auto;
/* 两值 */
/* flex 放大因子 主轴上的长度 */
flex: 0 120px;
/* 单值 */
/* 等效于flex: 0 0 0px?四个项目宽度只有标号宽度了 */
flex: 0;
/* 等效于flex: 1 1 auto */
flex: 1;
}
</style>
</head>
<body>
<h2>使用项目的flex属性同时设置放大因子,缩小因子和主轴长度</h2>
<!-- 1.先写好元素 -->
<!-- 1.1.flex容器 -->
<div class="container">
<!-- 1.2.flex容器中的元素, 又叫"项目", 都会被当做行内块元素来处理 -->
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div>
</body>
</html>
14. 学习心得
- flex容器之前没有接触过,本节课的学习过后,发现flex真的让人眼前一亮,原来HTML布局可以这样这样爽,滚TM的浮动/定位.
- 用flex容器做布局,除开代码量少外,个人感觉是还有个特点,就是方便阅读.使用了浮动,特别是定位,有时要找半天,他的布局代码在哪里.
- 疑问:flex和grid布局是未来HTML布局的趋势吗?讲来会不会完全代替浮动/定位?浮动个人觉得真的太讨厌了,能不用尽量不用那种.