diff --git a/static/public/css/dnfs.css b/static/public/css/dnfs.css index ca367a1..b5d379e 100644 --- a/static/public/css/dnfs.css +++ b/static/public/css/dnfs.css @@ -32,9 +32,8 @@ body::after { } /* ===== 节点卡片入场:逐张淡入(JS 动态插入时播放) ===== - * 注意:此处只能动画 opacity,不能带 transform——特效节点的全屏 iframe 是 - * position:fixed,祖先 transform 会成为 fixed 后代的包含块,把全屏特效困在卡片内 - *(in-node 特效是 relative 定位不受影响,故障表现为"部分特效不自动启动") */ + * 防御性约定:只动画 opacity、不带 transform——祖先 transform 会成为 fixed 后代的包含块。 + * 全屏特效 iframe 现已直接挂载 body(见 dnfs.js renderSpJs),不再受卡片动画影响 */ @keyframes card-in { from { opacity: 0; } to { opacity: 1; } diff --git a/static/public/js/dnfs.js b/static/public/js/dnfs.js index fc75ec5..3827657 100644 --- a/static/public/js/dnfs.js +++ b/static/public/js/dnfs.js @@ -496,8 +496,8 @@ function renderSpLink(container, sp, appendNote) { * 采用 iframe 沙箱而非注入父页面全局作用域,原因: * - 特效脚本运行在独立 iframe 内,无法访问父页面 DOM/JS,任何报错、死循环、变量覆盖 * 都不会污染父页面,从而保证"运行特效后卡片点击/节点导航依然正常"; - * - iframe 元素挂载在节点容器内部(DOM 归属该节点),但 keep 全屏 fixed 定位,视觉特效悬浮覆盖整个页面; - * pointer-events:none 不拦截父页面点击,不影响卡片点击/节点导航; + * - 全屏特效 iframe 挂载到 document.body(z-index:9999 在根层叠上下文生效, + * 不被后续卡片盖住),pointer-events:none 不拦截父页面点击,不影响卡片点击/节点导航; * - 不使用 new Function/eval(CSP 未开 unsafe-eval),srcdoc 内联脚本由 CSP 'unsafe-inline' 放行。 * 仅管理员可发布(后端强制)。 */ /* 无特效模式:true 为关闭自动执行(用户面板开关控制,localStorage 持久化) */ @@ -534,9 +534,14 @@ function renderSpJs(container, sp, appendNote) { /* 启动特效:创建隔离 iframe 沙箱,完整前端代码(含