使用 APICloud AVM 框架实现 App 导航栏菜单
作者:APICloud
- 2022 年 5 月 05 日
本文字数:1930 字
阅读完需:约 6 分钟
效果展示
APICloud 的 AVM 官方框架中有一个 frame-group 的组件,在此组件的基础上,将栏目导航中 view 标签换成了 scroll-view 标签,并设置成允许横向滚动。
1、修改了标签的样式,以满足项目需要,其他开发者可根据项目具体要求进行样式的修改。
2、计算向右滚动的距离,实现活动 frame-group 中滑动页面的同时,导航栏也跟着向右滑动。
要点:
1、每个栏目的宽度要用百分比,因为不同手机屏幕的尺寸不一致,为了计算的精确和适配,最好使用百分比。用百分比的好处是,页面栏目能显示出来的数量是可以确定的,15% 的话就是 7 个(最后一个 5%的部分被遮挡),20%的话就是 5 个,不用再去计算了。
2、如果在样式中有 margin 或者 padding,在计算的时候需要把这些属性设置的值考虑进去。
目录结构
代码源码
<template>
<view class="page">
<safe-area></safe-area>
<scroll-view id="navView" class="item-group" scroll-x scroll-y="false" show-scrollbar="false">
<view class="item" onclick={this.fnSetFrameGroupIndex} data-index={index} v-for="(item,index) in menuNameList">
<text class={this.data.selectedIndex==index?'item-title-active':'item-title'}>{item}</text>
</view>
</scroll-view>
<frame-group class="framegroup" id="frameGroup" preload="0" onchange={this.onchange} scrollEnabled="true"></frame-group>
</view>
</template>
<script>
export default {
name: 'index',
apiready(){
// console.log(api.winWidth);
var frames = [];
for (var i=0;i<this.data.menuList.length;i++) {
var name = this.data.menuList[i];
var title = this.data.menuNameList[i];
frames.push({
name: title,
url: name + '.stml'
});
}
var frameGroup = document.getElementById('frameGroup');
frameGroup.load({
frames: frames
});
},
data() {
return{
menuList: ['page1', 'page2', 'page3', 'page4', 'page5', 'page6', 'page7', 'page8', 'page9'],
menuNameList:['推荐', '法律', '法规', '生产', '安全', '环保', '机构', '新闻', '咨询'],
selectedIndex: 0,
itemWith:(api.winWidth-20)*0.15
}
},
methods: {
fnSetFrameGroupIndex(e) {
//计算scroll-view 向右滑动的距离,来实现活动页面时 顶部的导航也跟着滑动
var navView = document.getElementById('navView');
var index = e.target.dataset.index;
if(index>6){
navView.scrollTo({
x:(index-6)*this.data.itemWith+10
})
}
else if(index==6){
navView.scrollTo({
x:10
})
}
else{
if(this.data.selectedIndex>index){
navView.scrollTo({
x:0
})
}
}
if (this.data.selectedIndex != index) {
this.data.selectedIndex = index;
var frameGroup = document.getElementById('frameGroup');
frameGroup.setIndex({
index: index,
scroll: true
});
}
},
onchange(e){
//计算scroll-view 向右滑动的距离,来实现活动页面时 顶部的导航也跟着滑动
var navView = document.getElementById('navView');
var index = e.detail.index;
if(index>6){
navView.scrollTo({
x:(index-6)*this.data.itemWith+10
})
}
else if(index==6){
navView.scrollTo({
x:10
})
}
else{
if(this.data.selectedIndex>index){
navView.scrollTo({
x:0
})
}
}
//确认跳转当前页面
if (this.data.selectedIndex != index) {
this.data.selectedIndex = index;
}
}
}
}
</script>
<style>
.page {
height: 100%;
}
.item-group {
width: 100%;
height: 50px;
padding: 10px;
}
.item {
width: 15%;
align-items: center;
}
.item-title-active{
border-bottom: 2px solid #3c40c6;
color: #000000;
padding-bottom: 3px;
}
.item-title{
color: #666666;
padding-bottom: 3px;
border-bottom: 0px solid #3c40c6;
}
.framegroup{
margin: 10px;
}
</style>
复制代码
划线
评论
复制
发布于: 刚刚阅读数: 2
版权声明: 本文为 InfoQ 作者【APICloud】的原创文章。
原文链接:【http://xie.infoq.cn/article/c01b0c42502095d6900c500b9】。文章转载请联系作者。
APICloud
关注
一次编码多端运行,移动应用低代码开发平台 2020.12.22 加入
用友YonBuilder移动端低代码开发平台,快速构建高性能多端应用
评论