第一章:移动端的特点
1.1 移动端和 PC 端网页的不同点
- PC 端网页:
- 移动端网页:
- PC 端网页和移动端网页的不同:
- ① PC 端屏幕
大
,网页固定版心
。 - ② 手机屏幕
小
,网页宽度多为100%
。
- ① PC 端屏幕
1.2 分辨率
1.2.1 屏幕尺寸
- 屏幕尺寸:屏幕
对角线
的长度,一般用英寸
来度量。
1.2.2 分辨率
- PC 分辨率:
- 1920 * 1080
- 1366 * 768
- ……
- 缩放 150 %:
- (1920 / 150%) * (1080 / 150%)
总结:
- 硬件分辨率(出厂设置)。
- 缩放调节分辨率(软件设置)。
- 所以,分辨率分为两类:
物理分辨率
:生产屏幕时就固定的,不可改变。逻辑分辨率
:由软件(驱动)决定的。
注意:制作网页参考的是逻辑分辨率。
- 移动端主流设备分辨率:
1.3 视口
- 默认情况下,网页的宽度和逻辑分辨率是不同的,在移动端中,网页的宽度是 980 px。
- 在移动 WEB 开发中,我们可以添加视口标签,使得网页的宽度和逻辑分辨率相同。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<!-- 视口标签 -->
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<title>Title</title>
</head>
<body>
</body>
</html>
1.4 二倍图
- 在移动 WEB 开发中,如果以 iPhone 6、7、8 为例,设备宽度是 375px ,如果将一张宽度是 375 px 的图片放到移动设备中,图片会模糊,所以设计师在设计的时候,会将图片的宽度设置为 750 px ,这样可以保证不失真。
- 在 PXCook 中测量二倍图中元素的尺寸。
第二章:Flex 布局
2.1 概念
- Flex 布局,也称弹性布局,有如下的特点:
- 是一种
浏览器提倡
的布局模型
。 - 布局网页
更简单、灵活
。 - 可以避免
浮动脱标
的问题。
- 是一种
- Flex 的作用:
- 基于 Flex 精确灵活控制块级盒子的布局方式,
避免浮动布局中脱离文档流的现象产生
。 - Flex 布局非常适合结构化布局。
- 基于 Flex 精确灵活控制块级盒子的布局方式,
- 设置方式:父元素添加
display:flex;
,子元素可以自动的挤压或拉伸。 - 组成部分:
- 弹性容器。
- 弹性盒子。
- 主轴。
- 侧轴 / 交叉轴。
- 示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
.box {
/* 视觉效果:子级水平排列。 */
/* 水平排列的原因:默认主轴在水平方向,弹性盒子都是沿着主轴排列的。 */
display: flex;
height: 200px;
border: 1px solid #000;
}
.box div {
width: 100px;
height: 100px;
background-color: pink;
}
</style>
</head>
<body>
<div class="box">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
</body>
</html>
2.2 主轴对齐方式
- 网页中的盒子是有距离的,在 Flex 布局模型中,可以调节
主轴或侧轴
的对齐方式来设置盒子之间的距离。 - 修改主轴对齐方式属性:
justify-content
| 属性值 | 说明 | | —- | —- | | flex-start | 默认值,起点开始依次排列 | | flex-end | 终点开始依次排列 | |center
|沿主轴居中排列
| |space-around
|弹性盒子沿主轴均匀排列,空白间距均分布在弹性盒子两侧
| |space-between
|弹性盒子沿主轴均匀排列,空白间距均分布在相邻盒子之间
| |space-evenly
|弹性盒子沿主轴均匀排列,弹性盒子和容器之间间距相等
|
- 居中效果:
- 示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
.box {
/* 视觉效果:子级水平排列。 */
/* 水平排列的原因:默认主轴在水平方向,弹性盒子都是沿着主轴排列的。 */
display: flex;
/* 居中 */
justify-content: center;
height: 200px;
border: 1px solid #000;
}
.box div {
width: 100px;
height: 100px;
background-color: pink;
}
</style>
</head>
<body>
<div class="box">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
</body>
</html>
- 间距在弹性盒子(子级)之间:
- 示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
.box {
/* 视觉效果:子级水平排列。 */
/* 水平排列的原因:默认主轴在水平方向,弹性盒子都是沿着主轴排列的。 */
display: flex;
/* 居中 */
/*justify-content: center;*/
/* 间距在弹性盒子(子级)之间 */
justify-content: space-between;
height: 200px;
border: 1px solid #000;
}
.box div {
width: 100px;
height: 100px;
background-color: pink;
}
</style>
</head>
<body>
<div class="box">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
</body>
</html>
- 所有弹性盒子(子级)之间的间距都相等:
- 示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
.box {
/* 视觉效果:子级水平排列。 */
/* 水平排列的原因:默认主轴在水平方向,弹性盒子都是沿着主轴排列的。 */
display: flex;
/* 居中 */
/*justify-content: center;*/
/* 间距在弹性盒子(子级)之间 */
/*justify-content: space-between;*/
/* 所有弹性盒子(子级)之间的间距都相等 */
justify-content: space-evenly;
height: 200px;
border: 1px solid #000;
}
.box div {
width: 100px;
height: 100px;
background-color: pink;
}
</style>
</head>
<body>
<div class="box">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
</body>
</html>
- 间距加在弹性盒子(子级)的两侧:
- 示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
.box {
/* 视觉效果:子级水平排列。 */
/* 水平排列的原因:默认主轴在水平方向,弹性盒子都是沿着主轴排列的。 */
display: flex;
/* 居中 */
/*justify-content: center;*/
/* 间距在弹性盒子(子级)之间 */
/*justify-content: space-between;*/
/* 所有弹性盒子(子级)之间的间距都相等 */
/*justify-content: space-evenly;*/
/* 间距加在子级的两侧,视觉效果:自己之间的距离是父级两头距离的 2 倍 */
justify-content: space-around;
height: 200px;
border: 1px solid #000;
}
.box div {
width: 100px;
height: 100px;
background-color: pink;
}
</style>
</head>
<body>
<div class="box">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
</body>
</html>
2.3 侧轴对齐方式
修改侧轴对齐方式属性:
align-items
:添加到弹性容器上
。 | 属性值 | 说明 | | —- | —- | | flex-start | 默认值,起点开始依次排列 | | flex-end | 终点开始依次排列 | |center
| 沿侧轴居中排列 | |stretch
|默认值
,弹性盒子沿着主轴先被拉伸
至铺满容器 |align-self
:控制某个弹性盒子在侧轴的对齐方式,添加到弹性容器上
。
沿侧轴居中排列:
- 示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
.box {
/* 视觉效果:子级水平排列。 */
/* 水平排列的原因:默认主轴在水平方向,弹性盒子都是沿着主轴排列的。 */
display: flex;
align-items: center;
height: 200px;
border: 1px solid #000;
}
.box div {
width: 100px;
height: 100px;
background-color: pink;
}
</style>
</head>
<body>
<div class="box">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
</body>
</html>
- 拉伸:
- 示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
.box {
/* 视觉效果:子级水平排列。 */
/* 水平排列的原因:默认主轴在水平方向,弹性盒子都是沿着主轴排列的。 */
display: flex;
/*align-items: center;*/
/* 拉伸,默认值(现有状态,测试的时候需要去掉子级的高度) */
align-items: stretch;
height: 200px;
border: 1px solid #000;
}
.box div {
width: 100px;
/*height: 100px;*/
background-color: pink;
}
</style>
</head>
<body>
<div class="box">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
</body>
</html>
- 单独设置某个弹性盒子的侧轴对齐方式:
- 示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
.box {
/* 视觉效果:子级水平排列。 */
/* 水平排列的原因:默认主轴在水平方向,弹性盒子都是沿着主轴排列的。 */
display: flex;
/*align-items: center;*/
/* 拉伸,默认值(现有状态,测试的时候需要去掉子级的高度) */
/*align-items: stretch;*/
height: 200px;
border: 1px solid #000;
}
.box div {
width: 100px;
height: 100px;
background-color: pink;
}
/* 单独设置某个弹性盒子的侧轴对齐方式 */
.box div:nth-child(2) {
align-self: center;
}
</style>
</head>
<body>
<div class="box">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
</body>
</html>
2.4 伸缩比
- 伸缩比 flex 属性,其实就是用来设置弹性盒子的尺寸。
- 属性:
flex: 值;
- 取值分类:
- 数值(整数)。
注意:只占用父盒子剩余尺寸。
- 示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
.box {
display: flex;
height: 300px;
border: 1px solid #000;
}
.box div {
height: 200px;
margin: 0 20px;
background-color: pink;
}
.box div:nth-child(1) {
width: 50px;
}
.box div:nth-child(2) {
flex: 1;
}
</style>
</head>
<body>
<div class="box">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
</body>
</html>
2.5 修改主轴方向
- 【问】Flex 布局模型中,弹性盒子模式沿着水平方向排列,那么如何实现内容垂直排列?
- 【答】使用
flex-direction
属性即可。 | 属性值 | 说明 | | —- | —- | | row | 行,水平(默认值) | |column
|列,垂直
| | row-reverse | 行,从右向左 | | column-reverse | 列,从下向上 |
- 修改主轴方向:
- 示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
li {
list-style: none;
}
.box li {
margin: 100px auto;
display: flex;
/* 修改主轴方向:列 */
flex-direction: column;
width: 80px;
height: 80px;
border: 1px solid red;
}
.box img {
width: 32px;
height: 32px;
}
</style>
</head>
<body>
<div class="box">
<ul>
<li>
<img alt="" src="./images/media.png">
<span>媒体</span>
</li>
</ul>
</div>
</body>
</html>
2.6 主轴方向和对齐方式
- 如果主轴方向是水平方向,则水平居中为
justify-content: center;
,垂直居中为align-items: center;
。 如果主轴方向为垂直方向,则水平居中为
align-items: center;
,垂直居中为justify-content: center;
。主轴方向为垂直方向的居中:
- 示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
li {
list-style: none;
}
.box li {
margin: 100px auto;
display: flex;
/* 修改主轴方向:列 */
flex-direction: column;
/* 视觉效果:实现盒子水平居中 */
align-items: center;
/* 视觉效果:实现盒子的垂直居中 */
justify-content: center;
width: 80px;
height: 80px;
border: 1px solid red;
}
.box img {
width: 32px;
height: 32px;
}
</style>
</head>
<body>
<div class="box">
<ul>
<li>
<img alt="" src="./images/media.png">
<span>媒体</span>
</li>
</ul>
</div>
</body>
</html>
2.7 弹性盒子换行
- 实际开发中,我们会遇到像下面的情况:
- 【问】那么,在 Flex 布局中,多个弹性盒子默认是如何显示的?
【答】默认情况下,如果子级的所有宽度之和
<
父级的宽度,那么就一行显示;如果子级的所有宽度之和>
父级的宽度,那么也会一行显示,浏览器会自动计算宽度,让其宽度自动适应。默认情况下的,多个弹性盒子的显示:
- 示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
.box {
display: flex;
height: 500px;
border: 1px solid red;
}
.box div {
width: 100px;
height: 100px;
background-color: pink;
}
</style>
</head>
<body>
<div class="box">
<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>
</body>
</html>
- 可以使用
flex-wrap:wrap;
来使得弹性盒子换行显示。
- 示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
.box {
display: flex;
/* 弹性盒子换行 */
flex-wrap: wrap;
height: 500px;
border: 1px solid red;
}
.box div {
width: 100px;
height: 100px;
background-color: pink;
}
</style>
</head>
<body>
<div class="box">
<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>
</body>
</html>
- 行对齐方式:
align-content
,取值和justify-content
基本相同。 - 示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
.box {
display: flex;
/* 弹性盒子换行 */
flex-wrap: wrap;
/* 行对齐方式 */
align-content: space-around;
height: 500px;
border: 1px solid red;
}
.box div {
width: 100px;
height: 100px;
background-color: pink;
}
</style>
</head>
<body>
<div class="box">
<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>
</body>
</html>