You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js中TailwindCSS使用group和group-focus实现下拉功能不生效

你使用的group-focus监听的是父级.group元素自身的focus状态,但父级是普通div,默认无法获得焦点,点击按钮时只有按钮自身会触发focus,父元素不会进入focus状态,因此group-focus:visible始终不会生效。

方法1:使用group-focus-within实现(推荐)

适配你现有的group写法,只需两步修改:

  1. 调整next.config.js的variants配置,为visibility新增group-focus-within变体:
module.exports = {
  // 其余原有配置保持不变
  variants: {
    extend: {
      backgroundColor: ['group-focus'],
      visibility: ['hover', 'focus', 'group-focus', 'group-focus-within'],
    },
  },
  plugins: [],
}
  1. 修改组件代码,替换ul的状态触发类:
<div className="group">
    <button className="pointer-events-auto">Ingredients</button>
       <ul className="invisible group-focus-within:visible grid sm:grid-cols-3 text-justify sm:text-sm text-xs grid-cols-2 gap-x-3 gap-y-1 list-decimal list-inside">
           {menu.ingredients.map(item => <li key={item}>{ item }</li>)}
       </ul>
</div>

:focus-within会在容器内部任意元素获得焦点时触发,完全符合下拉菜单的交互逻辑,点击页面其他区域失去焦点后内容会自动隐藏。

方法2:使用peer类实现兄弟元素状态关联

无需修改配置,直接调整组件代码即可:

<div>
    <button className="pointer-events-auto peer">Ingredients</button>
       <ul className="invisible peer-focus:visible grid sm:grid-cols-3 text-justify sm:text-sm text-xs grid-cols-2 gap-x-3 gap-y-1 list-decimal list-inside">
           {menu.ingredients.map(item => <li key={item}>{ item }</li>)}
       </ul>
</div>

给按钮添加peer类后,后续兄弟元素可以直接通过peer-focus:前缀监听按钮的focus状态,直接满足点击按钮展示内容的需求。

补充说明

如果你使用的是Tailwind v3及以上版本,默认已支持所有变体的任意组合,不需要额外在配置里扩展variants,直接写对应的类名即可生效,可以删掉相关冗余配置。

内容的提问来源于stack exchange,提问作者forest

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 10:45:04