当前位置:   article > 正文

uni-app实现自定义导航栏,兼容H5、App、微信小程序_uniapp 自定义导航栏

uniapp 自定义导航栏

很多情况下,系统自带的导航栏无法满足UI设计的要求,这时候就需要我们自定义导航栏来实现需求,要考虑跨端的多种情况,这里我们封装成一个组件来使用,实现效果如下:

一、H5、App、微信小程序的区别

1.H5:导航栏高度可以设为44px,它没有状态栏,因为H5端运行在浏览器中,浏览器已经处理了安全区;

总高度 = 44px

2.App:导航栏高度也是44px,它的状态栏高度是不一定的,每个机型的安全区是不一样尺寸,所以获取安全区高度来计算。

总高度 = 安全区高度 + 44px

3.微信小程序:导航栏高度和状态栏高度都与机型的尺寸有关,其中状态栏高度需要获取安全区高度来计算,导航栏高度需要获取小程序右上角的“胶囊”高度和top值来计算。

总高度 = 安全区高度 + 导航栏高度

导航栏高度 = 胶囊高度 + 上间距 + 下间距

上间距 = 下间距 =  胶囊.top - 状态栏高度

即:总高度 = 状态栏高度 + (胶囊高度 + (胶囊.top - 状态栏高度)*2)

二、在components中创建一个组件名称为 navbar,先展示组件完整代码

  1. <template>
  2. <view class="navbar">
  3. <view class="fixed-content">
  4. <!-- 状态栏高度 -->
  5. <view :style="{'height': geStatusBarHeight + 'px'}"></view>
  6. <!-- 导航栏高度 -->
  7. <view class="bar-content" :style="{'height': getNavBarHeight()+'px'}">
  8. <slot>
  9. <image @tap="navigateBack()" class="nav-left" src="/static/img/common/arrow-left.png" mode=""></image>
  10. <view class="nav-title">{{ title }}</view>
  11. </slot>
  12. </view>
  13. </view>
  14. <!-- 占位高度,状态栏高度+导航栏高度,父组件就不需要计算导航栏高度 -->
  15. <view :style="{'height': geStatusBarHeight + getNavBarHeight() + 'px'}"></view>
  16. </view>
  17. </template>
  1. <script>
  2. export default {
  3. name:'Navbar',
  4. props:{
  5. title:{
  6. type: String,
  7. default:''
  8. }
  9. },
  10. methods: {
  11. // 获取状态栏高度
  12. geStatusBarHeight(){
  13. return uni.getSystemInfoSync()['statusBarHeight']
  14. },
  15. // 获取导航栏高度
  16. getNavBarHeight(){
  17. // #ifdef MP-WEIXIN
  18. let menuButtonInfo = uni.getMenuButtonBoundingClientRect()
  19. // 导航栏高度 = 胶囊高度 + 上间距 + 下间距 + 微调 (menuButtonInfo.top - uni.getSystemInfoSync()['statusBarHeight'] = 上间距)
  20. let navbarHeight = menuButtonInfo.height + (menuButtonInfo.top - uni.getSystemInfoSync()['statusBarHeight']) * 2 + 2
  21. // #endif
  22. // #ifdef APP-PLUS || H5
  23. let navbarHeight = 44
  24. // #endif
  25. return navbarHeight
  26. },
  27. navigateBack(){
  28. uni.navigateBack()
  29. }
  30. }
  31. }
  32. </script>
  1. <style lang="scss" scoped>
  2. .navbar{
  3. .fixed-content {
  4. position: fixed;
  5. top: 0;
  6. left: 0;
  7. width: 100%;
  8. padding: 0 24rpx;
  9. z-index: 1996;
  10. .bar-content{
  11. display: flex;
  12. align-items: center;
  13. position: relative;
  14. .nav-left{
  15. width: 22px;
  16. height:22px;
  17. position: absolute;
  18. z-index: 2;
  19. top: 50%;
  20. transform: translateY(-50%);
  21. }
  22. .nav-title{
  23. color: #fff;
  24. font-weight: bold;
  25. font-size: 16px;
  26. width: 100%;
  27. position: absolute;
  28. top: 50%;
  29. transform: translateY(-50%);
  30. text-align: center;
  31. }
  32. }
  33. }
  34. }
  35. </style>

三、在页面中使用组件

1.直接使用默认样式,将和系统导航栏一致。

<navbar></navbar>

2.slot 替换默认的样式。

  1. <navbar>
  2. <!-- slot 替换默认的样式 -->
  3. <view class="status-bar-box">
  4. <view class="select-city">
  5. <image src="/static/img/index/icon-city.png"></image>
  6. <view class="">杭州市</view>
  7. </view>
  8. <view class="status-bar-title">汽车租赁</view>
  9. </view>
  10. </navbar>

四、扩展

一开始导航栏背景是透明的,是根据页面的背景图来呈现。那么滚动的时候就不是很友好了,这时候我们可以加一个滚动阈值,让导航栏变成白色背景,文字黑色。类似如下效果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/651302
推荐阅读
相关标签
  

闽ICP备14008679号