cshenfu
2024-06-27 58aa6e282bb343503be3cb198948328ea3ed7b79
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
<!-- z-paging -->
<!-- github地址:https://github.com/SmileZXLee/uni-z-paging -->
<!-- dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 -->
<!-- 反馈QQ群:790460711 -->
 
<!-- 滑动切换选项卡swiper,此组件支持easycom规范,可以在项目中直接引用 -->
<template>
    <view :class="fixed?'zp-swiper-container zp-swiper-container-fixed':'zp-swiper-container'" :style="[finalSwiperStyle]">
        <!-- #ifndef APP-PLUS -->
        <view v-if="cssSafeAreaInsetBottom===-1" class="zp-safe-area-inset-bottom"></view>
        <!-- #endif -->
        <slot v-if="$slots.top" name="top" />
        <view class="zp-swiper-super">
            <view class="zp-swiper">
                <slot />
            </view>
        </view>
        <slot v-if="$slots.bottom" name="bottom" />
    </view>
</template>
 
<script>
    export default {
        name: "z-paging-swiper",
        data() {
            return {
                systemInfo: null,
                cssSafeAreaInsetBottom: -1
            };
        },
        props: {
            //是否使用fixed布局,默认为是
            fixed: {
                type: Boolean,
                default: true
            },
            //是否开启底部安全区域适配
            safeAreaInsetBottom: {
                type: Boolean,
                default: false
            },
            //z-paging-swiper样式
            swiperStyle: {
                type: Object,
                default: function() {
                    return {};
                },
            }
        },
        mounted() {
            this.$nextTick(() => {
                this.systemInfo = uni.getSystemInfoSync();
            })
            // #ifndef APP-PLUS
            this._getCssSafeAreaInsetBottom();
            // #endif
        },
        computed: {
            finalSwiperStyle() {
                let swiperStyle = this.swiperStyle;
                if (!this.systemInfo) return swiperStyle;
                const windowTop = this.systemInfo.windowTop;
                const windowBottom = this.systemInfo.windowBottom;
                if (this.fixed) {
                    if (windowTop && !swiperStyle.top) {
                        swiperStyle.top = windowTop + 'px';
                    }
                    if (!swiperStyle.bottom) {
                        let bottom = windowBottom ? windowBottom : 0;
                        if (this.safeAreaInsetBottom) {
                            bottom += this.safeAreaBottom;
                        }
                        if(bottom > 0){
                            swiperStyle.bottom = bottom + 'px';
                        }
                    }
                }
                return swiperStyle;
            },
            safeAreaBottom() {
                if(!this.systemInfo){
                    return 0;
                }
                let safeAreaBottom = 0;
                // #ifdef APP-PLUS
                safeAreaBottom = this.systemInfo.safeAreaInsets.bottom || 0;
                // #endif
                // #ifndef APP-PLUS
                safeAreaBottom = this.cssSafeAreaInsetBottom === -1 ? 0 : this.cssSafeAreaInsetBottom;
                // #endif
                return safeAreaBottom;
            }
        },
        methods: {
            //通过获取css设置的底部安全区域占位view高度设置bottom距离
            _getCssSafeAreaInsetBottom(){
                const query = uni.createSelectorQuery().in(this);
                query.select('.zp-safe-area-inset-bottom').boundingClientRect(res => {
                    if (res) {
                        this.cssSafeAreaInsetBottom = res.height;
                    }
                }).exec();
            }
        }
    }
</script>
 
<style scoped>
    .zp-swiper-container {
        /* #ifndef APP-NVUE */
        display: flex;
        /* #endif */
        flex-direction: column;
        flex: 1;
    }
 
    .zp-swiper-container-fixed {
        position: fixed;
        /* #ifndef APP-NVUE */
        height: auto;
        width: auto;
        /* #endif */
        top: 0;
        left: 0;
        bottom: 0;
        right: 0;
    }
    
    .zp-safe-area-inset-bottom {
        position: absolute;
        /* #ifndef APP-PLUS */
        height: env(safe-area-inset-bottom);
        /* #endif */
    }
 
    .zp-swiper-super {
        flex: 1;
        position: relative;
    }
 
    .zp-swiper {
        /* #ifndef APP-NVUE */
        height: 100%;
        width: 100%;
        position: absolute;
        top: 0;
        left: 0;
        /* #endif */
        /* #ifdef APP-NVUE */
        flex: 1;
        /* #endif */
    }
    
    .zp-swiper-item {
        height: 100%;
    }
</style>