fix: dialog vertical alignment

This commit is contained in:
pa
2025-08-28 15:23:50 +09:00
committed by Natsumi
parent 5e4430e311
commit 75113a97d4
+9 -35
View File
@@ -5,7 +5,8 @@
v-bind="attrs" v-bind="attrs"
:close-on-click-modal="false" :close-on-click-modal="false"
@open="handleOpen" @open="handleOpen"
@close="handleClose"> @close="handleClose"
:top="marginTop">
<slot></slot> <slot></slot>
<template v-if="slots.title" #title> <template v-if="slots.title" #title>
@@ -38,6 +39,7 @@
const mouseDownOnWrapper = ref(false); const mouseDownOnWrapper = ref(false);
const styleObserver = ref(null); const styleObserver = ref(null);
const resizeObserver = ref(null); const resizeObserver = ref(null);
const marginTop = ref('5px');
let handleResize = null; let handleResize = null;
const handleOpen = () => { const handleOpen = () => {
@@ -46,7 +48,7 @@
nextTick(() => { nextTick(() => {
addWrapperListeners(); addWrapperListeners();
removeTitleAttribute(); removeTitleAttribute();
centerDialog(); adjustDialogMarginTop();
}); });
}; };
@@ -118,50 +120,22 @@
mouseDownOnWrapper.value = false; mouseDownOnWrapper.value = false;
}; };
const centerDialog = () => { const adjustDialogMarginTop = () => {
const wrapper = elDialogRef.value?.$el; const wrapper = elDialogRef.value?.$el;
if (!wrapper) return; if (!wrapper) return;
const dialog = wrapper.querySelector('.el-dialog'); const dialog = wrapper.querySelector('.el-dialog');
if (!dialog) return; if (!dialog) return;
const applyCenterStyle = () => { const applyStyle = () => {
const dialogHeight = dialog.offsetHeight; const dialogHeight = dialog.offsetHeight;
const viewportHeight = window.innerHeight; const viewportHeight = window.innerHeight;
let marginTop; const topOffset = Math.max(0, (viewportHeight - dialogHeight) * 0.2);
if (dialogHeight >= viewportHeight) { marginTop.value = `${topOffset}px`;
marginTop = '25px';
} else {
const topOffset = Math.max(0, (viewportHeight - dialogHeight) / 2);
marginTop = `${topOffset}px`;
}
dialog.style.setProperty('margin-top', marginTop, 'important');
}; };
applyCenterStyle(); applyStyle();
styleObserver.value = new MutationObserver(() => {
applyCenterStyle();
});
styleObserver.value.observe(dialog, {
attributes: true,
attributeFilter: ['style']
});
handleResize = () => {
applyCenterStyle();
};
window.addEventListener('resize', handleResize);
resizeObserver.value = new ResizeObserver(() => {
applyCenterStyle();
});
resizeObserver.value.observe(dialog);
}; };
onBeforeUnmount(() => { onBeforeUnmount(() => {