这篇文章主要介绍“uni-app小程序沉浸式导航怎么实现”,在日常操作中,相信很多人在uni-app小程序沉浸式导航怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”uni-app小程序沉浸式导航怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
1. 开始
项目要在多个页面上加自定义导航栏,还要有渐变效果,就是随着页面上滑,导航栏透明度由0逐渐变为1。这里面有几个基本点需要注意下。
2. page的样式
page 不能是height: 100%,可以设置height: auto,这样才可以触发 onPageScroll。
3. onPageScroll
只有 page 才有 onPageScroll 事件。试验发现,mixin 和页面内都写了 onPageScroll 的话,都会触发。
如果把它放在 mixin 中,写成下面这样,可能会有问题:
data()?{
??return?{
????pageScrollTop:?0,
??};
},
onPageScroll({?scrollTop?})?{
??this.pageScrollTop?=?scrollTop?||?0;
},
因为自定义导航栏不一定要在页面级组件上,很多页面都是写在子组件里,而 mixin 是各个组件各自维护了一份data,所以无法传递。这也是Vue组件和小程序组件的不同之处。
解决方法有多个:
4. 性能问题
这里面还有两个性能相关的点要注意下:
5. 方案
综上,目前采用的方案是:
6. 代码
//?某个页面
??
//?mixin
export?const?uniSystemInfoMixin?=?{
??data()?{
????return?{
??????//?page-meta上设置的根标签字体大小
??????mixinRootFontSize:?50,

????};
??},
??mounted()?{
????//?设置根字体大小
????this.onSetFontSize();
??},
??onPageScroll({?scrollTop?})?{
????const?mpHeaderHeight?=?this.$store.state.wxHeader.mpHeaderHeight?||?44;
????const?pageScrollTop?=??this.$store.getters.['wxHeader/pageScrollTop']?||?44;
????const?parsedScrollTop?=?scrollTop?>?mpHeaderHeight???mpHeaderHeight?:?scrollTop;
????//?如果滑动值大于?mpHeaderHeight,就不再更新?data
????if?(parsedScrollTop?===?mpHeaderHeight?&&?pageScrollTop?===?mpHeaderHeight)?{
??????return;
????}
????this.$store.commit('wxHeader/setPageScrollTop',?parsedScrollTop);
??},
??beforeDestroy()?{
????if?(this.mpType?===?'page')?{
??????this.$store.commit('wxHeader/setPageScrollTop',?0);
????}
??},
??methods:?{
????getMpHeaderBg()?{
??????const?pageScrollTop?=?this.getMpPageScrollTop();
??????const?mpHeaderHeight?=?this.$store.state.wxHeader.mpHeaderHeight?||?44;
??????return?`rgba(255,?255,?255,?${Math.min(1,?pageScrollTop?/?mpHeaderHeight)})`;
????},
????getMpPageScrollTop()?{
??????const?curPageName?=?this.getCurPageName();
??????const?pageScrollTopMap?=?this.$store.state.wxHeader.pageScrollTopMap?||?{};
??????return?pageScrollTopMap[curPageName]?||?0;
????},
????getCurPageName()?{
??????const?pages?=?getCurrentPages();
??????return?pages[pages.length?-?1].route;
????},
????onSetFontSize()?{
??????//?宽度?375?时(iphone6),rootFontSize为50,则一份为?375/50=7.5
??????const?screenNumber?=?7.5;
??????const?that?=?this?;
??????if?(that.mpType?===?'page')?{
????????//?窗体改变大小触发事件
????????uni.onWindowResize((res)?=>?{
??????????if?(res.size.windowWidth)?{
????????????that.mixinRootFontSize?=?parseFloat(res.size.windowWidth)?/?screenNumber;
??????????}
????????});
????????//?打开获取屏幕大小
????????uni.getSystemInfo({
??????????success(res)?{
????????????const?fontsize?=?res.screenWidth?/?screenNumber;
????????????that.mixinRootFontSize?=?fontsize;
????????????const?mpHeaderHeight?=?res.statusBarHeight?+?44;
????????????that.$store.commit('wxHeader/setMpHeaderHeight',?mpHeaderHeight);
??????????},
????????});
????}
????},
??},
};
//?store/modules/wx-header.js
const?wxHeaderStore?=?{
??namespaced:?true,
??state:?()?=>?({
????//?存放多个页面的pageScrollTop
????pageScrollTopMap:?{},
????//?状态栏高度
????mpHeaderHeight:?44,
??}),
??mutations:?{
????setPageScrollTop(state,?pageScrollTop?=?0)?{
??????const?curPageName?=?getCurPageName();
??????state.pageScrollTopMap?=?{
????????...state.pageScrollTopMap,
????????[curPageName]:?pageScrollTop,
??????};
????},
????setMpHeaderHeight(state,?mpHeaderHeight)?{
??????state.mpHeaderHeight?=?mpHeaderHeight;
????},
??},
};
7. 注意事项
到此云计算地图导航,关于“uni-app小程序沉浸式导航怎么实现”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
(编辑:92站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|