目录
原理:通过给父盒子添加flex属性,来控制子盒子的位置和排列方式
2) justify-content 设置主轴上的子元素排列方式
4)align-content 设置侧轴上的子元素排列方式(多行)
5)align-item 设置侧轴上的子元素排列方式(单行)
1. flex布局原理
1)flex
flex:flexible box,弹性布局,用来为盒装模型提供最大的灵活性,任何一个容器都可以指定为flex布局。
- 父盒子设置为flex布局之后,子元素的float、clear、vertical- align属性都将失效
- 伸缩布局 = 弹性布局 = 伸缩盒布局 = 弹性盒布局 = flex布局
2)flex container
flex容器(flex container):采用flex布局的元素,简称为容器。它的所有子元素自动成为容器成员,称为flex项目(flex item),简称为项目。
- div就是flex父容器
- span就是子容器的flex项目
- 子容器可以横向排列也可以纵向排列
原理:通过给父盒子添加flex属性,来控制子盒子的位置和排列方式
<style>
div {
/* flex父容器 */
display: flex;
width: 80%;
height: 500px;
background-color: pink;
/* justify-content: space-around; */
}
div span {
width: 200px;
height: 200px;
margin-left: 10px;
background-color: purple;
flex: 1;
}
</style>
</head>
<body>
<div>
<span>1</span>
<span>1</span>
<span>1</span>
</div>
</body>
效果图:
2. flex布局父项常见属性
对父元素设置的属性:
- flex-direction:设置主轴的方向
- justify-content:设置主轴上的子元素排列方式
- flex-wrap:设置子元素是否换行
- align-content:设置侧轴上的子元素的排列方式,多行
- align-items:设置侧轴上的子元素的排列方式,单行
- flex-flow:复合属性,就是同时设置了flex-direction和flex-wrap
主轴和侧轴:行和列、x轴和y轴
- 默认主轴方向就是x轴方向,水平向右
- 默认侧轴方向就是y轴方向,水平向下
1)flex-direction 设置主轴的方向
决定主轴的方向,也就是项目的排列方向
2) justify-content 设置主轴上的子元素排列方式
定义了项目在主轴上的对齐方式,使用之前要确定主轴是哪个
3)flex-wrap 设置子元素是否换行
默认情况下,项目都是排在一条线(轴线)上的。flex布局默认是不换行的
4)align-content 设置侧轴上的子元素排列方式(多行)
设置子项在侧轴上的排列方式并且只能用于子项出现换行(flex-wrap:wrap;)的情况(多行),在单行下是没有效果的
5)align-items 设置侧轴上的子元素排列方式(单行)
控制子项在侧轴(默认是y轴)上的排列方式,在子项为单项的时候使用
6)flex-flow
flex-direction和flex-wrap的复合写法
flex-flow: row wrap;
<style>
div {
/* flex父容器 */
display: flex;
width: 80%;
height: 500px;
background-color: pink;
/* flex-direction 设置主轴的方向 */
/* 1.默认主轴的方向是row、行、x轴->横向排列,从左到右 */
flex-direction: row;
/* 2.翻转,主轴的方向是x轴反方向,从右到左 */
/* flex-direction: row-reverse; */
/* 3.主轴的方向是column、列、y轴->纵向排列,从上到下 */
/* flex-direction: column; */
/* 4.翻转,主轴的方向是y轴反方向,从下到上 */
/* flex-direction: column-reverse; */
/* justify-content 设置主轴上的项目排列方式 */
/* 1.默认为从头开始,主轴是x轴的话则为从左到右排列 */
justify-content: start;
/* 2.从尾部开始排列,最后一个子元素贴着右边框 */
/* justify-content: end; */
/* 3.居中对齐 */
/* justify-content: center; */
/* 4.平分剩余的空间 */
/* justify-content: space-around; */
/* 5.线两边贴边,然后再平分剩余的空间 */
/* justify-content: space-between; */
/* flex-wrap 设置子元素是否换行 */
/* 1.项目默认是不换行的,如果装不下这些项目,就会自动缩小项目的宽度放到轴线上 */
/* flex-wrap: nowrap; */
/* 2.换行 */
flex-wrap: wrap;
/* align-item 设置侧轴上的项目排列方式(单行) */
/* 1.从上到下 */
/* align-items: start; */
/* 2.从下到上 */
/* align-items: end; */
/* 3.垂直居中 */
/* align-items: center; */
/* 4.默认,拉伸,但是子元素一般不给高度才拉伸 */
align-items: stretch;
/* align-content 设置侧轴上的项目排列方式(多行) */
/* 1.默认,在侧轴的头部开始排列 */
align-content: start;
/* 2.在侧轴的尾部开始排列 */
/* align-content: end; */
/* 3.在侧轴中间显示 */
/* align-content: center; */
/* 4.在侧轴平分剩余空间 */
/* align-content: space-around; */
/* 5.先分布在两头,然后平分剩余的空间 */
/* align-content: space-between; */
/* 6.子项没有高度,自行设置子项元素高度来平分父元素高度 */
/* align-content: stretch; */
}
div span {
width: 200px;
height: 200px;
background-color: purple;
}
</style>
</head>
<body>
<div>
<span>1</span>
<span>2</span>
<span>3</span>
<span>4</span>
<span>5</span>
<span>6</span>
</div>
</body>
3. flex布局子项常见元素
- flex:子项目占的份数
- align-self:控制子项自己在侧轴的排列方式
- order:定义子项的排列顺序
1)flex属性 子项目分配剩余空间
定义子项目分配剩余空间,用flex来表示占多少份数
<style>
div {
display: flex;
width: 60%;
height: 300px;
background-color: pink;
margin: 0 auto;
}
div span:nth-child(1) {
width: 100px;
background-color: red;
}
div span:nth-child(2) {
/* 中间剩余的份数平分为1,即占了中间所有的部分 */
flex: 1;
background-color: green;
}
div span:nth-child(3) {
width: 100px;
background-color: blue;
}
section {
display: flex;
width: 60%;
height: 300px;
background-color: pink;
margin: 0 auto;
}
section span {
/* 三等分 */
flex: 1;
}
section span:nth-child(2) {
/* 占1/2 */
flex: 2;
}
</style>
</head>
<body>
<div>
<span>1</span>
<span>2</span>
<span>3</span>
</div>
<section>
<span>1</span>
<span>2</span>
<span>3</span>
</section>
</body>
效果图:
2)align-self 控制子项目自己在侧轴上的排列方式
允许单个项目有与其他项目不一样的对齐方式,可以覆盖align-items属性
默认值为auto,表示继承父元素的align-items属性,如果没有父元素就=stretch
<style>
div {
display: flex;
width: 80%;
height: 200px;
background-color: pink;
}
div span {
width: 100px;
height: 100px;
background-color: purple;
margin-right: 10px;
}
div span:nth-child(3) {
/* 对齐方式与align-items不同,可以覆盖 */
align-self: end;
}
</style>
</head>
<body>
<div>
<span>1</span>
<span>2</span>
<span>3</span>
</div>
</body>
效果图:
3)order 定义项目的排列顺序
数值越小,排列越靠前,默认是0
<style>
div {
display: flex;
width: 80%;
height: 200px;
background-color: pink;
}
div span {
width: 100px;
height: 100px;
background-color: purple;
margin-right: 10px;
}
div span:nth-child(3) {
/* 对齐方式与align-items不同,可以覆盖 */
align-self: end;
/* 默认为0,越小越靠前 */
order: -1;
}
</style>
</head>
<body>
<div>
<span>1</span>
<span>2</span>
<span>3</span>
</div>
</body>
效果图: