目录:
- 目标
- 小技巧
- 实现
- 最终代码
一、目标:我们要做一个手机版本的淘宝网,蓝色框住的按钮这部分。
二、 小技巧:如何在网页上看手机版本的页面
- 首先在网页上打开淘宝网,然后按F12,进入调试状态;(mac电脑要按出F12 - 长按fn - bar条上就自动显示F1 - F12 - 然后在点击)
- 点击这个类似pad按钮,就可以切换成手机版本 -》 然后切换下成手机如iphone12 pro或者其他 -》 然后再点击顶部的刷新按钮 -》 接下来页面就会变成手机版的页面。 -》 观察你要做的页面;
三、实现
1.准备工作 - 搭骨架
先后顺序分别是:
- 最外层容器nav;
- 两行nav-inner;
- 每行里面的按钮item;
<!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>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
/* 设置外层容器 */
/* 因为两行div本身就是垂直排列,所以不用把nav设置成弹性容器,所以不用管nav */
.nav{
/* 外层容器和屏幕是一样宽的,当然不写也一样 */
width: 100%;
}
/* 设置每一行的容器 */
/* nav-inner 里面的div元素因为需要横向排列,直接把他设置为弹性容器 */
.nav-inner{
display: flex;
}
</style>
</head>
<body>
<!-- 创建一个最外层容器 -->
<nav class="nav">
<!-- 第一行行按钮 -->
<div class="nav-inner">
<!-- 单个按钮 -->
<div class="item">
<a href="#">
<img src="img/16/1.png">
</a>
</div>
<div class="item">
<a href="#">
<img src="img/16/2.png">
</a>
</div>
<div class="item">
<a href="#">
<img src="img/16/3.png">
</a>
</div>
<div class="item">
<a href="#">
<img src="img/16/4.png">
</a>
</div>
<div class="item">
<a href="#">
<img src="img/16/5.png">
</a>
</div>
</div>
<!-- 第二行行按钮 -->
<div class="nav-inner">
<!-- 单个按钮 -->
<div class="item">
<a href="#">
<img src="img/16/6.png">
</a>
</div>
<div class="item">
<a href="#">
<img src="img/16/7.png">
</a>
</div>
<div class="item">
<a href="#">
<img src="img/16/8.png">
</a>
</div>
<div class="item">
<a href="#">
<img src="img/16/9.png">
</a>
</div>
<div class="item">
<a href="#">
<img src="img/16/10.png">
</a>
</div>
</div>
</nav>
</body>
</html>
2.优化
缺陷:我们发现即使在外层容器nav,设置了width:100%,右侧依然也有空白。
-这是因为我们设置了nav-inner 为弹性容器后,默认是没有弹性增长系数。 flex-grow 和flex可以去设置。
解决代码:
/* 设置弹性元素 - 按钮 */
.item{
background-color: #bfa;
/* 设置了这个后,里面元素会随着视口的宽度改变而自动改变,撑满 */
flex:auto;
}
3.优化item图片样式
缺陷:目前我们的item图片图标,过大,而且随视口大小的变化,也很大。item与item之间没有间隙。
- 这是因为我们设置了flex:auto; 会弹性增长来占空白区域,item对应被拉大。
解决代码:(步骤是按照1,2,3,4来操作的)
/* 设置每一行的容器 */
.nav-inner{
/* 设置为弹性容器 */
display: flex;
/* 4. 设置主轴上的空白分布 */
justify-content: space-around;
}
/* 设置弹性元素 - 按钮 */
.item{
background-color: #bfa;
/*3. 一定要注释这句 */
/* flex:auto; */
/*2. 固定下item的宽度比例,让用户拖动改变视口时,图标大小都差不多符合视觉
*/
/*这个值越小,item与item之间间隙空间越大
*/
width:18%;
}
/* 防止图片撑大 */
.item img{
/* 1. 设置图片的宽度和父元素的宽度一样,所以设置width:100% */
width:100%;
}
- item把背景颜色也去掉,最终的代码效果:
.nav-inner{
display: flex;
justify-content: space-around;
}
.item{
width:18%;
}
.item img{
width:100%;
}
4. 图标下的添加文字span
<body>
<!-- 创建一个最外层容器 -->
<nav class="nav">
<!-- 第一行行按钮 -->
<div class="nav-inner">
<!-- 单个按钮 -->
<div class="item">
<a href="#">
<img src="img/16/1.png">
<span>天猫</span>
</a>
</div>
<div class="item">
<a href="#">
<img src="img/16/2.png">
<span>聚划算</span>
</a>
</div>
<div class="item">
<a href="#">
<img src="img/16/3.png">
<span>天猫国际</span>
</a>
</div>
<div class="item">
<a href="#">
<img src="img/16/4.png">
<span>外卖</span>
</a>
</div>
<div class="item">
<a href="#">
<img src="img/16/5.png">
<span>天猫超市</span>
</a>
</div>
</div>
<!-- 第二行行按钮 -->
<div class="nav-inner">
<!-- 单个按钮 -->
<div class="item">
<a href="#">
<img src="img/16/6.png">
<span>充值中心</span>
</a>
</div>
<div class="item">
<a href="#">
<img src="img/16/7.png">
<span>飞猪旅行</span>
</a>
</div>
<div class="item">
<a href="#">
<img src="img/16/8.png">
<span>领金币</span>
</a>
</div>
<div class="item">
<a href="#">
<img src="img/16/9.png">
<span>拍卖</span>
</a>
</div>
<div class="item">
<a href="#">
<img src="img/16/10.png">
<span>分类</span>
</a>
</div>
</div>
</nav>
</body>
5.调整字的样式 - 至此结束
- 文字样式
/* 设置a里面span文字的样式 */
.item a{
color:#333;
font-size: 16px;
text-decoration: none;
}
- 设置span文字的居中效果。
.item{
width:18%;
/* span文字的居中要在item这个父类设置,否则无效 */
text-align: center;
}
四、最终代码
总结:
- 通过设置弹性容器display:flex ,可以做到用户拖动改变视口,里面的图标大小自适应。
- 对于弹性容器出现的空白,我们通过设置item宽度width:18%; 和 分配nav-inner 里面的空白主轴左右环绕 justify-content: space-around; 将多的空白,作为我们item与item之间的间隙。
- 这样做的好处,可以控制item的大小不过于大,同时自适应。
<style>
*{
margin: 0;
padding: 0;
}
.nav{
width: 100%;
}
.nav-inner{
display: flex;
justify-content: space-around;
}
.item{
width:18%;
text-align: center;
}
.item img{
width:100%;
}
.item a{
color:#333;
font-size: 16px;
text-decoration: none;
}
</style>
<body>
<!-- 创建一个最外层容器 -->
<nav class="nav">
<!-- 第一行行按钮 -->
<div class="nav-inner">
<!-- 单个按钮 -->
<div class="item">
<a href="#">
<img src="img/16/1.png">
<span>天猫</span>
</a>
</div>
<div class="item">
<a href="#">
<img src="img/16/2.png">
<span>聚划算</span>
</a>
</div>
<div class="item">
<a href="#">
<img src="img/16/3.png">
<span>天猫国际</span>
</a>
</div>
<div class="item">
<a href="#">
<img src="img/16/4.png">
<span>外卖</span>
</a>
</div>
<div class="item">
<a href="#">
<img src="img/16/5.png">
<span>天猫超市</span>
</a>
</div>
</div>
<!-- 第二行行按钮 -->
<div class="nav-inner">
<!-- 单个按钮 -->
<div class="item">
<a href="#">
<img src="img/16/6.png">
<span>充值中心</span>
</a>
</div>
<div class="item">
<a href="#">
<img src="img/16/7.png">
<span>飞猪旅行</span>
</a>
</div>
<div class="item">
<a href="#">
<img src="img/16/8.png">
<span>领金币</span>
</a>
</div>
<div class="item">
<a href="#">
<img src="img/16/9.png">
<span>拍卖</span>
</a>
</div>
<div class="item">
<a href="#">
<img src="img/16/10.png">
<span>分类</span>
</a>
</div>
</div>
</nav>
</body>