vue/微信小程序 标题栏适配

2 篇文章 0 订阅

背景

vue 编写小程序代码,打包为小程序,小程序原有title样式不太符合,所以自己写了个通用的自定义title,便于各个页面复用.

自定义标题 custom-page-title

在这里插入图片描述

原理

为了使我们的项目更好的适配所有的机型,那么就需要先分析一下:
在这里插入图片描述
我们可以发现:
Android 跟 iOS 顶部有差异的,表现在顶部到胶囊按钮之间的距离有高度差;
胶囊按钮高度为32px, iOS 和 Android 一致。

1、手机机型太多:自定义导航栏高度在不同机型始终无法达到视觉上的统一
2、胶囊按钮位置不固定:导航栏元素(文字,图标等)怎么也对不齐胶囊按钮

解决办法:

比较简单的就是 让标题栏高度就是 胶囊高度,然后让标题的顶部距离就是胶囊的顶部距离,再让标题内的内容上下居中.就完美解决对齐问题了

(进阶版:标题栏高度和 胶囊高度不一致的情况下,就需要自己通过计算:获取标题栏的margin-top)

PS.注意

1.由于胶囊按钮是原生组件,为表现一致,其单位在各系统都为 px,所以我们的自定义导航栏各个高度的单位都必需是px(切记不能用rpx),才能完美适配

代码

<!--  自定义标题栏,在页面配置"navigationStyle": "custom"情况下使用,
其中标题高度和微信小程序 右侧胶囊高度保持一致 32px,以便保持title内容和胶囊居中对齐-->
<template>
  <view class="title-info" :style="'margin-top:' + menuTop + 'px'">
    <view class="v-back" v-if="leftShow" @tap="back">
      <image class="img-back" :src="require('../../static/imgs/ic_back.png')"></image>
    </view>
    <view class="title">{{ title }}</view>
  </view>
</template>
<script>
export default {
  name: "pageTitle",
  components: {},
  props: {
    title: { type: String, default: "" },
    leftShow: { type: Boolean, default: true }
  },
  methods: {
    back() {
      uni.navigateBack({});
    },
    init() {
      //微信模式下获取胶囊位置
      if (process.env.UNI_PLATFORM == "mp-weixin") {
        this.title = "我是标题";
        //获取右侧胶囊的大小高度
        let rightMenuButton = uni.getMenuButtonBoundingClientRect();
        this.menuTop = rightMenuButton.top;
        console.log("胶囊位置大小:", "顶部", this.menuTop);
      }
    }

  },
  data() {
    return {
      menuTop: 24
    };
  },
  mounted() {
    this.init();
  }
};
</script>

<style lang="scss" scoped>

.title-info {
  display: flex;
  position: relative;
  height: 32px;
  flex-direction: row;
  width: 100%;


  .v-back {
    position: absolute;
    left: 16rpx;
    height: 32px;
    display: flex;
    flex-direction: row;

    .img-back {
      margin: 8px;
      width: 9px;
      height: 16px;
    }
  }

  .title {
    width: 100% !important;
    font-size: 34rpx;
    line-height: 32px;
    height: 32px;
    width: auto;
    font-family: "bold";
    color: #333333;
    text-align: center;
  }
}
</style>

使用示例

<template>
  <view class="content">
        <custom-page-title class="custom-title" title="青梅恋语" :leftShow="false">
        </custom-page-title>
    <scroll-view class="scroll-view" :scroll-y="true">
      <view class="u-info">
        <view>内容区域</view>
      </view>
    </scroll-view>
   </view>
</template>

<script>

import CustomPageTitle from "@/modules/marriage/component/custom-page-title";

export default {
  components: {
    CustomPageTitle
  },
  data() {
    return {};
  },
  
  methods: {
  }
};
</script>

<style lang="scss" scoped>
.content {
  display: flex;
  flex-direction: column;
  position: relative;
  height: 100%;
  font-family: serifsc;
  background-color: #0AD3D8;

  .scroll-view {
    height: calc(100% - var(--status-bar-height) - 108rpx);
    background-color: #B4F5F6;

    .u-info {
      width: 100%;
      display: flex;
      flex-direction: column;
    }
  }
}
</style>

使用注意

1.在页面中有 一些自己占据高度的弹窗 等内容时(例如: u-picker),将他放到 custom-page-tile 下面调用.否者 会将 custom-page-title往下挤,导致和右侧胶囊对不齐.

参考资料

小程序轻松实现一个完美适配各种机型的自定义导航栏

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值