Flex弹性布局
1. 弹性布局概念
弹性布局:Flexible Box 模型,通常被称为 flexbox(弹性盒子),主要用来为盒模型提供最大的灵活性,以便我们更好的实现多种响应式的页面布局,任何一个容器都可以指定为 flexbox(弹性盒子)
- 主轴:在弹性布局中,我们会通过属性规定水平/垂直方向为主轴,默认水平方向为主轴。
- 交叉轴:与主轴垂直的另一方向,称为交叉轴。
2. 弹性布局的使用
2.1 开启弹性布局
在使用弹性布局之前,需要弹性布局的元素的父容器添加display:flex; 属性,即可使容器内容采用弹性布局显示,默认从左到右。
开启弹性布局前:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
/* 一般弹性布局一般用在卡片的布局之类或者手机底部导航栏布局 */
.box {
height: 150px;
border: 1px solid black;
}
.box>div {
width: 150px;
border: 1px solid red;
text-align: center;
}
</style>
</head>
<body>
<div class="box">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</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>Document</title>
<style>
/* 一般弹性布局一般用在卡片的布局之类或者手机底部导航栏布局 */
.box {
height: 150px;
border: 1px solid black;
display: flex;
}
.box>div {
width: 150px;
border: 1px solid red;
text-align: center;
}
</style>
</head>
<body>
<div class="box">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
</div>
</body>
</html>
注意事项:
1. 弹性布局需在需要左右排列的元素的父容器中开启
2. 弹性布局默认是沿着主轴方向排列(主轴方向默认为水平向右的方向)
3. 如果当前弹性布局内的元素没有设置宽高,则开启弹性布局后默认高度会等同于当前父容器的高度,如果已经预设好高度,那么元素宽高就不会受父容器影响
让元素左右排列的方法:
- 将元素转化成行内块元素 display: inline-block;(行内块元素之间由于会默认保留一位换行符,所以会导致有一个间隙)
- 使用float浮动属性(浮动会导致高度塌陷的问题)
- 使用弹性布局
2.2 弹性布局的排列方式
flex-direction:
- row(默认主轴以水平方向排列)
- row-reverse(主轴以水平方向排列,起点在右侧)
- column(主轴以垂直方向排列)
- column-reverse(主轴以垂直方向排列,起点在底部)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.box{
border: 1px solid black;
/* 在父容器里设置弹性布局 */
display: flex;
/* 由于弹性布局元素始终会沿着主轴方向排列,则想要更改排列方式,就需要改变此时主轴的方向*/
/* flex-direction 更改弹性布局中元素的排列方式 */
flex-direction: row;
flex-direction: row-reverse;
flex-direction: column;
flex-direction: column-reverse;
}
.box>div{
width: 150px;
height: 150px;
/* 文本居中 */
text-align: center;
line-height: 150px;
border: 1px solid red;
}
</style>
</head>
<body>
<div class="box">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
</div>
</body>
</html>
2.3 弹性布局的换行方式
当容器的大小不足以容纳子元素的大小时,元素的大小就会变形。
flex-wrap:
- nowrap(默认,不换行)
- wrap(换行)
- wrap-reverse(换行,第一行在下面)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.box{
border: 1px solid black;
display: flex;
flex-wrap: nowrap;
flex-wrap: wrap;
flex-wrap: wrap-reverse;
}
.box>div{
width: 150px;
height: 150px;
border: 1px solid red;
text-align: center;
line-height: 150px;
}
</style>
</head>
<body>
<div class="box">
<!-- div{$}*12 -->
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
<div>8</div>
<div>9</div>
<div>10</div>
<div>11</div>
<div>12</div>
</div>
</body>
</html>
左浮动和行内块元素布局时,当元素宽度之和超过容器的宽度时会自动换行。
2.4 弹性布局的对齐方式
主轴对齐方式:
justify-content:
- flex-start(默认以主轴起点方向对齐)
- flex-end(主轴终点方向对齐)
- center(主轴中心点居中对齐)
- space-between(主轴两端对齐,元素之间间距相等)
- space-around(元素之间间距相等,元素之间的间距比元素与边界之间的间距大一倍)
交叉轴对齐方式:
align-items:
- 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>Document</title>
<style>
.box {
height: 600px;
border: 1px solid black;
display: flex;
justify-content: space-around;
align-items: center;
}
.box>div {
width: 150px;
height: 150px;
border: 1px solid red;
/* 通过弹性布局将元素内的文本居中到正中心 */
/* 开启弹性布局 */
display: flex;
/* 设置主轴居中 */
justify-content: center;
/* 设置交叉轴居中 */
align-items: center;
}
</style>
</head>
<body>
<div class="box">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</div>
</body>
</html>
2.5 弹性布局的空间分配
- flex-grow:剩余空白部分的分配,如果有5个元素,元素都设置flex-grow:1,那么元素将等分空白部分(均分到空白部分的1/5)。如果只有一个元素设置flex-grow:2,其他元素都设置flex-grow:1,那么前者将分配到空白部分2/5的区域。
- align-self:单独设置元素的垂直方向上的对齐方式(左对齐、右对齐、居中)。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.box {
height: 600px;
border: 1px solid black;
display: flex;
}
.box>div {
width: 150px;
height: 150px;
border: 1px solid red;
/* 通过弹性布局设置文本居中 */
display: flex;
/* 主轴居中 */
justify-content: center;
/* 交叉轴居中 */
align-items: center;
}
.box>div:nth-of-type(1) {
flex-grow: 2;
/* align-self 单独设置弹性布局元素在交叉轴方向的对齐方式 */
/* flex-start 以交叉轴方向的起点位置对齐 */
align-self: flex-start;
}
.box>div:nth-of-type(2) {
flex-grow: 1;
/* center 以交叉轴方向居中的位置对齐*/
align-self: center;
}
.box>div:nth-of-type(3) {
flex-grow: 1;
/* flex-end 以交叉轴方向的重点位置对齐 */
align-self: flex-end;
}
</style>
</head>
<body>
<div class="box">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
</body>
</html>
2.6 网页标题图标的设置
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
网页标题图标支持png、jpg、icon、gif图等图片格式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="shortcut icon" href="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fku.90sjimg.com%2Felement_origin_min_pic%2F18%2F07%2F23%2F8e2560169476aaa4c82dffde6c995de6.jpg&refer=http%3A%2F%2Fku.90sjimg.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1616916838&t=edac965efeacfafac7aea6e3cbb65cdf" type="image/x-icon">
</head>
<body>
</body>
</html>