fix(modal): 修复模态框滚动和点击事件处理

为多个模态框组件添加滚动和点击事件处理,防止背景滚动时内容滚动
当点击模态框背景时关闭模态框,同时阻止事件冒泡到内容区域
This commit is contained in:
2026-04-12 21:34:51 +08:00
parent ba10f90dde
commit ca7520cb2e
5 changed files with 27 additions and 2 deletions

View File

@@ -12,6 +12,7 @@
v-bind="attrs" v-bind="attrs"
class="fixed inset-0 z-50 flex items-center justify-center overflow-hidden bg-slate-900/70 p-4" class="fixed inset-0 z-50 flex items-center justify-center overflow-hidden bg-slate-900/70 p-4"
@click.self="closeModal" @click.self="closeModal"
@wheel="onOverlayWheel"
> >
<div <div
class="modal-panel relative w-full max-w-5xl max-h-[85vh] overflow-y-auto overscroll-contain scrollbar-nowidth rounded-3xl border border-white/10 bg-white/95 px-6 pb-6 shadow-2xl dark:border-slate-800 dark:bg-slate-900" class="modal-panel relative w-full max-w-5xl max-h-[85vh] overflow-y-auto overscroll-contain scrollbar-nowidth rounded-3xl border border-white/10 bg-white/95 px-6 pb-6 shadow-2xl dark:border-slate-800 dark:bg-slate-900"
@@ -629,4 +630,10 @@ const openPreview = (index: number) => {
const hideImage = (e: Event) => { const hideImage = (e: Event) => {
(e.target as HTMLElement).style.display = "none"; (e.target as HTMLElement).style.display = "none";
}; };
const onOverlayWheel = (e: WheelEvent) => {
const target = e.target as HTMLElement;
if (target.closest(".overflow-y-auto, .overflow-auto")) return;
e.preventDefault();
};
</script> </script>

View File

@@ -49,7 +49,10 @@
leave-from-class="opacity-100 translate-y-0" leave-from-class="opacity-100 translate-y-0"
leave-to-class="opacity-0 -translate-y-2" leave-to-class="opacity-0 -translate-y-2"
> >
<div v-show="isExpanded" class="max-h-96 overflow-y-auto overscroll-contain px-3 pb-4"> <div
v-show="isExpanded"
class="max-h-96 overflow-y-auto overscroll-contain px-3 pb-4"
>
<div <div
v-if="downloads.length === 0" v-if="downloads.length === 0"
class="flex flex-col items-center justify-center rounded-2xl border border-dashed border-slate-200/80 px-4 py-12 text-slate-500 dark:border-slate-800/80 dark:text-slate-400" class="flex flex-col items-center justify-center rounded-2xl border border-dashed border-slate-200/80 px-4 py-12 text-slate-500 dark:border-slate-800/80 dark:text-slate-400"

View File

@@ -11,6 +11,7 @@
v-if="show" v-if="show"
class="fixed inset-0 z-50 flex items-start justify-center bg-slate-900/70 px-4 py-10" class="fixed inset-0 z-50 flex items-start justify-center bg-slate-900/70 px-4 py-10"
@click.self="$emit('close')" @click.self="$emit('close')"
@wheel="onOverlayWheel"
> >
<div <div
class="flex w-full max-w-4xl max-h-[85vh] flex-col rounded-3xl border border-white/10 bg-white/95 shadow-2xl dark:border-slate-800 dark:bg-slate-900" class="flex w-full max-w-4xl max-h-[85vh] flex-col rounded-3xl border border-white/10 bg-white/95 shadow-2xl dark:border-slate-800 dark:bg-slate-900"
@@ -193,4 +194,10 @@ defineEmits<{
(e: "uninstall", app: App): void; (e: "uninstall", app: App): void;
(e: "switch-origin", origin: "apm" | "spark"): void; (e: "switch-origin", origin: "apm" | "spark"): void;
}>(); }>();
const onOverlayWheel = (e: WheelEvent) => {
const target = e.target as HTMLElement;
if (target.closest(".overflow-y-auto, .overflow-auto")) return;
e.preventDefault();
};
</script> </script>

View File

@@ -11,9 +11,11 @@
v-if="show" v-if="show"
class="fixed inset-0 z-50 flex items-start justify-center bg-slate-900/70 px-4 py-6 lg:py-10" class="fixed inset-0 z-50 flex items-start justify-center bg-slate-900/70 px-4 py-6 lg:py-10"
@wheel="onOverlayWheel" @wheel="onOverlayWheel"
@click="onOverlayClick"
> >
<div <div
class="flex max-h-[90vh] w-full max-w-6xl flex-col overflow-hidden rounded-3xl border border-white/10 bg-white/95 shadow-2xl dark:border-slate-800 dark:bg-slate-900" class="flex max-h-[90vh] w-full max-w-6xl flex-col overflow-hidden rounded-3xl border border-white/10 bg-white/95 shadow-2xl dark:border-slate-800 dark:bg-slate-900"
@click.stop
> >
<UpdateCenterToolbar <UpdateCenterToolbar
:search-query="store.searchQuery.value" :search-query="store.searchQuery.value"
@@ -85,4 +87,8 @@ const onOverlayWheel = (e: WheelEvent) => {
if (target.closest(".overflow-y-auto, .overflow-auto")) return; if (target.closest(".overflow-y-auto, .overflow-auto")) return;
e.preventDefault(); e.preventDefault();
}; };
const onOverlayClick = () => {
props.store.requestClose();
};
</script> </script>

View File

@@ -10,7 +10,9 @@
>{{ tasks.length }} </span >{{ tasks.length }} </span
> >
</div> </div>
<div class="mt-4 min-h-0 flex-1 space-y-4 overflow-y-auto overscroll-contain"> <div
class="mt-4 min-h-0 flex-1 space-y-4 overflow-y-auto overscroll-contain"
>
<div <div
v-if="tasks.length === 0" v-if="tasks.length === 0"
class="rounded-2xl border border-dashed border-slate-200/80 px-4 py-8 text-center text-sm text-slate-500 dark:border-slate-800/80 dark:text-slate-400" class="rounded-2xl border border-dashed border-slate-200/80 px-4 py-8 text-center text-sm text-slate-500 dark:border-slate-800/80 dark:text-slate-400"