Forráskód Böngészése

fix(SmartDialog): 合成 resize 不再把已拖动弹窗拉回视口内

  openDialog 每次新建弹窗都会广播一次 window resize(dialogManager.js),
  而每个 SmartDialog 监听 resize 后会执行越界夹取(y + h > innerHeight 时
  y = innerHeight - h)。于是在状态监控总览页:打开路口详情窗 → 拖到底部露出
  视口 → hover 另一个路口图标新开弹窗 → 合成 resize 触发夹取,详情窗底边被
  强行吸附到浏览器窗口底边。

  _onWindowResize 增加闸门:仅当 window.innerWidth/Height 真正变化时才重算
  缩放与夹取位置;尺寸未变的合成 resize 直接跳过。真实窗口缩放行为不变;
  图表用 ResizeObserver 自适应,不受影响。
画安 1 hete%!(EXTRA string=óta)
szülő
commit
22d184fc2c
1 módosított fájl, 11 hozzáadás és 0 törlés
  1. 11 0
      src/components/ui/SmartDialog.vue

+ 11 - 0
src/components/ui/SmartDialog.vue

@@ -88,6 +88,9 @@ export default {
     this.currentScale = this.getRealScale();
     this.w = this._parseSize(this.defaultWidth, window.innerWidth);
     this.h = this._parseSize(this.defaultHeight, window.innerHeight);
+    // 记录上次窗口尺寸,用于区分"真实 resize"与"合成 resize"(如 openDialog 广播)
+    this._lastWinW = window.innerWidth;
+    this._lastWinH = window.innerHeight;
   },
   mounted() {
     window.addEventListener('resize', this._onWindowResize);
@@ -149,6 +152,14 @@ export default {
     
     _onWindowResize() {
       setTimeout(() => {
+        // 仅在窗口尺寸真正变化时才重算/夹取位置。
+        // openDialog 等会派发"合成 resize"(尺寸未变),此时不应把已被用户拖动的弹窗强行拉回视口内。
+        if (window.innerWidth === this._lastWinW && window.innerHeight === this._lastWinH) {
+          return;
+        }
+        this._lastWinW = window.innerWidth;
+        this._lastWinH = window.innerHeight;
+
         // 重新获取当前最新比例
         const newScale = this.getRealScale();
         const scaleRatio = newScale / this.currentScale;