[material-ui][Popover] Incorrect position inside CSS inline-size container

wztqucjr  于 2个月前  发布在  其他
关注(0)|答案(4)|浏览(31)

重现步骤

链接到实时示例: https://codesandbox.io/p/sandbox/mui-container-query-wtzlg5?file=%2Fsrc%2FDemo.tsx
步骤:

  1. 勾选 "禁用门户" 复选框
  2. 点击 "打开弹出窗口" 按钮

当前行为

当设置了 disablePortal 标志时,弹出窗口位置错误。

预期行为

无论设置了哪个 disablePortal 标志,弹出窗口都应该定位在同一位置。

上下文

在我们的应用程序中,有一个可重用的表单字段组件,它根据可用大小使用容器查询来实现不同的布局。一些表单字段使用 MUI Popover 组件,例如在日期输入字段中显示日历。

你的环境

npx @mui/envinfo

System:
    OS: macOS 14.3.1
  Binaries:
    Node: 19.6.0 - ~/.nvm/versions/node/v19.6.0/bin/node
    npm: 9.5.0 - ~/.nvm/versions/node/v19.6.0/bin/npm
    pnpm: 8.6.12 - ~/.nvm/versions/node/v19.6.0/bin/pnpm
  Browsers:
    Chrome: 121.0.6167.184
    Edge: Not Found
    Safari: 17.3.1```
</details>

**Search keywords**: mui popover inline size disableportal
lfapxunr

lfapxunr1#

在上面的代码沙箱示例中,您可以看到弹出窗口被容器外的顶部填充量完全偏移。由于CSS容器似乎创建了一个新的堆叠上下文,因此弹出窗口容器( .MuiPopover-root )不再覆盖整个屏幕,而只覆盖容器:

编辑:因此,这也影响了外部的点击处理程序

8yoxcaq7

8yoxcaq72#

感谢您的反馈。看起来Material UI Popover组件的位置计算没有考虑到容器的布局。如果容器的类型不是normal,那么定位应该相对于容器而不是窗口。
在未来,Popover可能会被Popup from Base UI取代,它在内部使用Floating UI,并在其计算中考虑包含块。以下是一个示例,展示了Base UI Popup如何正确处理内联大小容器的定位:https://stackblitz.com/edit/vitejs-vite-pvnhbj?file=src%2FApp.tsx
不过我会将其标记为一个bug。

gupuwyp2

gupuwyp23#

你好,
.当'禁用门户'选项未选中时,弹出窗口(simple-popover)作为我们应用程序(#root)的直接子元素和兄弟元素呈现在body中。
.当'禁用门户'选项被选中时,弹出窗口(simple-popover)紧挨着'打开弹出窗口'按钮。"
请查看附件中的图片。
这就是为什么".presentation/simple-popover"没有占据窗口的全部宽度的原因。

vfh0ocws

vfh0ocws4#

这就是为什么 ".presentation/simple-popover" 没有占据窗口的全部宽度。
即使它被渲染为子元素,它的尺寸也是 position: fixed ,并且相对于容器定位。如果没有容器,它会根据 position: fixed 相对于浏览器窗口进行定位。

相关问题