这里是文章模块栏目内容页
uniapp自定义顶部head导航的实现

uniapp默认的页面头部是有一条像浏览器的标签一样的导航栏bar。

它默认显示页面的title 信息,返回按钮等;

这在微信公众号里面,如果用了这个默认的头部,那么在浏览器和微信公众号里面,页面会有两条头部;


为了解决这个问题;

 "globalStyle": {
  "navigationBarTitleText": "站点标题",
  "navigationStyle": "custom", //设置它为custom,表示默认不显示自带的head头部bar,
  //页面的高度是从手机屏幕的0.0位置开始算起。
  //不是所有页面都需要一个head的。在有tabbar的时候,就可以不用头部head。 在子页面里面需要head,并带有返回上一页面按钮;
  "enablePullDownRefresh": false,
  "backgroundColorTop": "#F5F5F5",
  "backgroundColorBottom": "#F5F5F5"
 },


然后自定义一个页面的pageHead 组件,在需要的页面 显示头部bar;


组件的定义如下:

<template>
  <view
    :class="{ 'flex tabs-header': true, 'tabs-header-sticky': sticky }"
    :style="'top:' + (top + (excludeStatusBar ? statusBarHeight : 0) + (excludeNavBar ? navBarHeight : 0)) + 'px;' + styles"
  >
    <slot name="nav">
      <view :class="{ 'tabs-nav': true, 'nav-around': navAround }">
        <view :style="{ fontSize: size }" v-for="(item, index) in navList" :key="index" @click="change(index)" :class="{ 'nav-item': true, 'nav-item-active': index == active }">
          <text>{{ item }}</text>
        </view>
      </view>
    </slot>
    <slot name="navBottom"></slot>
  </view>
</template>

<script setup>
import { ref, onMounted, onActivated, watchEffect, provide, nextTick } from 'vue';

const props = defineProps({
  // 导航列表
  navList: {
    type: Array,
    default: []
  },
  // 当前导航
  current: {
    type: Number,
    default: 0
  },
  // 导航均分布局
  navAround: {
    type: Boolean,
    default: false
  },
  // 支持悬停
  sticky: {
    type: Boolean,
    default: false
  },
  size: {
    type: String,
    default: '16px'
  },
  // 支持悬停
  sticky: {
    type: Boolean,
    default: false
  },
  // 吸顶后距离顶部距离
  top: {
    type: Number,
    default: -2
  },
  // 排除状态栏
  excludeStatusBar: {
    type: Boolean,
    default: true
  },
  // 排除导航栏
  excludeNavBar: {
    type: Boolean,
    default: false
  },
  styles: {
    type: String
  }
});
const statusBarHeight = getApp().globalData.statusBarHeight;
const navBarHeight = getApp().globalData.navBarHeight;
const emit = defineEmits(['change', 'update:current']);
const active = ref(0);

watchEffect(() => {
  active.value = props.current;
});

// 切换导航
function change(index) {
  active.value = index;
  emit('change', index);
  emit('update:current', index);
}
</script>

<style scoped>
.tabs-header {
  padding: 10rpx;
  display: flex;
  flex-direction: column;

  &.tabs-header-sticky {
    position: sticky;
    top: -2rpx;
    z-index: 10;
    background: $uni-bg-color-grey;
  }

  .tabs-nav {
    display: flex;
    flex-wrap: wrap;

    &.nav-around {
      justify-content: space-around;
    }

    .nav-item {
      padding: 20rpx 20rpx;
      font-size: $uni-font-size-base;
      color: $uni-text-color-regular;

      &.nav-item-active .nav-item-name {
        color: $uni-color-primary;
        position: relative;
        font-weight: bold;

        &::after {
          position: absolute;
          left: 50%;
          bottom: -15rpx;
          transform: translateX(-50%);
          content: ' ';
          width: 24rpx;
          height: 6rpx;
          background: $uni-color-primary;
          border-radius: 6rpx;
        }
      }
    }
  }
}
</style>

好了,本文内容全部结束,感谢您的阅读,希望能帮助到您;



更多栏目
相关内容