在Uniapp开发小程序的过程中,常常会遇到官网提供的appbar计划无奈满足开发需要的问题,在应用自定义appbar开发过程中,难以避免的会遇到适配刘海屏的问题,接下来我将会带给大家最完满的刘海屏适配计划,间接上代码。

在app.vue中退出获取机型头部高度的办法,并把获取的数据存入vuex

<script>    export default {        data() {            return {                  globalData: {                    //全局数据管理                    navBarHeight: 0, // 导航栏高度                    menuBottom: 0, // 胶囊距底部间距(顶部间距也是这个)                    menuHeight: 0, // 胶囊高度                  },            }        },        methods: {          calcNavBarInfo () {            // 获取零碎信息            const systemInfo = wx.getSystemInfoSync();            // 胶囊按钮地位信息            const menuButtonInfo = wx.getMenuButtonBoundingClientRect();            // 导航栏高度 = 状态栏到胶囊的间距(胶囊上坐标地位-状态栏高度) * 2 + 胶囊高度 + 状态栏高度            this.globalData.navBarHeight = (menuButtonInfo.top - systemInfo.statusBarHeight) * 2 + menuButtonInfo.height + systemInfo.statusBarHeight;            // 状态栏和菜单按钮(标题栏)之间的间距            // 等同于菜单按钮(标题栏)到注释之间的间距(胶囊上坐标地位-状态栏高度)            this.globalData.menuBottom = menuButtonInfo.top - systemInfo.statusBarHeight;            // 菜单按钮栏(标题栏)的高度            this.globalData.menuHeight = menuButtonInfo.height;            this.$store.commit('update_globalStyle', this.globalData);          }        },        onLaunch: function() {            console.log('App Launch');            this.calcNavBarInfo();        },        onShow: function() {            console.log('App Show')        },        onHide: function() {            console.log('App Hide')        }    }</script><style>    /*每个页面公共css */    view {        box-sizing: border-box;    }    ::-webkit-scrollbar {        display: none;    }    .flex-right {        display: flex;        justify-content: flex-end;        align-items: center;    }    .flex-center {        display: flex;        justify-content: center;        align-items: center;    }</style>

创立自定义的appbar组件:

<template><view class="nav" :style="`height: ${navBarHeight}px`">  <!-- 胶囊区域 -->  <view class="capsule-box" :style="`height:${menuHeight}px; min-height:${menuHeight}px; line-height:${menuHeight}px; bottom:${menuBottom}px;`">    <!-- 增加本人需要的性能 -->    <view class="nav-handle">      <view class="back">                </view>      <view class="home">      </view>    </view>    <text class="nav-title">{{title}}</text>  </view></view></template><script>    export default {        name:"appbar",        props: {            title: {                type: String,                default: '导航题目'            },        },        data() {            return {                            };        },        computed: {            navBarHeight() {                return this.$store.state.globalStyle.navBarHeight            },            menuHeight() {                return this.$store.state.globalStyle.menuHeight            },            menuBottom() {                return this.$store.state.globalStyle.menuBottom            },        },        mounted() {            console.log(this.navBarHeight, 'bar')        }    }</script><style scoped lang="scss">        .nav {            width: 100vw;            position: relative;        }        // 胶囊栏        .capsule-box {            width: 100vw;            position: absolute;            display: flex;            justify-content: center;            align-items: center;        }        // 题目文字        .nav-title {            height: 100%;            font-size: 32rpx;            margin: 0 auto;             overflow: hidden;            text-overflow: ellipsis;            white-space: nowrap;        }</style>

接下来就是在所需页面里引入appbar组件。能够看到完满适配了刘海屏和非刘海屏,无论机型。心愿本文对你有用!