弹窗挪到 body 下之后宽度撑满整屏,scoped 样式全失效,控制台不报错,Elements 里能看到 data-v 属性但对应规则没匹配上,整个弹窗像没写样式一样。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
<Teleport to='body'> <div class='modal'>...</div> </Teleport>
节点被 Teleport 移到 body 外,父级 scoped 选择器依赖的祖先上下文断了,靠继承拿到的样式也跟着丢,看着就像样式没加载,和样式加载顺序无关。这一点先确认清楚,后面就不用反复试。
「Teleport 样式作用域」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
改完隔一天再看一次,当场正常不代表能稳住。
具体做法是,弹窗根节点写完整样式,不依赖父级选择器和继承;需要穿透时用 :global 单独放到样式文件里,别写在 scoped 中;主题变量统一挂到 body 或者根节点上再取,别指望自动继承。
改完照着核一遍,弹窗渲染在 body 末尾,尺寸和配色与组件内保持一致,关闭后也不影响页面布局。
