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.
141 lines
3.0 KiB
141 lines
3.0 KiB
<template> |
|
<teleport to="#app"> |
|
<div class="dialog" v-show="show" @contextmenu.prevent="console.log('禁用浏览器默认右键功能')" |
|
@click=" commit('close_equip_tip');" :style="style"> |
|
<div class="content" @click.native.stop> |
|
<div class="title" v-if="title"> |
|
<span>{{ title }}</span> |
|
</div> |
|
<slot /> |
|
<img v-if="showHeader" :src="close_icon" class="close" @click="show = false; emit('close')"></img> |
|
</div> |
|
</div> |
|
</teleport> |
|
</template> |
|
|
|
<script lang="ts" setup> |
|
import { useStore } from "vuex"; |
|
import { watch, onMounted, ref } from "vue"; |
|
import { useI18n } from "vue3-i18n"; |
|
import { close_icon } from "@/config"; |
|
|
|
const { t } = useI18n(); |
|
const { state, commit, dispatch } = useStore(); |
|
const show = ref(false); |
|
const style = ref<any>({}) |
|
|
|
const emit = defineEmits(['update:modelValue', 'close']) |
|
const prop = defineProps({ |
|
modelValue: { |
|
type: Boolean, |
|
default: false |
|
}, |
|
showHeader: { |
|
type: Boolean, |
|
default: true |
|
}, |
|
obscured: { |
|
type: Boolean, |
|
default: false |
|
}, |
|
title: { |
|
type: String, |
|
defalut: "" |
|
}, |
|
top: { |
|
type: String, |
|
default: '' |
|
}, |
|
left: { |
|
type: String, |
|
default: '' |
|
}, |
|
right: { |
|
type: String, |
|
default: '' |
|
}, |
|
bottom: { |
|
type: String, |
|
default: '' |
|
}, |
|
padding: { |
|
type: String, |
|
default: '0' |
|
}, |
|
z: { |
|
type: Number, |
|
default: 9 |
|
} |
|
}) |
|
watch(show, (n, o) => { |
|
emit('update:modelValue', n); |
|
if (!n) { |
|
commit('close_equip_tip'); |
|
} |
|
}) |
|
watch(() => prop.modelValue, (n, o) => { |
|
show.value = n; |
|
}) |
|
|
|
onMounted(() => { |
|
document.addEventListener('keydown', (e) => { |
|
if (e.keyCode == 27) { |
|
show.value = false; |
|
} |
|
}) |
|
if (prop.obscured) { |
|
style.value = { |
|
height: '100%' |
|
} |
|
} else { |
|
style.value = {}; |
|
} |
|
}); |
|
</script> |
|
<style lang="scss" scoped> |
|
.dialog { |
|
position: absolute; |
|
width: 100%; |
|
z-index: v-bind('z'); |
|
background: rgba(0, 0, 0, 0.5); |
|
|
|
.content { |
|
top: v-bind('prop.top'); |
|
left: v-bind('prop.left'); |
|
right: v-bind('prop.right'); |
|
bottom: v-bind('prop.bottom'); |
|
padding: v-bind('prop.padding'); |
|
position: absolute; |
|
border: 2px solid #fff; |
|
border-radius: 6px; |
|
box-shadow: 0 0 5px 5px rgba(0, 0, 0, 0.7); |
|
background: rgba(0, 0, 0, 0.7); |
|
|
|
} |
|
} |
|
|
|
.title { |
|
display: flex; |
|
position: relative; |
|
align-items: center; |
|
justify-content: center; |
|
font-size: 1.8rem; |
|
height: 3.5rem; |
|
line-height: 3.5rem; |
|
width: 100%; |
|
color: white; |
|
border-bottom: 1px solid #fff; |
|
|
|
} |
|
|
|
.close { |
|
cursor: pointer; |
|
position: absolute; |
|
top: 0.5rem; |
|
right: 0.5rem; |
|
display: block; |
|
width: 2rem; |
|
height: 2rem; |
|
background-size: cover; |
|
} |
|
</style> |