diff --git a/assets/css/routes/user-center/credits.css b/assets/css/routes/user-center/credits.css index 5a233fc5..60ac09cd 100644 --- a/assets/css/routes/user-center/credits.css +++ b/assets/css/routes/user-center/credits.css @@ -179,6 +179,17 @@ display: flex; } +/* 购买积分弹窗壳与充值弹窗同构(服务端静态输出 .modal.flex.jc.fade), + 静止态同样必须显式隐藏,否则 .flex 工具类会使其铺满全屏形成隐形遮罩, + 拦截整页点击(2026-09-18 实测回归)。打开态由 initPointsPay 的内联 + display:flex 驱动,关闭撤除内联样式后即回到隐藏规则。 */ +.modal[data-aksrt-points-pay-modal] { + display: none; +} +.modal[data-aksrt-points-pay-modal].in { + display: flex; +} + .balance-charge-form .zib-widget { clear: both; background-color: var(--main-bg-color); diff --git a/tests/widget-system/balance-charge-modal.test.cjs b/tests/widget-system/balance-charge-modal.test.cjs index 0896f389..3b94b7c8 100644 --- a/tests/widget-system/balance-charge-modal.test.cjs +++ b/tests/widget-system/balance-charge-modal.test.cjs @@ -43,6 +43,12 @@ test('弹窗壳静止态必须被 credits.css 显式隐藏(.flex 覆盖回归 // .flex.jc 双轴居中(Zibll 生产环境即此形态)。 assert.match(creditsCss, /\.modal\[data-aksrt-charge-modal\]\.in\s*\{\s*display:\s*flex;/); assert.doesNotMatch(creditsCss, /\.modal\[data-aksrt-charge-modal\]\.in\s*\{\s*display:\s*block;/); + // 购买积分弹窗壳同构(服务端静态输出 .modal.flex.jc.fade),静止态同样 + // 必须显式隐藏,否则隐形遮罩拦截整页点击(2026-09-18 实测回归)。 + const balance = read('inc', 'helpers', 'user-center-renderers', 'credits-balance.php'); + assert.match(balance, /class="modal flex jc fade"[^>]*data-aksrt-points-pay-modal/); + assert.match(creditsCss, /\.modal\[data-aksrt-points-pay-modal\]\s*\{\s*display:\s*none;/); + assert.match(creditsCss, /\.modal\[data-aksrt-points-pay-modal\]\.in\s*\{\s*display:\s*flex;/); }); test('开关自包含:不依赖 jQuery/Bootstrap modal 运行时', () => {