一、前情回顾
二、创建城市页面
首页导航栏上有一个城市选择页面,点击会切换到城市页面,切换到城市页面的过程中并没有路由的跳转,而只是tab的切换,所以需要将城市页面设置为tabBar页面,即将城市页面添加到tabBar的list数组中。
// components/city/city.vue
<template>
<view class="city"> <!--城市页面和首页是共用一个导航的tabBar的-->
<index-header></index-header>
<tab-bar></tab-bar>
</view>
</template>
<style scoped>
.city { <!--城市页面全屏显示,并且背景为黑色-->
width: 100%;
height: 100%;
background: #000000;
}
</style>
三、创建位置组件
城市页面中需要显示当前所在城市定位信息以及城市切换按钮,即分为左右两部分,这里有一个问题,就是将位置组件加到城市页面中后,由于头部导航采用固定定位脱离文档流了,而位置组件需要放到头部导航栏的下发,所以需要给位置组件设置一个margin-top,但是由于其父元素即城市页面没有设置边框,会有外边距溢出的问题,即位置组件设置的外边距会转移到城市页面上,导致整个城市页面会有一个margin-top,要解决这个问题有多种方式,主要就是对父元素(城市页面)进行设置: 第一种就是给父元素加一个边框,这种会改变父元素布局,显然不合适,第二种是给父元素添加over-flow:hidden;对溢出部分进行隐藏,第三种是通过css为类在父元素中添加一个table元素,如:
// components/location.vue
<template>
<view class="location">
<view class="iconfont icon-dingwei location-left">
自动定位: 上海
</view>
<view class="location-right">
切换 <text class="iconfont icon-dayuhao dayuhao"></text>
</view>
</view>
</template>
<style>
.location {
width: 100%;
height: 40px;
color: #aaaaaa;
margin-top: 60px;
overflow: hidden;
display: flex;
}
.location-left {
text-align: center;
margin-left: 20px;
height: 40px;
line-height: 40px;
font-size: 12px;
}
.location-right {
flex: 1;
text-align: right;
padding-right: 20px;
height: 40px;
line-height: 40px;
font-size: 12px;
}
.dayuhao {
font-size: 12px;
}
</style>
// pages/city/city.vue
<style scoped>
.city {
width: 100%;
height: 100%;
background: #000000;
/* overflow: hidden; */ <!--解决外边距溢出问题,对溢出部分进行隐藏-->
/* border: 1px solid red; */ <!--解决外边距溢出问题,会改变父元素布局,不宜使用-->
}
.city:before { <!--通过css伪类给城市页面顶部添加一个table元素,解决外边距溢出问题-->
display: table;
content: "";
}
</style>
四、在城市页面添加上视频列表
城市页面的视频列表相对简单,就是一个个的video大小为50%并且进行左浮动即可每行显示两个。
<template>
<view class="video-list">
<view class="item">
<view class="video">
<video src="http://alimov2.a.yximgs.com/bs2/gdtPostRoll/postRoll-MTA3MDY0NDY3Mzk.mp4"></video>
</view>
<view class="img">
<image class="img-box" src="../../static/zxh.jpg"></image>
</view>
</view>
</view>
</template>
<style scoped>
.video-list {
width: 100%;
overflow: auto;
background: #000000;
}
.item {
width: 50%;
height: 264px;
float: left;
position: relative;
}
.video {
width: 92%;
height: 100%;
margin-left: 4%;
background: red;
}
video {
width: 100%;
height: 100%;
}
.img {
position: absolute;
bottom: 0px;
right: 8px;
}
.img-box {
width: 20px;
height: 20px;
border-radius: 50%;
}
</style>
城市页面效果图如下:
五、顶部和底部固定高度,中间自适应高度布局
在应用程序中,我们顶部导航栏和底部导航栏通常都是固定高度的,而中间内容是自适应的,根据不同屏幕尺寸进行自适应。要实现这种布局,主要有两种方式:
① 通过绝对定位
顶部导航栏设定固定高度,并通过绝对定位固定在屏幕顶部位置,同样底部导航栏设定高度,也是通过绝对定位固定在屏幕底部位置,而中间内容区则不固定高度,而是通过绝对定位,同时设定top和bottom,top值为顶部导航栏高度,bottom值为底部导航栏高度,如:
<template>
<view class="index">
<view class="index-header"></view>
<view class="index-content"></view>
<view class="index-footer"></view>
</view>
</template>
<style scoped>
.index {
width: 100%;
height: 100%;
}
.index-header {
width: 100%;
height: 50px;
position: absolute;
top: 0;
left: 0;
}
.index-content {
width: 100%;
position: absolute;
top: 50px;
bottom: 50px;
}
.index-footer {
width: 100%;
height: 50px;
position: absolute;
bottom: 0;
left: 0;
}
</style>
②通过flex布局
给父元素设置flex布局,顶部导航栏和底部导航栏设置固定高度,中间内容设置flex:1自动占满剩余空间
<template>
<view class="index">
<view class="index-header"></view>
<view class="index-content"></view>
<view class="index-footer"></view>
</view>
</template>
<style scoped>
.index {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
}
.index-header {
width: 100%;
height: 50px;
}
.index-content {
width: 100%;
flex: 1;
}
.index-footer {
width: 100%;
height: 50px;
}
<style>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。