You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Next.js 14 App目录下shadcn/ui浮层组件(Tooltip/Select)始终定位在屏幕左上角的问题求助

Next.js 14 App目录下shadcn/ui浮层组件(Tooltip/Select)始终定位在屏幕左上角的问题求助

大家好,我最近在Next.js 14的App目录结构项目里使用shadcn/ui组件,遇到了一个非常头疼的定位问题——所有浮层类组件(比如Tooltip提示框、Select下拉框)都完全不跟随触发元素的位置,不管我把组件放在页面哪个区域,它们一律固定出现在屏幕的左上角。

问题详情

不管是Tooltip还是Select组件,只要是带浮层的,都出现了同样的定位偏差:

  • 示例截图:
    • Tooltip错误定位在左上角
    • Select下拉框同样偏移到左上角
    • 不同位置的组件均存在相同问题

环境版本

  • Next.js: 15+
  • React: 18+
  • shadcn/ui: 最新版本
  • Radix UI: 最新版本
  • Tailwind CSS: 4.x

已尝试的解决方法

我已经试过几种常见的修复方案,但都没有效果:

  1. 在根布局中全局引入TooltipProvider
// app/layout.tsx
export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="en">
      <body className={inter.className}>
        <TooltipProvider>
          <main>{children}</main>
          <Toaster />
        </TooltipProvider>
      </body>
    </html>
  );
}
  1. globals.css中添加定位相关的CSS修复
[data-radix-popper-content-wrapper] {
  z-index: 50;
}
body {
  position: relative;
}
  1. 重新覆盖安装最新版本的组件
npx shadcn-ui@latest add tooltip --overwrite
npx shadcn-ui@latest add select --overwrite

当前组件结构(以Tooltip为例)

下面是我使用Tooltip的具体代码结构:

<TooltipProvider>
  <Tooltip>
    <TooltipTrigger asChild>
      <Link 
        href={isDisabled ? '#' : `/tools/${tool.href}`} 
        onClick={(e) => isDisabled && e.preventDefault()} 
        className="inline-block" 
        tabIndex={-1}
      >
        <button 
          className={cn(
            'my-1.5 flex cursor-pointer items-center space-x-2 rounded-xl px-4 py-3 pr-10 text-left transition-all duration-100',
            isActive ? 'bg-pallet-primary' : 'bg-pallet-secondary',
            isDisabled && 'bg-pallet-disabled cursor-not-allowed',
          )} 
          aria-disabled={isDisabled} 
          tabIndex={isDisabled ? -1 : 0}
        >
          <Icon className="h-5 w-5 flex-shrink-0" />
          <div className="min-w-0 text-sm font-medium">{tool.name}</div>
        </button>
      </Link>
    </TooltipTrigger>
    {isDisabled && (
      <TooltipContent>
        <p>Coming soon</p>
      </TooltipContent>
    )}
  </Tooltip>
</TooltipProvider>

期望与实际结果

  • 期望:Tooltip应该根据触发按钮的位置,自动出现在按钮的上方或下方;Select下拉框应该跟随选择器的位置展开。
  • 实际:所有浮层组件都固定显示在屏幕左上角,完全不关联触发元素的位置。

有没有朋友遇到过同样的问题?想知道这个定位bug的根因是什么,以及怎么才能解决它?麻烦大家帮忙看看,谢谢啦!

火山引擎 最新活动