前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用APICloud AVM框架实现App导航栏菜单

使用APICloud AVM框架实现App导航栏菜单

原创
作者头像
APICloud官方
发布2022-05-05 17:34:14
7260
发布2022-05-05 17:34:14
举报

效果展示

APICloud的AVM官方框架中有一个 frame-group的组件,在此组件的基础上,将栏目导航中view标签换成了 scroll-view标签,并设置成允许横向滚动。

1、修改了标签的样式,以满足项目需要,其他开发者可根据项目具体要求进行样式的修改。

2、计算向右滚动的距离,实现活动frame-group中滑动页面的同时,导航栏也跟着向右滑动。

要点:

1、每个栏目的宽度要用百分比,因为不同手机屏幕的尺寸不一致,为了计算的精确和适配,最好使用百分比。用百分比的好处是,页面栏目能显示出来的数量是可以确定的,15% 的话就是7个(最后一个5%的部分被遮挡),20%的话就是5个,不用再去计算了。

2、如果在样式中有margin或者padding,在计算的时候需要把这些属性设置的值考虑进去。

目录结构

代码源码

代码语言:javascript
复制
<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>

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档