You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
225 lines
4.1 KiB
225 lines
4.1 KiB
3 years ago
|
<template>
|
||
|
<view class="ss-modal-body" :class="{'ss-modal-active' : animation, 'ss-modal-H5Top': _H5Top, 'ss-modal-H5Bottom': _H5Bottom}" :data-platform="platform">
|
||
|
<view class="ss-modal" :class="'ss-modal-' + position +' ' + 'ss-modal-' + mode">
|
||
|
<slot></slot>
|
||
|
</view>
|
||
|
<view v-if="_mask" class="uni-mask" @touchmove.stop.prevent="moveHandle" catchtouchmove="true" @click.stop="hide()"></view>
|
||
|
</view>
|
||
|
</template>
|
||
|
|
||
|
<script>
|
||
|
const systemInfo = uni.getSystemInfoSync();
|
||
|
export default {
|
||
|
data () {
|
||
|
return {
|
||
|
animation: false,
|
||
|
platform: systemInfo.platform
|
||
|
}
|
||
|
},
|
||
|
props: {
|
||
|
/*
|
||
|
* 参数说明(定位)
|
||
|
*/
|
||
|
position: {//可能值 top left right bottom middle
|
||
|
type: String,
|
||
|
default: 'middle'
|
||
|
},
|
||
|
/*
|
||
|
* 参数说明
|
||
|
* full 宽度100%
|
||
|
* insert 80%宽度内联小框
|
||
|
* cover 宽度高度100%
|
||
|
*/
|
||
|
mode: {
|
||
|
type: String,
|
||
|
default: 'full'
|
||
|
},
|
||
|
mask: {
|
||
|
type: [Boolean, String],
|
||
|
default: true
|
||
|
},
|
||
|
/*
|
||
|
* H5置顶
|
||
|
*/
|
||
|
H5Top: {
|
||
|
type: [Boolean, String],
|
||
|
default: true
|
||
|
},
|
||
|
/*
|
||
|
* H5置底
|
||
|
*/
|
||
|
H5Bottom: {
|
||
|
type: [Boolean, String],
|
||
|
default: true
|
||
|
},
|
||
|
},
|
||
|
computed: {
|
||
|
_mask() {
|
||
|
return String(this.mask) === 'false' ? false : true;
|
||
|
},
|
||
|
_H5Top() {
|
||
|
return String(this.H5Top) === 'false' ? false : true;
|
||
|
},
|
||
|
_H5Bottom() {
|
||
|
return String(this.H5Bottom) === 'false' ? false : true;
|
||
|
}
|
||
|
},
|
||
|
watch: {
|
||
|
animation(val) {
|
||
|
this.$emit('change', val);
|
||
|
}
|
||
|
},
|
||
|
methods: {
|
||
|
moveHandle() {
|
||
|
return ;
|
||
|
},
|
||
|
show () {
|
||
|
this.animation = true;
|
||
|
return true;
|
||
|
},
|
||
|
hide () {
|
||
|
this.animation = false;
|
||
|
return false;
|
||
|
},
|
||
|
toggle () {
|
||
|
return !this.animation ? this.show() : this.hide()
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
</script>
|
||
|
|
||
|
<style lang="scss">
|
||
|
// 弹窗公用样式
|
||
|
.ss-modal-body{
|
||
|
box-sizing: border-box;
|
||
|
opacity: 0;
|
||
|
position: fixed;
|
||
|
top: 44px;
|
||
|
bottom: 50px;
|
||
|
left: 0;
|
||
|
width: 100%;
|
||
|
pointer-events: none;
|
||
|
transform: translateX(0);
|
||
|
transition: all .2s linear;
|
||
|
z-index: 98;
|
||
|
&.ss-modal-active{
|
||
|
pointer-events: auto;
|
||
|
opacity: 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* #ifdef H5 */
|
||
|
.ss-modal-body.ss-modal-H5Top{
|
||
|
top: 0;
|
||
|
z-index: 999;
|
||
|
}
|
||
|
.ss-modal-body.ss-modal-H5Bottom{
|
||
|
bottom: 0;
|
||
|
z-index: 999;
|
||
|
}
|
||
|
/* #endif */
|
||
|
|
||
|
.ss-modal-body .uni-mask{
|
||
|
z-index: 1;
|
||
|
position: fixed;
|
||
|
top: 0;
|
||
|
right: 0;
|
||
|
left: 0;
|
||
|
bottom: 0;
|
||
|
background: rgba(0,0,0,.6);
|
||
|
}
|
||
|
.ss-modal{
|
||
|
position: fixed;
|
||
|
z-index: 2;
|
||
|
transition: inherit;
|
||
|
/deep/ .gmy-float-touch{
|
||
|
display: none;
|
||
|
}
|
||
|
}
|
||
|
.ss-modal-middle{
|
||
|
top: 50%;
|
||
|
left: 50%;
|
||
|
transform: translate(-50%, -50%);
|
||
|
}
|
||
|
.ss-modal-cover{
|
||
|
width: 100%;
|
||
|
// width: 100vw;
|
||
|
width: calc(100% + 3px);
|
||
|
// width: calc(100vw + 2px);//清除translate带来了计算误差
|
||
|
height: 100%;
|
||
|
// height: 100vw;
|
||
|
height: calc(100% + 3px);
|
||
|
// height: calc(100vh + 2px);//清除translate带来了计算误差
|
||
|
left: 0;
|
||
|
top: 0;
|
||
|
transform: translate(100%, 0);
|
||
|
}
|
||
|
.ss-modal-top{
|
||
|
left: 50%;
|
||
|
z-index: 98;
|
||
|
width: 100%;
|
||
|
height: auto;
|
||
|
transform: translate(-50%, -100%);
|
||
|
& + .uni-mask{
|
||
|
z-index: 97;
|
||
|
}
|
||
|
}
|
||
|
.ss-modal-full{
|
||
|
width: 100%;
|
||
|
width: calc(100% + 3px);//清除translate带来了计算误差
|
||
|
left: 0;
|
||
|
transform: translate(0, -100%);
|
||
|
}
|
||
|
.ss-modal-full.ss-modal-top{
|
||
|
transform: translate(0, -200%);
|
||
|
}
|
||
|
.ss-modal-full.ss-modal-bottom{
|
||
|
transform: translate(0, 100%);
|
||
|
transition: inherit;
|
||
|
}
|
||
|
.ss-modal-right{
|
||
|
right: 0;
|
||
|
max-width: 80%;
|
||
|
}
|
||
|
.ss-modal-left{
|
||
|
left: 0;
|
||
|
max-width: 80%;
|
||
|
}
|
||
|
.ss-modal-middle.ss-modal-insert {
|
||
|
min-width: 380rpx;
|
||
|
min-height: 380rpx;
|
||
|
max-width: 102%;
|
||
|
max-height: 80%;
|
||
|
transform: translate(-50%, -50%);
|
||
|
background: none;
|
||
|
box-shadow: none;
|
||
|
}
|
||
|
.ss-modal-body{
|
||
|
opacity: 0;
|
||
|
pointer-events: none;
|
||
|
}
|
||
|
.ss-modal-active{
|
||
|
opacity: 1;
|
||
|
pointer-events: auto;
|
||
|
.ss-modal-top{
|
||
|
top: 44px;
|
||
|
transform: translate(-50%, 0);
|
||
|
}
|
||
|
.ss-modal-full{
|
||
|
transform: translate(0, -50%);
|
||
|
}
|
||
|
.ss-modal-full.ss-modal-top{
|
||
|
transform: translate(0, 0);
|
||
|
}
|
||
|
.ss-modal-bottom{
|
||
|
transform: translate(0, 0);
|
||
|
}
|
||
|
.ss-modal-cover{
|
||
|
transform: translate(0, 0);
|
||
|
}
|
||
|
}
|
||
|
.ss-modal-bottom{
|
||
|
bottom: 0;
|
||
|
}
|
||
|
</style>
|