下面是效果图
下面是实现代码
<!DOCTYPE html>
<html>
<head>
<title></title>
<link rel="stylesheet" href="frozen.css">
<meta charset="utf-8">
<meta name = "viewport" content = "width = device-width, initial-scale = 1.0, maximum-scale = 1.0, user-scalable = 0" />
<script type="text/javascript" src="vue.min.js"></script>
<style type="text/css">
/*从右往左切换动画*/
.rtol{
animation:rtolani 0.5s;
-webkit-animation:rtolani 0.5s; /* Safari and Chrome */
}
@keyframes rtolani
{
0% {left:-100%; top:10%;}
100% {left:0; top:10%;}
}
@-webkit-keyframes rtolani /* Safari and Chrome */
{
0% {left:100%; top:10%;}
100% {left:0; top:10%;}
}
/*从右往左切换动画 321返回时无效加的这个*/
.rrtol{
animation:rrtolani 0.5s;
-webkit-animation:rrtolani 0.5s; /* Safari and Chrome */
}
@keyframes rrtolani
{
0% {left:-100%; top:10%;}
100% {left:0; top:10%;}
}
@-webkit-keyframes rrtolani /* Safari and Chrome */
{
0% {left:100%; top:10%;}
100% {left:0; top:10%;}
}
/*从左往右切换动画*/
.ltor{
animation:ltorani 0.5s;
-webkit-animation:ltorani 0.5s; /* Safari and Chrome */
}
@keyframes ltorani
{
0% {left:100%; top:10%;}
100% {left:0; top:10%;}
}
@-webkit-keyframes ltorani /* Safari and Chrome */
{
0% {left:100%; top:10%;}
100% {left:0; top:10%;}
}
/*控制点击产生阴影*/
.shadow:active{
background-color: #eeeeee !important;
border-radius: 5px;
}
/*控制点击产生阴影*/
.shadow{
background-color: #ffffff !important;
}
</style>
</head>
<body>
<div id="app">
<!-- 顶部tabbar -->
<div class="ui-tab">
<ul class="ui-tab-nav ui-border-b" style="position:fixed;z-index: 1000;height: 10%;">
<li :class="msglist" @click="msgbtnde"><span>消息列表</span></li><!-- current -->
<li :class="myfri" @click="myfribtnde"><span>我的朋友</span></li>
<li :class="mymore" @click="mymorbtnde"><span>我的扩展</span></li>
</ul>
<!-- 占位 -->
</div>
<!-- 消息列表页 -->
<div v-if="msglist=='current'" style="position:absolute;top:10%;width: 100%" :class="anistyle">
<!-- 搜索条 -->
<div class="ui-searchbar-wrap ui-border-b" @click="goToSearch('searchfriend')">
<div class="ui-searchbar ui-border-radius">
<i class="ui-icon-search"></i>
<div class="ui-searchbar-text">在这里搜索朋友</div>
<div class="ui-searchbar-input">
<input value="" type="tel" placeholder="在这里搜索朋友" autocapitalize="off">
</div>
<i class="ui-icon-close"></i>
</div>
<button class="ui-searchbar-cancel">取消</button>
</div>
<!-- 条目容器 -->
<ul class="ui-list ui-list-function ui-border-tb">
<!-- 消息列表项 -->
<li class="shadow" v-for="item in items" @click="goToChat(item)">
<!-- 条目头像用户名内容 -->
<div class="ui-avatar">
<span :style="item.imgsrc"></span>
</div>
<div class="ui-list-info ui-border-t">
<h4 class="ui-nowrap">{{item.username}}</h4>
<p>{{item.content}}</p>
</div>
<!-- 条目右侧时间 -->
<div class="ui-btn disabled shadow">{{item.time}}</div>
<!-- 条目右侧未读个数 -->
<div v-if="item.mesnum>0" style="background-color: #ff0000;
width:16px;
height:16px;
border-radius: 50%;
text-align: center;
line-height: 16px;
font-size: 12px;
color: #fff;
position: absolute;
top: 0;
left: 0;
">{{item.mesnum}}</div>
</li>
</ul>
</div>
<!-- 我的朋友页 -->
<div v-if="myfri=='current'" style="position:absolute;top:10%;width: 100%" :class="anistyle">
<!-- 搜索条 -->
<div class="ui-searchbar-wrap ui-border-b" @click="goToSearch('searchfriend')">
<div class="ui-searchbar ui-border-radius">
<i class="ui-icon-search"></i>
<div class="ui-searchbar-text">在这里搜索朋友</div>
<div class="ui-searchbar-input">
<input value="" type="tel" placeholder="在这里搜索朋友" autocapitalize="off">
</div>
<i class="ui-icon-close"></i>
</div>
<button class="ui-searchbar-cancel">取消</button>
</div>
<!--两图区域 -->
<div class="ui-feeds">
<ul>
<li>
<span :style="TopImg[0].src" @click="topImgClicked(TopImg[0].link)"></span>
</li>
<li>
<span :style="TopImg[1].src" @click="topImgClicked(TopImg[1].link)"></span>
</li>
</ul>
</div>
<!-- 列表选项卡 -->
<div class="ui-tab ">
<ul class="ui-tab-nav ui-border-b ">
<li style="text-align: left;" :class="myfri_fri" @click="myfriFri"><span>朋友列表</span></li>
<li style="text-align: right;" :class="myfri_gro" @click="myfriGro"><span>群聊列表</span></li>
</ul>
</div>
<!-- 下部列表 -->
<div v-if="myfri_fri=='current'"><!-- 朋友列表容器 -->
<ul class="ui-list ui-list-single ui-list-link ui-border-tb">
<li class="ui-border-t" v-for="friitem in frilists" @click="goToChat(friitem)">
<!-- 字母序号区域if条件渲染 -->
<div class="ui-list-info" v-if="friitem.flag=='order'">
<h4 class="ui-nowrap" style="margin-left: 3%;color: #666666;">{{friitem.username}}</h4>
<div class="ui-txt-info"></div>
</div>
<!-- 朋友项区域if条件渲染 -->
<div class="ui-avatar-s" v-if="friitem.flag=='user' && trygroupflag(friitem.groupflag)">
<span :style="friitem.imgsrc"></span>
</div>
<div class="ui-list-info ui-border-t shadow" v-if="friitem.flag=='user' && trygroupflag(friitem.groupflag)">
<h4 class="ui-nowrap">{{friitem.username}}</h4>
</div>
</li>
</ul>
</div>
<div v-if="myfri_gro=='current'"><!-- 群聊列表容器 -->
<ul class="ui-list ui-list-single ui-list-link ui-border-tb">
<li class="ui-border-t" v-for="groitem in grolists" @click="goToChat(groitem)">
<!-- 字母序号区域if条件渲染 -->
<!-- <div class="ui-list-info" v-if="groitem.flag=='order'">
<h4 class="ui-nowrap" style="margin-left: 3%;color: #666666;">{{groitem.username}}</h4>
<div class="ui-txt-info"></div>
</div> -->
<!-- 群项区域if条件渲染 -->
<div class="ui-avatar-s" v-if="groitem.flag=='group'">
<span :style="groitem.imgsrc"></span>
</div>
<div class="ui-list-info ui-border-t shadow" v-if="groitem.flag=='group'">
<h4 class="ui-nowrap">{{groitem.username}}</h4>
</div>
</li>
</ul>
</div>
</div>
<!-- 我的扩展页 -->
<div v-if="mymore=='current'" style="position:absolute;top:10%;width: 100%" :class="anistyle">
<div class="ui-searchbar-wrap ui-border-b" @click="goToSearch('searchresource')">
<div class="ui-searchbar ui-border-radius">
<i class="ui-icon-search"></i>
<div class="ui-searchbar-text">在这里搜索资源</div>
<div class="ui-searchbar-input">
<input value="" type="tel" placeholder="在这里搜索朋友" autocapitalize="off">
</div>
<i class="ui-icon-close"></i>
</div>
<button class="ui-searchbar-cancel">取消</button>
</div>
敬请期待...
</div>
</div>
</body>
</html>
<script>
new Vue({
el: '#app',
data: {
groupflag:'0',
myfri_fri:'current',//是否选中消息列表我的朋友中的朋友列表
myfri_gro:'',//是否选中消息列表我的朋友中的群聊列表
anistyle:'',//切换动画样式类
msglist:'current',//是否选中消息列表
myfri:'',//是否选中消息列表我的朋友
mymore:'',//是否选中消息列表我的扩展
msglistTop:0,//消息列表滚动值(距页面顶端高度)
myfriTop:0,//我的朋友滚动值(距页面顶端高度)
mymoreTop:0,//我的扩展滚动值(距页面顶端高度)
TopImg:[
{
src:"border-radius: 5%;background-image:url(https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1555324144&di=430a23b81be40e36546a7a13f62d87a2&imgtype=jpg&er=1&src=http%3A%2F%2Fuploads.5068.com%2Fallimg%2F1802%2F78-1P209141R8.jpg)",
link:"http://www.fanze.online",
},
{
src:"border-radius: 5%;background-image:url(https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1555324144&di=430a23b81be40e36546a7a13f62d87a2&imgtype=jpg&er=1&src=http%3A%2F%2Fuploads.5068.com%2Fallimg%2F1802%2F78-1P209141R8.jpg)",
link:"http://fanze.online",
}
],
//朋友列表
frilists:[
{
username: '分组1',
imgsrc:"",
uid:'',
flag:'order',
groupflag:'1'
},
{
username: '开发者',
imgsrc:"background-image:url(http://img.52z.com/upload/news/image/20180213/20180213062640_77463.jpg)",
uid:'00001',
flag:'user',
groupflag:'1'
},
{
username: '小张',
imgsrc:"background-image:url(http://img.52z.com/upload/news/image/20180213/20180213062640_77463.jpg)",
uid:'00002',
flag:'user',
groupflag:'1'
},
{
username: '咪咪',
imgsrc:"background-image:url(http://img.52z.com/upload/news/image/20180213/20180213062640_77463.jpg)",
uid:'00003',
flag:'user',
groupflag:'1'
},
{
username: '王老三',
imgsrc:"background-image:url(http://img.52z.com/upload/news/image/20180213/20180213062640_77463.jpg)",
uid:'00001',
flag:'user',
groupflag:'1'
},
{
username: '分组2',
imgsrc:"",
uid:'',
flag:'order',
groupflag:'2'
},
{
username: '张',
imgsrc:"background-image:url(http://img2.imgtn.bdimg.com/it/u=2060761043,284284863&fm=26&gp=0.jpg)",
uid:'00001',
flag:'user',
groupflag:'2'
},
{
username: '赵',
imgsrc:"background-image:url(http://img.52z.com/upload/news/image/20180213/20180213062640_77463.jpg)",
uid:'00001',
flag:'user',
groupflag:'2'
}
],
//群聊列表
grolists:[
{
username: 'XX即时通讯官方群',
imgsrc:"background-image:url(http://img.52z.com/upload/news/image/20180213/20180213062640_77463.jpg)",
uid:'00002',
flag:'group'
}
],
//消息列表
items:[
{
username: '开发者',
content:'晚上哪里吃?',
imgsrc:"background-image:url(http://img.52z.com/upload/news/image/20180213/20180213062640_77463.jpg)",
uid:'00001',
time:'晚上20:07',
mesnum:0
},
{
username: '小美',
content:'你的衣服好漂亮啊!',
imgsrc:"background-image:url(http://img2.imgtn.bdimg.com/it/u=2060761043,284284863&fm=26&gp=0.jpg)",
uid:'00002',
time:'晚上21:40',
mesnum:5
},
{
username: '年华',
content:'移动端怎么样了?',
imgsrc:"background-image:url(http://img.52z.com/upload/news/image/20180419/20180419051254_75804.jpg)",
uid:'00003',
time:'晚上20:30',
mesnum:0
},
{
username: '哥哥',
content:'在',
imgsrc:"background-image:url(http://placeholder.qiniudn.com/100x100)",
uid:'00004',
time:'晚上21:47',
mesnum:10
},
{
username: '开发者',
content:'晚上哪里吃?',
imgsrc:"background-image:url(http://img.52z.com/upload/news/image/20180213/20180213062640_77463.jpg)",
uid:'00001',
time:'晚上21:47',
mesnum:0
},
{
username: '小美',
content:'你的衣服好漂亮啊!',
imgsrc:"background-image:url(http://img2.imgtn.bdimg.com/it/u=2060761043,284284863&fm=26&gp=0.jpg)",
uid:'00002',
time:'晚上21:47',
mesnum:0
},
{
username: '年华',
content:'移动端怎么样了?',
imgsrc:"background-image:url(http://placeholder.qiniudn.com/100x100)",
uid:'00003',
time:'晚上21:47',
mesnum:0
},
{
username: '哥哥',
content:'在',
imgsrc:"background-image:url(http://placeholder.qiniudn.com/100x100)",
uid:'00004',
time:'晚上21:47',
mesnum:0
},
{
username: '开发者',
content:'晚上哪里吃?',
imgsrc:"background-image:url(http://img.52z.com/upload/news/image/20180213/20180213062640_77463.jpg)",
uid:'00001',
time:'晚上21:47',
mesnum:0
},
{
username: '小美',
content:'你的衣服好漂亮啊!',
imgsrc:"background-image:url(http://img2.imgtn.bdimg.com/it/u=2060761043,284284863&fm=26&gp=0.jpg)",
uid:'00002',
time:'晚上21:47',
mesnum:0
},
{
username: '年华',
content:'移动端怎么样了?',
imgsrc:"background-image:url(http://placeholder.qiniudn.com/100x100)",
uid:'00003',
time:'晚上21:47',
mesnum:1
},
{
username: '哥哥',
content:'在',
imgsrc:"background-image:url(http://placeholder.qiniudn.com/100x100)",
uid:'00004',
time:'晚上21:47',
mesnum:0
}
]
},
methods: {
trygroupflag:function(groupflag){
if(this.groupflag.search(groupflag)!=-1)
return true;
else
return false;
},
//tabbar消息列表被点击
msgbtnde: function() {
if(!(this.msglist=='current'))
this.anistyle='rrtol';
this.msglist='current';
this.myfri='null';
this.mymore='null';
document.documentElement.scrollTop=0;
document.body.scrollTop=0;
},
//tabbar我的朋友被点击
myfribtnde: function() {
//判断切换前页
if(this.msglist=='current')
this.anistyle='ltor';
if(this.mymore=='current')
this.anistyle='rtol';
this.msglist='null';
this.myfri='current';
this.mymore='null';
document.documentElement.scrollTop=0;
document.body.scrollTop=0;
},
//tabbar我的扩展被点击
mymorbtnde: function() {
this.msglist='null';
this.myfri='null';
this.mymore='current';
this.anistyle='ltor';
document.documentElement.scrollTop=0;
document.body.scrollTop=0;
},
//我的朋友页中的朋友列表被点击
myfriFri:function() {
this.myfri_fri='current';
this.myfri_gro='';
},
//我的朋友页中的群聊列表被点击
myfriGro:function() {
this.myfri_fri='';
this.myfri_gro='current';
},
下面是指向安卓的方法
//消息列表朋友列表(朋友&群聊)条目被点击跳转到聊天窗口--传入后由java解析
goToChat:function(item) {
//处理分组展开逻辑
if(item.flag=='order')
{
if(this.groupflag.search(item.groupflag)!=-1)
{
this.groupflag=this.groupflag.replace(item.groupflag,'');
}
else if(this.groupflag.search(item.groupflag)==-1)
{
this.groupflag += item.groupflag;
}
}else
android.gochat(JSON.stringify(item));
},
//搜索框被点击
goToSearch:function(searchfalg) {
android.gosearch(searchfalg);
},
//我的朋友页顶部图片被点击
topImgClicked:function(link) {
console.log(link);
android.gosearch(link);
},
}
})
</script>
声明:转载请注明出处,本人入门级菜鸟,内容大多学习于网络,存在问题太多不一一列举,大佬多多指教.本人QQ941131649