Skip to content

1.flex布局体验

1.1 传统布局与flex布局

  1. 传统布局
  • 兼容性好
  • 布局繁琐
  • 局限性,不能再移动端很好的布局
  1. flex 弹性布局
  • 操作方便,布局极为简单,移动端应用很广泛
  • PC 端浏览器支持情况较差
  • IE 11或更低版本,不支持或仅部分支持

建议:

  1. 如果是PC端页面布局,我们还是传统布局。
  2. 如果是移动端或者不考虑兼容性问题的PC端页面布局,我们还是使用flex弹性布局

1.2 初体验

目标效果:
img_13.png

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>

img_14.png

2.flex布局原理

flex是flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性,任何一个容器都可以 指定为 flex 布局。

  • 当我们为父盒子设为 flex 布局以后,子元素的 float、clear 和 vertical-align 属性将失效。
  • 伸缩布局 = 弹性布局 = 伸缩盒布局 = 弹性盒布局 =flex布局

采用Flex布局的元素,称为Flex容器(flex container),简称"容器"。它的所有子元素自动成为容器成员,称为 Flex 项目(flex item),简称"项目"。

  • 体验中 div 就是 flex父容器。
  • 体验中 span 就是 子容器 flex项目
  • 子容器可以横向排列也可以纵向排列

总结flex布局原理:

  1. 就是通过给父盒子添加flex属性,来控制子盒
  2. 子的位置和排列方式

img_15.png

3.flex布局父项常见属性

3.1 常见父项属性

属性作用常用值说明
display定义容器为Flex布局flexinline-flex必须设置的属性,将容器设为Flex布局模式
flex-direction设置主轴方向rowrow-reverse
columncolumn-reverse
决定项目的排列方向
flex-wrap设置项目是否换行nowrapwrapwrap-reverse控制单行/多行布局
flex-flowflex-direction和flex-wrap的简写<flex-direction> <flex-wrap>复合属性,推荐使用简写
justify-content设置项目在主轴上的对齐方式flex-startflex-end
centerspace-between
space-aroundspace-evenly
水平对齐(主轴方向)
align-items设置项目在交叉轴上的对齐方式stretchflex-start
flex-endcenter
baseline
垂直对齐(交叉轴方向)
align-content设置多根轴线的对齐方式stretchflex-start
flex-endcenter
space-betweenspace-around
多行布局时才有效

3.2 flex-direction设置主轴的方向

  1. 主轴与侧轴 在 flex 布局中,是分为主轴和侧轴两个方向,同样的叫法有: 行和列、x轴和y轴
  • 默认主轴方向就是 x 轴方向,水平向右
  • 默认侧轴方向就是 y 轴方向,水平向下 img_16.png
  1. 属性值 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-contentalign-items区别

  • align-items 适用于单行情况下, 只有上对齐、下对齐、居中和 拉伸
  • align-content 适应于换行(多行)的情况下(单行情况下无效), 可以设置 上对齐、 下对齐、居中、拉伸以及平均分配剩余空间等属性值。
  • 总结就是单行找 align-items 多行找 align-content img_17.png

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的分享
  1. 技术选型 方案:我们采取单独制作移动页面方案 技术:布局采取flex布局
  2. 搭建相关文件夹结构 img_18.png
  3. 设置视口标签以及引入初始化样式
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>
  1. 常用初始化样式
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;
}
  1. 常见命名模块 img_19.pngimg_20.png

  2. 常见flex布局思路 img_21.png

  3. 背景线性渐变 img_22.png

html
background: linear-gradient(起始方向, 颜色1, 颜色2, ...);
background: -webkit-linear-gradient(left, red , blue);
background: -webkit-linear-gradient(left top, red , blue);

背景渐变必须添加浏览器私有前缀 起始方向可以是: 方位名词 或者 度数 , 如果省略默认就是 top

Released under the MIT License.