- 核心代碼(復(fù)制就可以使用了)
<template>
<div :style="popupStyle">
<div ref="dialogEl" class="popup" :style="{ left: ml, top: mt }">
<div class="popup-tit" @mousedown="mouseDown">
<div class="txt">{{ title }}</div>
<div class="close" title="關(guān)閉" @click="close">X</div>
</div>
<div class="popup-content">
<slot></slot>
</div>
</div>
</div>
</template>
<script setup>
import { computed, ref } from 'vue';
const { width, height, title } = defineProps({
width: {
type: String,
default: '623px',
},
height: {
type: String,
default: '379px',
},
title: {
type: String,
default: '',
},
});
const emit = defineEmits(['close']);
const ml = ref('50%');
const mt = ref('50%');
const dialogEl = ref();
const dialogB = ref(false);
const size = computed(() => {
let k = '',
j = '';
if (width.includes('rem')) {
k = 'rem';
} else if (width.includes('px')) {
k = 'px';
} else if (width.includes('vw')) {
k = 'vw';
}
if (height.includes('rem')) {
j = 'rem';
} else if (height.includes('px')) {
j = 'px';
} else if (height.includes('vw')) {
j = 'vw';
}
return {
w: width.split(k)[0],
h: height.split(j)[0],
j,
k,
};
});
const popupStyle = computed(() => {
const baseTitH = 65 / 390;
return `--Tw:${width};--Th:${height};--titH:${baseTitH * size.value.h}${size.value.j};`;
});
const mouseDown = (e) => {
let windowH = window.innerHeight; //獲取瀏覽器的可用高度
// let windowW = window.innerWidth;//獲取瀏覽器的可用寬度
let el = dialogEl.value; //獲取需要拖拽移動(dòng)的容器
var disX = e.clientX - el.offsetLeft;
var disY = e.clientY - el.offsetTop;
dialogB.value = true;
document.onselectstart = function () {
return false;
};
document.onmousemove = (e) => {
if (!dialogB.value) return false;
let left = e.clientX - disX;
let top = e.clientY - disY;
if (top < 0 || top > windowH - 40) return false; //當(dāng)?shù)竭_(dá)頂部或者底部時(shí)就不讓繼續(xù)拖動(dòng)了
ml.value = left + 'px';
mt.value = top + 'px';
};
document.onmouseup = () => {
if (dialogB.value) {
dialogB.value = false;
}
};
};
// 關(guān)閉
const close = () => {
emit('close');
};
</script>
<style scoped lang="scss">
.popup {
position: absolute;
z-index: 100;
display: flex;
flex-direction: column;
width: var(--Tw);
height: var(--Th);
padding: 5px 15px 15px 15px;
background-image: url('../assets/images/icon/彈窗1.png');
background-repeat: no-repeat;
background-size: 100% 100%;
transform: translateX(-50%) translateY(-50%);
.popup-tit {
position: relative;
display: flex;
box-sizing: border-box;
width: 100%;
height: var(--titH);
padding-left: 40px;
color: #fff;
font-size: 20px;
line-height: var(--titH);
cursor: all-scroll;
.close {
position: absolute;
right: 20px;
cursor: pointer;
}
}
.popup-content {
flex: auto;
// background-color: #fff;
}
}
</style>
- 使用方式
<script setup>
import TPopUp from '@/common/TPopUp.vue';
</script>
<template>
<TPopUp width="743px" height="469px" title="碳儲(chǔ)量計(jì)算" @close="popVis=false">
<div class="box">
<div class="forms">
<div class="form-item">
<div class="lab">地上生物量:</div>
<div class="numbers">1</div>
<div class="numbers">2</div>
<div class="numbers">3</div>
<div class="numbers">4</div>
</div>
<div class="form-item">
<div class="lab">地下生物量:</div>
<div class="numbers">1</div>
<div class="numbers">2</div>
<div class="numbers">3</div>
<div class="numbers">4</div>
</div>
<div class="form-item">
<div class="lab">枯死木:</div>
<div class="numbers">1</div>
<div class="numbers">2</div>
<div class="numbers">3</div>
<div class="numbers">4</div>
</div>
<div class="form-item">
<div class="lab">枯落物:</div>
<div class="numbers">1</div>
<div class="numbers">2</div>
<div class="numbers">3</div>
<div class="numbers">4</div>
</div>
<div class="form-item">
<div class="lab">土壤有機(jī)質(zhì):</div>
<div class="numbers">1</div>
<div class="numbers">2</div>
<div class="numbers">3</div>
<div class="numbers">4</div>
</div>
</div>
</div>
</TPopUp>
</template>
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-805100.html
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-805100.html
到了這里,關(guān)于Vue3封裝可拖拽的彈窗的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!