综合运用 vw + Flex + Less 实现B站移动端页面
目前市面上有两种适配方案比较流行,一是rem,二是vw(未来趋势)。vw的核心概念是将屏幕平分为100份,若屏幕宽度750px,1vw则等于7.5px。VS Code提供了vw相关的插件,意味着不用手动去计算。
下面这个案例的宽高值,全部用vw单位。原插件的setting.json默认数值为750,我这里改成了375,以方便适应B站页面的制作。
最终效果如图所示:
在这里插入代码片
主要分为四个部分,header、nav、content、openapp,当然,也可以分为三个部分,将nav放到header里面。
header部分分为两块,两个div,左边B站的logo,右边三个图标。使用flex布局,justify-content:space-between;align-items: center;使这两块内容两端对齐。然后将右边三个图标的父元素div,也设置flex,里面的每个图标各为flex:1,空间平分。
nav导航栏部分依旧使用flex布局,右边的小箭头使用固定宽高,左边内容则flex:1接管剩余空间。li内容使用float右浮动,ul宽度这里设置的是800px(主要为了显示长度)。
content主体部分,每一块内容的点击都会跳到另一个页面,因此使用a标签包住全部内容。为了避免白色字体在某些情况下看不清楚,增加了一个遮罩层(灰色渐变色),能突显白色。这一块内容需要注意的是,字体和图标尽可能放到一个div里,通过定位div,将它们俩整体移动,然后使用flex两端对齐。
最后是openapp部分,悬浮定位在页面的底端。用到fixed定位,left:50%,bottom自定义,transform:translateX(-50%),实现绝对居中,然后text-align和设置行高line-height将文本居中对齐,定义好剩余的样式,本页面完成。
具体代码如下:
// 所有vw值由"px2rem"插件自动转换,插件数值设置为375
*{
padding: 0;
margin: 0;
}
a{
text-decoration: none;
}
.layout{
// 头部
.header{
display:flex;
// 用flex布局让两端对齐
justify-content:space-between;
// 侧轴中心对齐
align-items: center;
width: 100%;
height: 11.7333vw;
padding:1.3333vw 2.6667vw;
box-sizing: border-box;
.logo{
>span{
color: #fb7299;
font-size:7.46666667vw;
}
}
.header_right{
display:flex;
width: 42.6667vw;
// flex布局让内容两端对齐
justify-content:space-around;
align-items: center;
>a{
// 剩余空间平分
flex:1;
}
>a:nth-of-type(1){
>span{
font-size: 5.8667vw;
color:#ccc;
}
}
>a:nth-of-type(2){
>img:nth-child(1){
width: 6.4vw;
}
}
>a:nth-of-type(3){
>img:nth-child(1){
width: 19.7333vw;
height: 6.4vw;
}
}
}
}
// 导航栏部分
.nav{
height: 10.6667vw;
display:flex;
justify-content:space-between;
margin-bottom: 0.8vw;
.items{
overflow:scroll;
line-height: 10.6667vw;
flex:1;
>ul{
list-style-type: none;
>li{
// 此处不用flex,用float右浮动
float: left;
padding:0 2.6667vw;
}
// 设置导航栏的“首页”为粉色
>li:nth-child(1){
color:rgb(255, 98, 125);
}
}
}
.items_right{
width: 10.6667vw;
height: 10.6667vw;
text-align:center;
// 行高与元素高度一致,实现内容垂直居中
line-height: 10.6667vw;
}
}
.content{
width: 100%;
>a{
float: left;
&.item{
width:50vw;
padding-bottom: 2.6667vw;
.top{
position: relative;
padding:0 1.33vw;
>img{
width: 100%;
}
// 创建遮罩层,让图片中的白色字体能看得清楚些
.mark{
background-image: linear-gradient(rgb(255, 255, 255,0.1),rgba(216, 216, 216, 0.3));
position: absolute;
top:0;
left:0;
opacity: 0.2;
}
>div{
width: 100%;
display:flex;
justify-content:space-between;
// 将div整体定位,然后flex将div里的内容左右两端对齐
position: absolute;
bottom: 1.3333vw;
>span{
color:#fff;
font-size: 3.2vw;
padding:0vw 3.6vw;
}
}
}
>p{
color:#000;
font-size: 3.2vw;
margin-top: 1vw;
padding:0vw 1.8vw;
}
}
}
}
.openapp{
background-color: rgb(255, 155, 172);
position: fixed;
bottom: 10.6667vw;
left:50%;
transform: translateX(-50%);
width: 93.6vw;
height: 9.8667vw;
line-height: 9.8667vw;
text-align: center;
border-radius: 4.5333vw;
color: #fff;
font-size: 4.5333vw;
>span:first-child{
margin-right: 5.3333vw;
width: 9.3333vw;
font-size: 5vw;
}
}
}
此为Less代码,浏览器暂不支持,需转换为css方能正常读取。
<!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>
<link rel="stylesheet" href="./css/b.css">
<!-- 引入图标链接 -->
<link rel="stylesheet" href="./fonts/iconfont.css">
</head>
<body>
<div class="layout">
<!-- B站头部 -->
<div class="header">
<div class="logo">
<span class="iconfont Navbar_logo"></span>
</div>
<div class="header_right">
<a href="#"><span class="iconfont ic_search_tab"></span></a>
<a href="#"><img src="./images/login.png" alt=""></a>
<a href="#"><img src="./images/download.png" alt=""></a>
</div>
</div>
<!-- 导航栏 -->
<div class="nav">
<div class="items">
<ul>
<li>首页</li>
<li>动画</li>
<li>番剧</li>
<li>国创</li>
<li>音乐</li>
<li>舞蹈</li>
<li>游戏</li>
<li>知识</li>
</ul>
</div>
<!-- 导航栏右边的向下箭头图标 -->
<div class="items_right">
<span class="iconfont general_pulldown_s"></span>
</div>
</div>
<!-- 主体内容 -->
<div class="content">
<a href="#" class="item">
<div class="top">
<img src="./images/1.jpg" alt="">
<!-- 设置遮罩层 -->
<div class="mark"></div>
<div>
<!-- 将两个span放到一个div,方便整体定位和flex控制 -->
<span><i class="iconfont icon_shipin_bofangshu"></i> 108.9万</span>
<span><i class="iconfont icon_shipin_danmushu"></i> 702</span>
</div>
</div>
<p>养了一群《吞金兽》</p>
</a>
<a href="#" class="item">
<div class="top">
<img src="./images/4.jpg" alt="">
<div class="mark"></div>
<div>
<span><i class="iconfont icon_shipin_bofangshu"></i> 145.7万</span>
<span><i class="iconfont icon_shipin_danmushu"></i> 521</span>
</div>
</div>
<p>《明日方舟》SideStory[武道仙路]</p>
</a>
<a href="#" class="item">
<div class="top">
<img src="./images/3.jpg" alt="">
<div class="mark"></div>
<div>
<span><i class="iconfont icon_shipin_bofangshu"></i> 122.4万</span>
<span><i class="iconfont icon_shipin_danmushu"></i> 707</span>
</div>
</div>
<p>粉丝家蹭饭 厨子蹭饭¥0</p>
</a>
<a href="#" class="item">
<div class="top">
<img src="./images/2.jpg" alt="">
<div class="mark"></div>
<div>
<span><i class="iconfont icon_shipin_bofangshu"></i> 66.9万</span>
<span><i class="iconfont icon_shipin_danmushu"></i> 427</span>
</div>
</div>
<p>2022还有10元西餐店?</p>
</a>
<a href="#" class="item">
<div class="top">
<img src="./images/1.jpg" alt="">
<div class="mark"></div>
<div>
<span><i class="iconfont icon_shipin_bofangshu"></i> 108.9万</span>
<span><i class="iconfont icon_shipin_danmushu"></i> 702</span>
</div>
</div>
<p>养了一群《吞金兽》</p>
</a>
<a href="#" class="item">
<div class="top">
<img src="./images/4.jpg" alt="">
<div class="mark"></div>
<div>
<span><i class="iconfont icon_shipin_bofangshu"></i> 145.7万</span>
<span><i class="iconfont icon_shipin_danmushu"></i> 521</span>
</div>
</div>
<p>《明日方舟》SideStory[武道仙路]</p>
</a>
<a href="#" class="item">
<div class="top">
<img src="./images/3.jpg" alt="">
<div class="mark"></div>
<div>
<span><i class="iconfont icon_shipin_bofangshu"></i> 122.4万</span>
<span><i class="iconfont icon_shipin_danmushu"></i> 707</span>
</div>
</div>
<p>粉丝家蹭饭 厨子蹭饭¥0</p>
</a>
<a href="#" class="item">
<div class="top">
<img src="./images/2.jpg" alt="">
<div class="mark"></div>
<div>
<span><i class="iconfont icon_shipin_bofangshu"></i> 66.9万</span>
<span><i class="iconfont icon_shipin_danmushu"></i> 427</span>
</div>
</div>
<p>2022还有10元西餐店?</p>
</a>
</div>
<div class="openapp">
<span class="iconfont Navbar_logo"></span>
<span>打开APP,看你感兴趣的视频</span>
</div>
</div>
<script>
// 使导航栏宽度大于父元素,实现滑动效果
document.querySelector(".items>ul").style.width = "800px";
</script>
</body>
</html>