From 1b5bd33b54f85aa080543c5b9718fac8cc7e0583 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 2 Feb 2026 12:44:52 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E9=A2=84=E8=A7=88=E5=BC=B9=E7=AA=97=E4=BD=8D=E7=BD=AE=E6=BA=A2?= =?UTF-8?q?=E5=87=BA=E8=A7=86=E5=8F=A3=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/canvas/CanvasChatPanel.tsx | 28 +++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/components/canvas/CanvasChatPanel.tsx b/components/canvas/CanvasChatPanel.tsx index fdf09fa..b562927 100644 --- a/components/canvas/CanvasChatPanel.tsx +++ b/components/canvas/CanvasChatPanel.tsx @@ -1432,28 +1432,44 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF const previewHeight = 280; // 预估高度 const padding = 16; + // 获取聊天面板的边界(弹窗应该在面板内显示) + const viewportWidth = typeof window !== 'undefined' ? window.innerWidth : 800; + const viewportHeight = typeof window !== 'undefined' ? window.innerHeight : 600; + // 水平位置:居中对齐标签,但确保不超出左右边界 let left = tagPreview.x - previewWidth / 2; + // 确保不超出左边界 if (left < padding) left = padding; - if (left + previewWidth > window.innerWidth - padding) { - left = window.innerWidth - previewWidth - padding; + // 确保不超出右边界(考虑弹窗宽度) + if (left + previewWidth > viewportWidth - padding) { + left = viewportWidth - previewWidth - padding; } - // 垂直位置:显示在标签上方 + // 垂直位置:优先显示在标签上方 let top = tagPreview.y - previewHeight - 12; + + // 如果上方空间不够(弹窗会超出顶部),显示在标签下方 if (top < padding) { - // 如果上方空间不够,显示在标签下方 top = tagPreview.y + 30; } + // 再次检查:如果下方也会超出底部,则尽量靠近底部显示 + if (top + previewHeight > viewportHeight - padding) { + top = viewportHeight - previewHeight - padding; + } + + // 最终确保 top 不为负数 + if (top < padding) top = padding; + return (
{ // 鼠标进入预览弹窗,取消隐藏