xo_user_client/components/popup/popup.vue

215 lines
6.2 KiB
Vue

<template>
<view :class="theme_view + ' ' + propMostClass">
<view :class="'popup ' + (propClassname || '') + ' ' + (propShow ? 'popup-show' : 'popup-hide') + ' ' + (propAnimation ? 'animation' : '')" :disable-scroll="propDisablescroll">
<view class="popup-mask" :style="'z-index: ' + propIndex + ';'" v-if="propMask" @tap="on_mask_tap"></view>
<view :class="'popup-content popup-' + (propPosition || 'bottom') + ' ' + (propIsRadius ? '' : 'popup-radius-0') + ' ' + (propIsBar ? 'popup-bar' : '') + ' ' + (propPosition === 'bottom' ? 'bottom-line-exclude' : '')" :style="popup_content_style + propStyle">
<slot></slot>
</view>
</view>
</view>
</template>
<script>
const app = getApp();
export default {
data() {
return {
theme_view: app.globalData.get_theme_value_view(),
popup_content_style: '',
};
},
components: {},
props: {
// 最外层的class
propMostClass: {
type: String,
default: '',
},
// 内层class
propClassname: {
type: String,
default: '',
},
propShow: {
type: Boolean,
default: false,
},
propPosition: {
type: String,
default: 'bottom',
},
propMask: {
type: Boolean,
default: true,
},
propAnimation: {
type: Boolean,
default: true,
},
propDisablescroll: {
type: Boolean,
default: false,
},
propIsBar: {
type: Boolean,
default: false,
},
// 弹窗是否需要圆角 默认需要
propIsRadius: {
type: Boolean,
default: true,
},
propIndex: {
type: Number,
default: 100,
},
// 需要携带单位后缀
propTop: {
type: [String, Number],
default: '',
},
propBottom: {
type: String,
default: '',
},
propStyle: {
type: String,
default: '',
},
},
// 属性值改变监听
watch: {
// 监听状态
propShow(value, old_value) {
this.init_handle();
},
},
// 组建创建
created: function () {
this.init_handle();
},
methods: {
// 事件处理
on_mask_tap: function on_mask_tap() {
this.$emit(
'onclose',
{
detail: {},
},
{}
);
},
// 初初始化处理
init_handle() {
var tabbar_height = 0;
if(this.propPosition == 'bottom') {
// 弹窗从底部弹出,获取底部菜单高度、如果当前为底部菜单页面则增加底部间距
if(app.globalData.data.is_use_native_tabbar != 1 && app.globalData.is_tabbar_pages()) {
tabbar_height = (app.globalData.app_system_tabbar_height_value()*2)+20;
} else {
var height = (app.globalData.current_page(false) == 'pages/diy/diy') ? app.globalData.app_diy_tabbar_height_value() : 0;
tabbar_height = (height > 0) ? (height*2)+20 : 0;
}
}
// 左边距位置处理
var left = 0;
// #ifdef H5
// 处理内容左边距、避免父级设置内边距影响
var width = uni.getSystemInfoSync().windowWidth;
if (width > 960) {
left = (width - 800) / 2;
}
// #endif
this.setData({
popup_content_style: 'left:' + left + 'px;' + (this.propTop ? 'top:' + this.propTop : '') + ';' + (this.propBottom ? 'bottom:' + this.propBottom : '') + ';padding-bottom:' + tabbar_height + 'rpx;',
});
},
},
};
</script>
<style>
.popup {
opacity: 0;
}
.popup-content {
position: fixed;
background: #fff;
z-index: 101;
overflow: hidden;
}
.popup-mask {
position: fixed;
top: 0;
bottom: 0;
left: 0;
right: 0;
background-color: rgba(0, 0, 0, 0.6);
opacity: 0;
pointer-events: none;
z-index: 100;
}
.popup-left {
transform: translateX(-100%);
left: 0;
top: 0;
bottom: 0;
}
.popup-right {
transform: translateX(100%);
right: 0;
top: 0;
bottom: 0;
}
.popup-top {
top: 0;
width: 100vw;
transform: translateY(-100%);
}
.popup-bottom {
bottom: var(--window-bottom);
width: 100vw;
transform: translateY(100%);
}
.popup-show {
opacity: 1;
}
.popup-hide {
transition: all 1s linear;
}
.popup-show .popup-content {
transform: none;
}
.popup-show .popup-mask {
opacity: 1;
pointer-events: auto;
}
.popup.animation .popup-mask,
.popup.animation .popup-content {
transition: all 0.35s linear;
}
.popup-top {
border-bottom-right-radius: 20rpx;
border-bottom-left-radius: 20rpx;
}
.popup-bottom {
border-top-right-radius: 20rpx;
border-top-left-radius: 20rpx;
}
.popup-left {
border-top-right-radius: 20rpx;
border-bottom-right-radius: 20rpx;
}
.popup-right {
border-top-left-radius: 20rpx;
border-bottom-left-radius: 20rpx;
}
.popup-radius-0 {
border-radius: 0 !important;
}
.popup-bar {
/* #ifdef H5 || APP */
bottom: var(--window-bottom) !important;
/* #endif */
}
</style>