yfx
2026-04-01 8e265ae16c6f5a66e8ef283bbe58d310ae6edb4a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<template>
    <view
        class="uv-safe-bottom"
        :style="[style]"
        :class="[!isNvue && 'uv-safe-area-inset-bottom']"
    >
    </view>
</template>
 
<script>
    import mpMixin from '@/uni_modules/uv-ui-tools/libs/mixin/mpMixin.js'
    import mixin from '@/uni_modules/uv-ui-tools/libs/mixin/mixin.js'
    /**
     * SafeBottom 底部安全区
     * @description 这个适配,主要是针对IPhone X等一些底部带指示条的机型,指示条的操作区域与页面底部存在重合,容易导致用户误操作,因此我们需要针对这些机型进行底部安全区适配。
     * @tutorial https://www.uvui.cn/components/safeAreaInset.html
     * @property {type}        prop_name
     * @property {Object}    customStyle    定义需要用到的外部样式
     *
     * @event {Function()}
     * @example <uv-status-bar></uv-status-bar>
     */
    export default {
        name: "uv-safe-bottom",
        mixins: [mpMixin, mixin],
        data() {
            return {
                safeAreaBottomHeight: 0,
                isNvue: false,
            };
        },
        computed: {
            style() {
                const style = {};
                // #ifdef APP-NVUE || MP-TOUTIAO || MP-LARK
                // nvue下,高度使用js计算填充
                style.height = this.$uv.addUnit(this.$uv.sys()?.safeAreaInsets?.bottom, 'px');
                // #endif
                return this.$uv.deepMerge(style, this.$uv.addStyle(this.customStyle));
            },
        },
        mounted() {
            // #ifdef APP-NVUE
            // 标识为是否nvue
            this.isNvue = true;
            // #endif
        },
    };
</script>
 
<style lang="scss" scoped>
    .uv-safe-bottom {
        /* #ifndef APP-NVUE */
        width: 100%;
        /* #endif */
    }
    /* #ifndef APP-NVUE */
    // 历遍生成4个方向的底部安全区
    @each $d in top, right, bottom, left {
        .uv-safe-area-inset-#{$d} {
            padding-#{$d}: 0;
            padding-#{$d}: constant(safe-area-inset-#{$d});  
            padding-#{$d}: env(safe-area-inset-#{$d});  
        }
    }
    /* #endif */
</style>