传统布局与flex布局的比较
传统布局
- 兼容性好
- 布局繁琐
- 局限性,不能在移动端很好的布局
flex布局
- 操作方便,布局及其简单
- pc端支持情况较差
- IE11以下的版本 仅部分支持
注意事项
- pc端页面布局 建议使用传统布局
- pc端页面布局 如不考虑兼容性 可使用flex布局
flex布局原理
flex:弹性布局,用来为盒装模型提供最大的灵活性,任何一个容器都可以指定为flex布局
采用flex布局的元素,被称为容器,它的所有子元素会自动成为容器成员,称为flex项目
注意事项
- 当我们的父盒子设为flex布局之后,子元素的float clear 及vertical-align属性将失效
- 伸缩布局 = 弹性布局 = 伸缩盒布局 = 弹性盒布局 = flex布局
原理
通过给父盒子添加flex属性,来控制子盒子的位置和排列方式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>体验flex布局</title>
<style>
* {
margin: 0;
padding: 0;
}
div {
/* 使用flex布局 */
display: flex;
width: 80%;
height: 400px;
margin: 20px auto;
background-color: purple;
justify-content: space-around;
}
div span {
/* 每个子元素占用1等分 */
flex: 1;
height: 60px;
margin-right: 5px;
background-color: yellow;
}
</style>
</head>
<body>
<div>
<span></span>
<span></span>
<span></span>
</div>
</body>
</html>
flex父项属性
flex-direction:设置主轴的方向
在flex布局中,分为主轴和侧轴
默认的主轴是x方向 水平向右
默认的侧轴是y轴 水平向下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>flex-direction</title>
<style>
* {
margin: 0;
padding: 0;
}
div {
/* 设置flex属性 */
display: flex;
width: 1000px;
height: 600px;
margin: 200px auto;
background-color: pink;
/* 设置主轴方向 */
/* flex-direction: row; */
/* flex-direction: row-reverse; */
/* flex-direction: column; */
flex-direction: column-reverse;
}
span {
width: 150px;
height: 150px;
text-align: center;
line-height: 150px;
margin: 5px;
background-color: yellow;
}
</style>
</head>
<body>
<div>
<span>1</span>
<span>2</span>
<span>3</span>
</div>
</body>
</html>
justify-content:设置主轴上子元素的排列方式
使用此属性之前 要确定主轴
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>justify-content</title>
<style>
* {
margin: 0;
padding: 0;
}
div {
/* 使用fiex属性 */
display: flex;
/* 设置主轴上子元素的排列方式 */
justify-content: space-between;
width: 80%;
height: 400px;
margin: 2px auto;
background-color: purple;
}
span {
width: 200px;
height: 200px;
text-align: center;
line-height: 200px;
margin: 20px;
background-color: red;
}
</style>
</head>
<body>
<div>
<span>1</span>
<span>2</span>
<span>3</span>
</div>
</body>
</html>
flex-wrap:控制子元素是否换行
在flex布局中,容器中的子元素是一直不换行的,会一直在一行显示,宽度会变窄。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>flex-wrap</title>
<style>
* {
margin: 0;
padding: 0;
}
div {
/* 设置flex属性 */
display: flex;
/* 设置子元素是否换行 */
flex-wrap: wrap;
width: 80%;
height: 600px;
margin: 20px auto;
background-color: purple;
}
span {
width: 200px;
height: 200px;
text-align: center;
line-height: 200px;
margin: 10px;
background-color: yellow;
}
</style>
</head>
<body>
<div>
<span>1</span>
<span>2</span>
<span>3</span>
<span>4</span>
<span>5</span>
<span>6</span>
<span>7</span>
<span>8</span>
</div>
</body>
</html>
align-items:设置侧轴上子元素的排列方式(适用于单行)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>align-items</title>
<style>
* {
margin: 0;
padding: 0;
}
div {
/* 设置flex布局 */
display: flex;
/* 设置主轴上的对齐方式*/
justify-content: center;
/* 设置侧轴上的对齐方式 */
align-items: center;
width: 80%;
height: 500px;
margin: 20px auto;
background-color: pink;
}
span {
width: 200px;
height: 200px;
border-radius: 50%;
background-color: red;
}
</style>
</head>
<body>
<div>
<span></span>
<span></span>
<span></span>
</div>
</body>
</html>
align-content:设置侧轴上子元素的对齐方式(适合于多行)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>align-content</title>
<style>
* {
margin: 0;
padding: 0;
}
div {
display: flex;
/* 设置主轴上的子元素的对齐方式 */
justify-content: center;
/* 设置侧轴上的子元素的对齐方式 */
align-content: center;
/* 设置换行 */
flex-wrap: wrap;
width: 80%;
height: 600px;
margin: 20px auto;
background-color: purple;
}
span {
width: 150px;
height: 150px;
border-radius: 50%;
background-color: yellow;
}
</style>
</head>
<body>
<div>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
</body>
</html>
align-items与align-content的区别
flex-flow
flex-flow是flex-direction与flex-wrap的复合属性
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>flex-flow</title>
<style>
* {
margin: 0;
padding: 0;
}
div {
display: flex;
/* 设置主轴方向与是否换行 */
flex-flow: row wrap;
/* 设置主轴上的子元素的对齐方式 */
justify-content: center;
/* 设置侧轴上的子元素的对齐方式 */
align-content: center;
width: 80%;
height: 600px;
margin: 20px auto;
background-color: purple;
}
span {
width: 150px;
height: 150px;
border-radius: 50%;
background-color: yellow;
}
</style>
</head>
<body>
<div>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
</body>
</html>
flex子项属性
flex属性
flex属性定义flex容器的子元素占用的分数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>flex属性</title>
<style>
* {
margin: 0;
padding: 0;
}
div {
display: flex;
width: 80%;
height: 600px;
margin: 20px auto;
background-color: purple;
}
span:nth-of-type(1) {
/* flex表示占用的分数 */
flex: 1;
background-color: pink;
}
span:nth-of-type(2) {
/* flex表示占用的分数 */
flex: 2;
background-color: yellow;
}
span:nth-of-type(3) {
/* flex表示占用的分数 */
flex: 1;
background-color: red;
}
</style>
</head>
<body>
<div>
<span></span>
<span></span>
<span></span>
</div>
</body>
</html>
align-self:定义子项在侧轴上的排列方式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>align-self</title>
<style>
* {
margin: 0;
padding: 0;
}
div {
display: flex;
justify-content: center;
width: 80%;
height: 500px;
background-color: pink;
margin: 20px auto;
}
div span {
width: 200px;
height: 200px;
border-radius: 50%;
background-color: yellow;
}
div span:nth-of-type(2) {
/* 定义某个子项可以与其它项目在侧轴上拥有不一样的排列方式 */
align-self: flex-end;
}
</style>
</head>
<body>
<div>
<span></span>
<span></span>
<span></span>
</div>
</body>
</html>
order属性定义子项的排列顺序
数值越小,排名越靠前,默认为0
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>order</title>
<style>
* {
margin: 0;
padding: 0;
}
div {
display: flex;
justify-content: center;
width: 80%;
height: 500px;
background-color: pink;
margin: 20px auto;
}
div span {
width: 200px;
height: 200px;
text-align: center;
line-height: 200px;
border-radius: 50%;
background-color: purple;
}
div span:nth-of-type(2) {
/* 定义子项的排列顺序 值越小 排名越靠前*/
order: -1;
}
</style>
</head>
<body>
<div>
<span>1</span>
<span>2</span>
<span>3</span>
</div>
</body>
</html>
携程网
初始化操作
技术选型
- 采用单独制作移动端页面的案例
- 使用flex布局
搭建文件夹结构
设置视口及引入初始化样式
<meta name="viewport" content="width=device-width, user-scalable=no,initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<link rel="stylesheet" href="css/normalize.css">
<link rel="stylesheet" href="css/index.css">
body设置样式
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;
}
search-index区域
- search-index设置固定定位 由两个div组成
- 1号盒子为search区域 放大镜的技术是由伪元素 精灵图组合而成
- 2号盒子为user区域 用户头像的技术是由伪元素 精灵图组合而成
focus(焦点图)区域
- div嵌套一张图像即可 图像的宽度设置为100%
local-nav(局部导航栏)区域
- div嵌套ul ul嵌套5个li 每个li占1等份 li嵌套a a嵌套两个span
- 图像使用的精灵图技术 可以使用属性选择器更加合适快捷
nav(导航栏)区域
- 大盒子为nav nav嵌套nav-common(导航公共部分) nav-common包含nav-item nav-item包含a标签
- a里面的文字设置水平垂直居中
- 白色的缝隙是由边框组成
sidebar-nav(侧边栏导航)区域
- div嵌套ul ul嵌套li li嵌套a a嵌套span
sell-box(销售)区域
- sell-box由两部分组成
- 1号盒子为sell-hd 里面包含h2与a链接 图像使用的是伪元素选择器
- 2号盒子为sell-bd 里面包含div div包含a a包含img
footer(页脚)区域
- div嵌套ul ul嵌套li li占用1等份 li嵌套span span设置背景图像
copyright(版权)区域
- div嵌套p 设置居中对齐即可
效果图